-C Baseline\sinterface\sdefinition\sfor\sthe\sexperimental\ssqlite3_kv\saccessor\sobject.
-D 2017-01-18T17:20:33.979
+C Begin\sfleshing\sout\sthe\skey/value\saccessor\simplementation.\s\sThis\sis\san\nincremental\scheck-in.
+D 2017-01-18T19:54:07.280
F Makefile.in 78688a52015911e4b841b265c5fef09fbf81e655
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 836dde6df991bd855e93db1721f9347678cb9cda
F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
F src/insert.c 05e47e2de7b712a3a4148cd469e5f60873f5ef13
-F src/kvapi.c 3562e46e834d5b4f4aeb00f00c37d63eeea4af3e
+F src/kvapi.c d6d96b6b379824c59752c8f010a0c2451b09726b
F src/legacy.c 75d3023be8f0d2b99d60f905090341a03358c58e
F src/loadext.c 5d6642d141c07d366e43d359e94ec9de47add41d
F src/main.c e207b81542d13b9f13d61e78ca441f9781f055b0
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
F src/select.c 3856db523b942062bca8722ba03b61c324ff94d6
F src/shell.c 6095531aa900decdaa765e0f3993fba7153c92c1
-F src/sqlite.h.in ba4a6ea9c93071e24579805bd8a2218a939a36da
+F src/sqlite.h.in 746b620b79d80b806bfaa5352b72e3e290947bcd
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 8648034aa702469afb553231677306cc6492a1ae
F src/sqliteInt.h ce3e07c720b0cebc8887ea86b3b128da0913c5d3
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 681d96eb822e606da53700867191d4738bda20c8
-R 6e440b2267c2c9d7235eb3ac1bb470a2
-T *branch * sqlite3_kv
-T *sym-sqlite3_kv *
-T -sym-trunk *
+P a435841e71deecb374c7b667f8d52e82603177ae
+R 7566de8f7ffe2c31b7ee390fe331ce1f
U drh
-Z 1d83426f401ae270d7359f563a790e16
+Z 5e43af2e63c3c36926d3940913a94ce6
-a435841e71deecb374c7b667f8d52e82603177ae
\ No newline at end of file
+02d60e196fe2a07ef90a5cfad0daa46020bfd06e
\ No newline at end of file
sqlite3_int64 iRowid; /* Current rowid */
};
+/*
+** Create a new sqlite3_kv object open on zDb.zTable and return
+** a pointer to that object.
+*/
int sqlite3_kv_open(
- sqlite3 *db,
- const char *zDb,
- const char *zTable,
+ sqlite3 *db, /* The database connection */
+ const char *zDb, /* Schema containing zTable. NULL for "main" */
+ const char *zTable, /* Name of table the key/value table */
unsigned int flags, /* Must be zero. Reserved for future expansion. */
- sqlite3_kv *pKvOut
+ sqlite3_kv **ppKvOut /* Store the new sqlite3_kv object here */
){
- return SQLITE_MISUSE;
+ sqlite3_kv *pKv;
+ Table *pTab;
+ int rc = SQLITE_ERROR;
+
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( ppKvOut==0 ){
+ return SQLITE_MISUSE_BKPT;
+ }
+#endif
+ *ppKvOut = 0;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db) || zTable==0 ){
+ return SQLITE_MISUSE_BKPT;
+ }
+#endif
+ sqlite3_mutex_enter(db->mutex);
+ sqlite3BtreeEnterAll(db);
+
+ pTab = sqlite3FindTable(db, zTable, zDb);
+ if( pTab==0 ){
+ goto kv_open_done;
+ }
+ if( !((pTab->nCol==1 && pTab->iPKey<0)
+ || (pTab->nCol==2 && pTab->iPKey==0))
+ ){
+ /* Must be an single-column table without an INTEGER PRIMARY KEY,
+ ** or a two-column table where the first column is the INTEGER PRIMARY KEY
+ */
+ goto kv_open_done;
+ }
+ if( pTab->pIndex!=0 || pTab->pFKey!=0 || pTab->pCheck!=0 ){
+ /* Do not allow secondary indexes, foreign keys, or CHECK constraints */
+ goto kv_open_done;
+ }
+ if( pTab->tabFlags & (TF_Autoincrement|TF_Virtual|TF_WithoutRowid) ){
+ /* Must not have autoincrement. Must not be a virtual table or a
+ ** without rowid table */
+ goto kv_open_done;
+ }
+ *ppKvOut = pKv = sqlite3_malloc(sizeof(*pKv));
+ if( pKv==0 ){
+ rc = SQLITE_NOMEM;
+ goto kv_open_done;
+ }
+ pKv->db = db;
+ rc = SQLITE_OK;
+
+kv_open_done:
+ sqlite3BtreeLeaveAll(db);
+ sqlite3_mutex_leave(db->mutex);
+ return rc;
}
+/*
+** Free the key/value accessor at pKv
+*/
int sqlite3_kv_close(sqlite3_kv *pKv){
+ sqlite3_free(pKv);
return SQLITE_OK;
}
const char *zDb,
const char *zTable,
unsigned int flags, /* Must be zero. Reserved for future expansion. */
- sqlite3_kv *pKvOut
+ sqlite3_kv **ppKvOut
);
/*