summaryrefslogtreecommitdiff
path: root/lang/tcl/tcl_dbcursor.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2015-02-17 17:25:57 +0000
committer <>2015-03-17 16:26:24 +0000
commit780b92ada9afcf1d58085a83a0b9e6bc982203d1 (patch)
tree598f8b9fa431b228d29897e798de4ac0c1d3d970 /lang/tcl/tcl_dbcursor.c
parent7a2660ba9cc2dc03a69ddfcfd95369395cc87444 (diff)
downloadberkeleydb-master.tar.gz
Imported from /home/lorry/working-area/delta_berkeleydb/db-6.1.23.tar.gz.HEADdb-6.1.23master
Diffstat (limited to 'lang/tcl/tcl_dbcursor.c')
-rw-r--r--lang/tcl/tcl_dbcursor.c108
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);
+}
+