]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Begin fleshing out the key/value accessor implementation. This is an
authordrh <drh@noemail.net>
Wed, 18 Jan 2017 19:54:07 +0000 (19:54 +0000)
committerdrh <drh@noemail.net>
Wed, 18 Jan 2017 19:54:07 +0000 (19:54 +0000)
incremental check-in.

FossilOrigin-Name: 02d60e196fe2a07ef90a5cfad0daa46020bfd06e

manifest
manifest.uuid
src/kvapi.c
src/sqlite.h.in

index b88e69407a4689847eca02063b91e5f73fe12f2a..3afc7ce9bb7d7e01f57f1267507c187129d5cd18 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-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
@@ -353,7 +353,7 @@ F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4
 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
@@ -393,7 +393,7 @@ F src/resolve.c bb070cf5f23611c44ab7e4788803684e385fc3fb
 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
@@ -1548,10 +1548,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 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
index b7881d193f48cf403a3fb621848b75d83840f05b..2458d79e55aed595dfc4ef8396c77aaaec547ff1 100644 (file)
@@ -1 +1 @@
-a435841e71deecb374c7b667f8d52e82603177ae
\ No newline at end of file
+02d60e196fe2a07ef90a5cfad0daa46020bfd06e
\ No newline at end of file
index 671ac6c937bb0babff57107ff9207303dc491237..9d719b08c7e4d682d547ee3e9c5cedeb31ec7879 100644 (file)
@@ -32,17 +32,75 @@ struct sqlite3_kv {
   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;
 }
 
index f8e67ec63593e90e1c97c81ae1fd6cc72666b9e1..89d163ab41e8d61b41a435cceede2590e26d49ed 100644 (file)
@@ -8476,7 +8476,7 @@ int sqlite3_kv_open(
   const char *zDb,
   const char *zTable,
   unsigned int flags,   /* Must be zero.  Reserved for future expansion. */
-  sqlite3_kv *pKvOut
+  sqlite3_kv **ppKvOut
 );
 
 /*