diff options
| author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2015-02-17 17:25:57 +0000 |
|---|---|---|
| committer | <> | 2015-03-17 16:26:24 +0000 |
| commit | 780b92ada9afcf1d58085a83a0b9e6bc982203d1 (patch) | |
| tree | 598f8b9fa431b228d29897e798de4ac0c1d3d970 /lang/tcl/tcl_dbcursor.c | |
| parent | 7a2660ba9cc2dc03a69ddfcfd95369395cc87444 (diff) | |
| download | berkeleydb-master.tar.gz | |
Diffstat (limited to 'lang/tcl/tcl_dbcursor.c')
| -rw-r--r-- | lang/tcl/tcl_dbcursor.c | 108 |
1 files changed, 106 insertions, 2 deletions
diff --git a/lang/tcl/tcl_dbcursor.c b/lang/tcl/tcl_dbcursor.c index a6df38dc..ebf0eaa9 100644 --- a/lang/tcl/tcl_dbcursor.c +++ b/lang/tcl/tcl_dbcursor.c @@ -1,7 +1,7 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1999, 2012 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2015 Oracle and/or its affiliates. All rights reserved. * * $Id$ */ @@ -17,6 +17,8 @@ /* * Prototypes for procedures defined later in this file: */ +static int tcl_DbcDbstream __P((Tcl_Interp *, + int, Tcl_Obj * CONST*, DBC *, DB_STREAM **)); static int tcl_DbcDel __P((Tcl_Interp *, int, Tcl_Obj * CONST*, DBC *)); static int tcl_DbcDup __P((Tcl_Interp *, int, Tcl_Obj * CONST*, DBC *)); static int tcl_DbcCompare __P((Tcl_Interp *, int, Tcl_Obj * CONST*, DBC *)); @@ -43,6 +45,7 @@ dbc_Cmd(clientData, interp, objc, objv) #endif "close", "cmp", + "dbstream", "del", "dup", "get", @@ -55,18 +58,24 @@ dbc_Cmd(clientData, interp, objc, objv) #endif DBCCLOSE, DBCCOMPARE, + DBCDBSTREAM, DBCDELETE, DBCDUP, DBCGET, DBCPUT }; DBC *dbc; - DBTCL_INFO *dbip; + DB_STREAM *dbs; + DBTCL_INFO *dbip, *ip; + Tcl_Obj *res; + char newname[MSG_SIZE]; int cmdindex, result, ret; Tcl_ResetResult(interp); dbc = (DBC *)clientData; dbip = _PtrToInfo((void *)dbc); + res = NULL; + memset(newname, 0, MSG_SIZE); result = TCL_OK; if (objc <= 1) { @@ -120,6 +129,28 @@ dbc_Cmd(clientData, interp, objc, objv) _debug_check(); result = tcl_DbcCompare(interp, objc, objv, dbc); break; + case DBCDBSTREAM: + snprintf(newname, sizeof(newname), + "%s.dbs%d", dbip->i_name, dbip->i_dbcdbsid); + ip = _NewInfo(interp, NULL, newname, I_DBSTREAM); + if (ip != NULL) { + result = tcl_DbcDbstream(interp, objc, objv, dbc, &dbs); + if (result == TCL_OK) { + dbip->i_dbcdbsid++; + ip->i_parent = dbip; + (void)Tcl_CreateObjCommand(interp, newname, + (Tcl_ObjCmdProc *)dbstream_Cmd, + (ClientData)dbs, NULL); + res = NewStringObj(newname, strlen(newname)); + _SetInfoData(ip, dbs); + } else + _DeleteInfo(ip); + } else { + Tcl_SetResult(interp, + "Could not set up info", TCL_STATIC); + result = TCL_ERROR; + } + break; case DBCDELETE: result = tcl_DbcDel(interp, objc, objv, dbc); break; @@ -133,6 +164,13 @@ dbc_Cmd(clientData, interp, objc, objv) result = tcl_DbcPut(interp, objc, objv, dbc); break; } + + /* + * Only set result if we have a res. Otherwise, lower + * functions have already done so. + */ + if (result == TCL_OK && res) + Tcl_SetObjResult(interp, res); return (result); } @@ -200,6 +238,7 @@ tcl_DbcPut(interp, objc, objv, dbc) #endif "-after", "-before", + "-blob", "-current", "-keyfirst", "-keylast", @@ -213,6 +252,7 @@ tcl_DbcPut(interp, objc, objv, dbc) #endif DBCPUT_AFTER, DBCPUT_BEFORE, + DBCPUT_BLOB, DBCPUT_CURRENT, DBCPUT_KEYFIRST, DBCPUT_KEYLAST, @@ -281,6 +321,9 @@ tcl_DbcPut(interp, objc, objv, dbc) FLAG_CHECK(flag); flag = DB_BEFORE; break; + case DBCPUT_BLOB: + data.flags |= DB_DBT_BLOB; + break; case DBCPUT_CURRENT: FLAG_CHECK(flag); flag = DB_CURRENT; @@ -990,6 +1033,11 @@ tcl_DbcGet(interp, objc, objv, dbc, ispget) hkey.data = &rid; hkey.ulen = hkey.size = data.size; hkey.flags = DB_DBT_USERMEM; + if (data.data != NULL && + F_ISSET(&data, DB_DBT_MALLOC)) { + __os_ufree(dbc->env, data.data); + data.data = NULL; + } ret = phsdbp->pget(phsdbp, dbc->txn, &hkey, &data, &tmpdata, 0); } @@ -1336,3 +1384,59 @@ tcl_DbcDel(interp, objc, objv, dbc) out: return (result); } + +/* + * tcl_DbcDbstream -- + */ +static int +tcl_DbcDbstream(interp, objc, objv, dbc, dbsp) + Tcl_Interp *interp; /* Interpreter */ + int objc; /* How many arguments? */ + Tcl_Obj *CONST objv[]; /* The argument objects */ + DBC *dbc; /* Cursor pointer */ + DB_STREAM **dbsp; /* Return database stream pointer */ +{ + static const char *dbstreamopts[] = { + "-rdonly", + "-sync", + NULL + }; + enum dbstreamopts { + DBSTREAM_READ_ONLY, + DBSTREAM_SYNC + }; + u_int32_t flag; + int i, optindex, result, ret; + + result = TCL_OK; + flag = 0; + i = 2; + while (i < objc) { + if (Tcl_GetIndexFromObj(interp, objv[i], dbstreamopts, + "option", TCL_EXACT, &optindex) != TCL_OK) { + result = IS_HELP(objv[i]); + goto out; + } + i++; + switch ((enum dbstreamopts)optindex) { + case DBSTREAM_READ_ONLY: + flag |= DB_STREAM_READ; + break; + case DBSTREAM_SYNC: + flag |= DB_STREAM_SYNC_WRITE; + break; + } + if (result != TCL_OK) + break; + } + if (result != TCL_OK) + goto out; + + _debug_check(); + ret = dbc->db_stream(dbc, dbsp, flag); + if (ret != 0) + result = _ErrorSetup(interp, ret, "dbc db_stream"); +out: + return (result); +} + |
