/ Hex Artifact Content
Login

Artifact 8733eee249b12956a9df8322994b43d19bd8c02ad2e8b0bb5164db4d6ccc1735:


0000: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ./*.** This file
0010: 20 69 73 20 74 68 65 20 69 6e 74 65 72 66 61 63   is the interfac
0020: 65 20 74 6f 20 61 20 76 65 72 79 20 73 69 6d 70  e to a very simp
0030: 6c 65 20 64 61 74 61 62 61 73 65 20 6c 69 62 72  le database libr
0040: 61 72 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ary used for.** 
0050: 74 65 73 74 69 6e 67 2e 20 54 68 65 20 69 6e 74  testing. The int
0060: 65 72 66 61 63 65 20 69 73 20 73 69 6d 69 6c 61  erface is simila
0070: 72 20 74 6f 20 74 68 61 74 20 6f 66 20 74 68 65  r to that of the
0080: 20 4c 53 4d 2e 20 54 68 65 20 6d 61 69 6e 20 76   LSM. The main v
0090: 69 72 74 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69  irtue .** of thi
00a0: 73 20 6c 69 62 72 61 72 79 20 69 73 20 74 68 61  s library is tha
00b0: 74 20 74 68 65 20 73 61 6d 65 20 41 50 49 20 6d  t the same API m
00c0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  ay be used to ac
00d0: 63 65 73 73 20 61 20 6b 65 79 2d 76 61 6c 75 65  cess a key-value
00e0: 0a 2a 2a 20 73 74 6f 72 65 20 69 6d 70 6c 65 6d  .** store implem
00f0: 65 6e 74 65 64 20 62 79 20 4c 53 4d 2c 20 53 51  ented by LSM, SQ
0100: 4c 69 74 65 20 6f 72 20 61 6e 6f 74 68 65 72 20  Lite or another 
0110: 64 61 74 61 62 61 73 65 20 73 79 73 74 65 6d 2e  database system.
0120: 20 57 68 69 63 68 20 0a 2a 2a 20 6d 61 6b 65 73   Which .** makes
0130: 20 69 74 20 65 61 73 79 20 74 6f 20 75 73 65 20   it easy to use 
0140: 66 6f 72 20 63 6f 72 72 65 63 74 6e 65 73 73 20  for correctness 
0150: 61 6e 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  and performance 
0160: 74 65 73 74 73 2e 0a 2a 2f 0a 0a 23 69 66 6e 64  tests..*/..#ifnd
0170: 65 66 20 5f 5f 57 52 41 50 50 45 52 5f 48 5f 0a  ef __WRAPPER_H_.
0180: 23 64 65 66 69 6e 65 20 5f 5f 57 52 41 50 50 45  #define __WRAPPE
0190: 52 5f 48 5f 0a 0a 23 69 66 64 65 66 20 5f 5f 63  R_H_..#ifdef __c
01a0: 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20  plusplus.extern 
01b0: 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 0a 23 69  "C" {.#endif..#i
01c0: 6e 63 6c 75 64 65 20 22 6c 73 6d 2e 68 22 0a 0a  nclude "lsm.h"..
01d0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54  typedef struct T
01e0: 65 73 74 44 62 20 54 65 73 74 44 62 3b 0a 0a 2f  estDb TestDb;../
01f0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
0200: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0210: 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20 61  ion. The first a
0220: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
0230: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
0240: 74 61 62 61 73 65 20 6c 69 62 72 61 72 79 20 74  tabase library t
0250: 6f 20 75 73 65 2e 20 65 2e 67 2e 20 73 6f 6d 65  o use. e.g. some
0260: 74 68 69 6e 67 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a  thing like:.**.*
0270: 2a 20 20 20 20 20 22 73 71 6c 69 74 65 33 22 0a  *     "sqlite3".
0280: 2a 2a 20 20 20 20 20 22 6c 73 6d 22 0a 2a 2a 0a  **     "lsm".**.
0290: 2a 2a 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 20  ** See function 
02a0: 74 64 62 5f 73 79 73 74 65 6d 5f 6e 61 6d 65 28  tdb_system_name(
02b0: 29 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 66 20  ) for a list of 
02c0: 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61  available databa
02d0: 73 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a  se systems..**.*
02e0: 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
02f0: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
0300: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
0310: 65 20 74 6f 20 6f 70 65 6e 20 28 65 2e 67 2e 20  e to open (e.g. 
0320: 61 20 66 69 6c 65 6e 61 6d 65 29 2e 0a 2a 2a 0a  a filename)..**.
0330: 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20  ** If the third 
0340: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
0350: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
0360: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
0370: 65 20 62 79 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  e by the.** name
0380: 20 6f 66 20 7a 44 62 20 69 73 20 72 65 6d 6f 76   of zDb is remov
0390: 65 64 20 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e  ed before openin
03a0: 67 20 61 20 6e 65 77 20 6f 6e 65 2e 20 49 66 20  g a new one. If 
03b0: 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  it is zero, then
03c0: 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
03d0: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
03e0: 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 74  opened..*/.int t
03f0: 64 62 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  db_open(const ch
0400: 61 72 20 2a 7a 4c 69 62 72 61 72 79 2c 20 63 6f  ar *zLibrary, co
0410: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 69  nst char *zDb, i
0420: 6e 74 20 62 43 6c 65 61 72 2c 20 54 65 73 74 44  nt bClear, TestD
0430: 62 20 2a 2a 70 70 44 62 29 3b 0a 0a 2f 2a 0a 2a  b **ppDb);../*.*
0440: 2a 20 43 6c 6f 73 65 20 61 20 64 61 74 61 62 61  * Close a databa
0450: 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
0460: 74 20 74 64 62 5f 63 6c 6f 73 65 28 54 65 73 74  t tdb_close(Test
0470: 44 62 20 2a 70 44 62 29 3b 0a 0a 2f 2a 0a 2a 2a  Db *pDb);../*.**
0480: 20 57 72 69 74 65 20 61 20 6e 65 77 20 6b 65 79   Write a new key
0490: 2f 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20  /value into the 
04a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
04b0: 20 74 64 62 5f 77 72 69 74 65 28 54 65 73 74 44   tdb_write(TestD
04c0: 62 20 2a 70 44 62 2c 20 76 6f 69 64 20 2a 70 4b  b *pDb, void *pK
04d0: 65 79 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 76 6f  ey, int nKey, vo
04e0: 69 64 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6e 56  id *pVal, int nV
04f0: 61 6c 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  al);../*.** Dele
0500: 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  te a key from th
0510: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  e database..*/.i
0520: 6e 74 20 74 64 62 5f 64 65 6c 65 74 65 28 54 65  nt tdb_delete(Te
0530: 73 74 44 62 20 2a 70 44 62 2c 20 76 6f 69 64 20  stDb *pDb, void 
0540: 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 29  *pKey, int nKey)
0550: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
0560: 61 20 72 61 6e 67 65 20 6f 66 20 6b 65 79 73 20  a range of keys 
0570: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
0580: 65 2e 0a 2a 2f 0a 69 6e 74 20 74 64 62 5f 64 65  e..*/.int tdb_de
0590: 6c 65 74 65 5f 72 61 6e 67 65 28 54 65 73 74 44  lete_range(TestD
05a0: 62 20 2a 2c 20 76 6f 69 64 20 2a 70 4b 65 79 31  b *, void *pKey1
05b0: 2c 20 69 6e 74 20 6e 4b 65 79 31 2c 20 76 6f 69  , int nKey1, voi
05c0: 64 20 2a 70 4b 65 79 32 2c 20 69 6e 74 20 6e 4b  d *pKey2, int nK
05d0: 65 79 32 29 3b 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  ey2);../*.** Que
05e0: 72 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ry the database 
05f0: 66 6f 72 20 6b 65 79 20 28 70 4b 65 79 2f 6e 4b  for key (pKey/nK
0600: 65 79 29 2e 20 49 66 20 6e 6f 20 65 6e 74 72 79  ey). If no entry
0610: 20 69 73 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a   is found, set *
0620: 70 70 56 61 6c 0a 2a 2a 20 74 6f 20 30 20 61 6e  ppVal.** to 0 an
0630: 64 20 2a 70 6e 56 61 6c 20 74 6f 20 2d 31 20 62  d *pnVal to -1 b
0640: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
0650: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
0660: 2a 70 70 56 61 6c 20 61 6e 64 20 2a 70 6e 56 61  *ppVal and *pnVa
0670: 6c 0a 2a 2a 20 74 6f 20 61 20 70 6f 69 6e 74 65  l.** to a pointe
0680: 72 20 74 6f 20 61 6e 64 20 73 69 7a 65 20 6f 66  r to and size of
0690: 20 74 68 65 20 76 61 6c 75 65 20 61 73 73 6f 63   the value assoc
06a0: 69 61 74 65 64 20 77 69 74 68 20 28 70 4b 65 79  iated with (pKey
06b0: 2f 6e 4b 65 79 29 2e 0a 2a 2f 0a 69 6e 74 20 74  /nKey)..*/.int t
06c0: 64 62 5f 66 65 74 63 68 28 54 65 73 74 44 62 20  db_fetch(TestDb 
06d0: 2a 70 44 62 2c 20 76 6f 69 64 20 2a 70 4b 65 79  *pDb, void *pKey
06e0: 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 76 6f 69 64  , int nKey, void
06f0: 20 2a 2a 70 70 56 61 6c 2c 20 69 6e 74 20 2a 70   **ppVal, int *p
0700: 6e 56 61 6c 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70  nVal);../*.** Op
0710: 65 6e 20 61 6e 64 20 63 6c 6f 73 65 20 6e 65 73  en and close nes
0720: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
0730: 2e 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 65  . Currently, the
0740: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 6e 6c  se functions onl
0750: 79 20 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20 53  y .** work for S
0760: 51 4c 69 74 65 33 20 61 6e 64 20 4c 53 4d 20 73  QLite3 and LSM s
0770: 79 73 74 65 6d 73 2e 20 55 73 65 20 74 68 65 20  ystems. Use the 
0780: 74 64 62 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5f  tdb_transaction_
0790: 73 75 70 70 6f 72 74 28 29 20 0a 2a 2a 20 66 75  support() .** fu
07a0: 6e 63 74 69 6f 6e 20 74 6f 20 64 65 74 65 72 6d  nction to determ
07b0: 69 6e 65 20 69 66 20 61 20 67 69 76 65 6e 20 54  ine if a given T
07c0: 65 73 74 44 62 20 68 61 6e 64 6c 65 20 73 75 70  estDb handle sup
07d0: 70 6f 72 74 73 20 74 68 65 73 65 20 6d 65 74 68  ports these meth
07e0: 6f 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ods..**.** These
07f0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74   functions and t
0800: 68 65 20 69 4c 65 76 65 6c 20 70 61 72 61 6d 65  he iLevel parame
0810: 74 65 72 20 66 6f 6c 6c 6f 77 20 74 68 65 20 73  ter follow the s
0820: 61 6d 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 20  ame conventions 
0830: 61 73 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  as.** the SQLite
0840: 20 34 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   4 transaction i
0850: 6e 74 65 72 66 61 63 65 2e 20 4e 6f 74 65 20 74  nterface. Note t
0860: 68 61 74 20 74 68 69 73 20 69 73 20 73 6c 69 67  hat this is slig
0870: 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 0a 2a  htly different.*
0880: 2a 20 66 72 6f 6d 20 74 68 65 20 77 61 79 20 4c  * from the way L
0890: 53 4d 20 64 6f 65 73 20 74 68 69 6e 67 73 2e 20  SM does things. 
08a0: 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  As follows:.**.*
08b0: 2a 20 74 64 62 5f 62 65 67 69 6e 28 29 3a 0a 2a  * tdb_begin():.*
08c0: 2a 20 20 20 41 20 73 75 63 63 65 73 73 66 75 6c  *   A successful
08d0: 20 63 61 6c 6c 20 74 6f 20 74 64 62 5f 62 65 67   call to tdb_beg
08e0: 69 6e 28 29 20 77 69 74 68 20 28 69 4c 65 76 65  in() with (iLeve
08f0: 6c 3e 31 29 20 67 75 61 72 61 6e 74 65 65 73 20  l>1) guarantees 
0900: 74 68 61 74 20 0a 2a 2a 20 20 20 74 68 65 72 65  that .**   there
0910: 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 28 69   are at least (i
0920: 4c 65 76 65 6c 2d 31 29 20 77 72 69 74 65 20 74  Level-1) write t
0930: 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
0940: 2e 20 49 66 20 69 4c 65 76 65 6c 3d 3d 31 2c 0a  . If iLevel==1,.
0950: 2a 2a 20 20 20 74 68 65 6e 20 69 74 20 67 75 61  **   then it gua
0960: 72 61 6e 74 65 65 73 20 74 68 61 74 20 61 74 20  rantees that at 
0970: 6c 65 61 73 74 20 61 20 72 65 61 64 2d 74 72 61  least a read-tra
0980: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
0990: 2e 20 43 61 6c 6c 69 6e 67 0a 2a 2a 20 20 20 74  . Calling.**   t
09a0: 64 62 5f 62 65 67 69 6e 28 29 20 77 69 74 68 20  db_begin() with 
09b0: 69 4c 65 76 65 6c 3d 3d 30 20 69 73 20 61 20 6e  iLevel==0 is a n
09c0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 74 64 62 5f  o-op..**.** tdb_
09d0: 63 6f 6d 6d 69 74 28 29 3a 0a 2a 2a 20 20 20 41  commit():.**   A
09e0: 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c   successful call
09f0: 20 74 6f 20 74 64 62 5f 63 6f 6d 6d 69 74 28 29   to tdb_commit()
0a00: 20 77 69 74 68 20 28 69 4c 65 76 65 6c 3e 31 29   with (iLevel>1)
0a10: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
0a20: 20 0a 2a 2a 20 20 20 74 68 65 72 65 20 61 72 65   .**   there are
0a30: 20 61 74 20 6d 6f 73 74 20 28 69 4c 65 76 65 6c   at most (iLevel
0a40: 2d 31 29 20 77 72 69 74 65 20 74 72 61 6e 73 61  -1) write transa
0a50: 63 74 69 6f 6e 73 20 6f 70 65 6e 2e 20 49 66 20  ctions open. If 
0a60: 69 4c 65 76 65 6c 3d 3d 31 2c 0a 2a 2a 20 20 20  iLevel==1,.**   
0a70: 74 68 65 6e 20 69 74 20 67 75 61 72 61 6e 74 65  then it guarante
0a80: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 61 72  es that there ar
0a90: 65 20 6e 6f 20 77 72 69 74 65 20 74 72 61 6e 73  e no write trans
0aa0: 61 63 74 69 6f 6e 73 20 6f 70 65 6e 20 28 61 6c  actions open (al
0ab0: 74 68 6f 75 67 68 0a 2a 2a 20 20 20 61 20 72 65  though.**   a re
0ac0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ad-transaction m
0ad0: 61 79 20 72 65 6d 61 69 6e 20 6f 70 65 6e 29 2e  ay remain open).
0ae0: 20 20 43 61 6c 6c 69 6e 67 20 74 64 62 5f 63 6f    Calling tdb_co
0af0: 6d 6d 69 74 28 29 20 77 69 74 68 20 0a 2a 2a 20  mmit() with .** 
0b00: 20 20 69 4c 65 76 65 6c 3d 3d 30 20 65 6e 73 75    iLevel==0 ensu
0b10: 72 65 73 20 74 68 61 74 20 61 6c 6c 20 74 72 61  res that all tra
0b20: 6e 73 61 63 74 69 6f 6e 73 2c 20 72 65 61 64 20  nsactions, read 
0b30: 6f 72 20 77 72 69 74 65 2c 20 68 61 76 65 20 62  or write, have b
0b40: 65 65 6e 20 0a 2a 2a 20 20 20 63 6c 6f 73 65 64  een .**   closed
0b50: 20 61 6e 64 20 63 6f 6d 6d 69 74 74 65 64 2e 0a   and committed..
0b60: 2a 2a 0a 2a 2a 20 74 64 62 5f 72 6f 6c 6c 62 61  **.** tdb_rollba
0b70: 63 6b 28 29 3a 0a 2a 2a 20 20 20 54 68 69 73 20  ck():.**   This 
0b80: 63 61 6c 6c 20 69 73 20 73 69 6d 69 6c 61 72 20  call is similar 
0b90: 74 6f 20 74 64 62 5f 63 6f 6d 6d 69 74 28 29 2c  to tdb_commit(),
0ba0: 20 65 78 63 65 70 74 20 74 68 61 74 20 69 6e 73   except that ins
0bb0: 74 65 61 64 20 6f 66 20 63 6f 6d 6d 69 74 74 69  tead of committi
0bc0: 6e 67 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74  ng.**   transact
0bd0: 69 6f 6e 73 2c 20 69 74 20 72 65 76 65 72 74 73  ions, it reverts
0be0: 20 74 68 65 6d 2e 20 46 6f 72 20 65 78 61 6d 70   them. For examp
0bf0: 6c 65 2c 20 63 61 6c 6c 69 6e 67 20 74 64 62 5f  le, calling tdb_
0c00: 72 6f 6c 6c 62 61 63 6b 28 29 20 77 69 74 68 0a  rollback() with.
0c10: 2a 2a 20 20 20 69 4c 65 76 65 6c 3d 3d 32 20 65  **   iLevel==2 e
0c20: 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 72  nsures that ther
0c30: 65 20 69 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e is at most one
0c40: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
0c50: 6f 6e 20 6f 70 65 6e 2c 20 61 6e 64 0a 2a 2a 20  on open, and.** 
0c60: 20 20 72 65 73 74 6f 72 65 73 20 74 68 65 20 64    restores the d
0c70: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 20 73  atabase to the s
0c80: 74 61 74 65 20 74 68 61 74 20 69 74 20 77 61 73  tate that it was
0c90: 20 69 6e 20 77 68 65 6e 20 74 68 61 74 20 74 72   in when that tr
0ca0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 77  ansaction.**   w
0cb0: 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a  as opened..**.**
0cc0: 20 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64     In other word
0cd0: 73 2c 20 74 64 62 5f 63 6f 6d 6d 69 74 28 29 20  s, tdb_commit() 
0ce0: 6a 75 73 74 20 63 6c 6f 73 65 73 20 74 72 61 6e  just closes tran
0cf0: 73 61 63 74 69 6f 6e 73 20 2d 20 74 64 62 5f 72  sactions - tdb_r
0d00: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 20 20 63  ollback().**   c
0d10: 6c 6f 73 65 73 20 74 72 61 6e 73 61 63 74 69 6f  loses transactio
0d20: 6e 73 20 61 6e 64 20 74 68 65 6e 20 72 65 73 74  ns and then rest
0d30: 6f 72 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ores the databas
0d40: 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69  e to the state i
0d50: 74 0a 2a 2a 20 20 20 77 61 73 20 69 6e 20 62 65  t.**   was in be
0d60: 66 6f 72 65 20 74 68 6f 73 65 20 74 72 61 6e 73  fore those trans
0d70: 61 63 74 69 6f 6e 73 20 77 65 72 65 20 65 76 65  actions were eve
0d80: 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  n opened..*/.int
0d90: 20 74 64 62 5f 62 65 67 69 6e 28 54 65 73 74 44   tdb_begin(TestD
0da0: 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 4c 65 76  b *pDb, int iLev
0db0: 65 6c 29 3b 0a 69 6e 74 20 74 64 62 5f 63 6f 6d  el);.int tdb_com
0dc0: 6d 69 74 28 54 65 73 74 44 62 20 2a 70 44 62 2c  mit(TestDb *pDb,
0dd0: 20 69 6e 74 20 69 4c 65 76 65 6c 29 3b 0a 69 6e   int iLevel);.in
0de0: 74 20 74 64 62 5f 72 6f 6c 6c 62 61 63 6b 28 54  t tdb_rollback(T
0df0: 65 73 74 44 62 20 2a 70 44 62 2c 20 69 6e 74 20  estDb *pDb, int 
0e00: 69 4c 65 76 65 6c 29 3b 0a 0a 2f 2a 0a 2a 2a 20  iLevel);../*.** 
0e10: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
0e20: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
0e30: 73 75 70 70 6f 72 74 65 64 2c 20 6f 72 20 66 61  supported, or fa
0e40: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
0e50: 2f 0a 69 6e 74 20 74 64 62 5f 74 72 61 6e 73 61  /.int tdb_transa
0e60: 63 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 54 65  ction_support(Te
0e70: 73 74 44 62 20 2a 70 44 62 29 3b 0a 0a 2f 2a 0a  stDb *pDb);../*.
0e80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
0e90: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
0ea0: 73 65 20 6c 69 62 72 61 72 79 20 28 61 73 20 70  se library (as p
0eb0: 61 73 73 65 64 20 74 6f 20 74 64 62 5f 6f 70 65  assed to tdb_ope
0ec0: 6e 28 29 29 20 75 73 65 64 0a 2a 2a 20 62 79 20  n()) used.** by 
0ed0: 74 68 65 20 68 61 6e 64 6c 65 64 20 70 61 73 73  the handled pass
0ee0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
0ef0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e  argument..*/.con
0f00: 73 74 20 63 68 61 72 20 2a 74 64 62 5f 6c 69 62  st char *tdb_lib
0f10: 72 61 72 79 5f 6e 61 6d 65 28 54 65 73 74 44 62  rary_name(TestDb
0f20: 20 2a 70 44 62 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53   *pDb);../*.** S
0f30: 63 61 6e 20 61 20 72 61 6e 67 65 20 6f 66 20 64  can a range of d
0f40: 61 74 61 62 61 73 65 20 6b 65 79 73 2e 20 49 6e  atabase keys. In
0f50: 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
0f60: 6b 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  k function for e
0f70: 61 63 68 0a 2a 2a 20 6b 65 79 20 76 69 73 69 74  ach.** key visit
0f80: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 74 64 62 5f 73  ed..*/.int tdb_s
0f90: 63 61 6e 28 0a 20 20 54 65 73 74 44 62 20 2a 70  can(.  TestDb *p
0fa0: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
0fb0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
0fc0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 76  se handle */.  v
0fd0: 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0ff0: 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65  * Context pointe
1000: 72 20 74 6f 20 70 61 73 73 20 74 6f 20 78 43 61  r to pass to xCa
1010: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  llback */.  int 
1020: 62 52 65 76 65 72 73 65 2c 20 20 20 20 20 20 20  bReverse,       
1030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1040: 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  rue to scan in r
1050: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
1060: 20 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 69    void *pKey1, i
1070: 6e 74 20 6e 4b 65 79 31 2c 20 20 20 20 20 20 20  nt nKey1,       
1080: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 65    /* Start of se
1090: 61 72 63 68 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  arch */.  void *
10a0: 70 4b 65 79 32 2c 20 69 6e 74 20 6e 4b 65 79 32  pKey2, int nKey2
10b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  ,         /* End
10c0: 20 6f 66 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   of search */.  
10d0: 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
10e0: 29 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 76 6f  )(void *pCtx, vo
10f0: 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b  id *pKey, int nK
1100: 65 79 2c 20 76 6f 69 64 20 2a 70 56 61 6c 2c 20  ey, void *pVal, 
1110: 69 6e 74 20 6e 56 61 6c 29 0a 29 3b 0a 0a 63 6f  int nVal).);..co
1120: 6e 73 74 20 63 68 61 72 20 2a 74 64 62 5f 73 79  nst char *tdb_sy
1130: 73 74 65 6d 5f 6e 61 6d 65 28 69 6e 74 20 69 29  stem_name(int i)
1140: 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 64  ;.const char *td
1150: 62 5f 64 65 66 61 75 6c 74 5f 64 62 28 63 6f 6e  b_default_db(con
1160: 73 74 20 63 68 61 72 20 2a 7a 53 79 73 29 3b 0a  st char *zSys);.
1170: 0a 69 6e 74 20 74 64 62 5f 6c 73 6d 5f 6f 70 65  .int tdb_lsm_ope
1180: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  n(const char *zC
1190: 66 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fg, const char *
11a0: 7a 44 62 2c 20 69 6e 74 20 62 43 6c 65 61 72 2c  zDb, int bClear,
11b0: 20 54 65 73 74 44 62 20 2a 2a 70 70 44 62 29 3b   TestDb **ppDb);
11c0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 54  ../*.** If the T
11d0: 65 73 74 44 62 20 68 61 6e 64 6c 65 20 70 61 73  estDb handle pas
11e0: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
11f0: 6e 74 20 69 73 20 61 20 77 72 61 70 70 65 72 20  nt is a wrapper 
1200: 61 72 6f 75 6e 64 20 61 6e 20 4c 53 4d 0a 2a 2a  around an LSM.**
1210: 20 64 61 74 61 62 61 73 65 2c 20 72 65 74 75 72   database, retur
1220: 6e 20 74 68 65 20 4c 53 4d 20 68 61 6e 64 6c 65  n the LSM handle
1230: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1240: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
1250: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 64 61  some other.** da
1260: 74 61 62 61 73 65 20 73 79 73 74 65 6d 2c 20 72  tabase system, r
1270: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 6c  eturn NULL..*/.l
1280: 73 6d 5f 64 62 20 2a 74 64 62 5f 6c 73 6d 28 54  sm_db *tdb_lsm(T
1290: 65 73 74 44 62 20 2a 70 44 62 29 3b 0a 0a 2f 2a  estDb *pDb);../*
12a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
12b0: 69 66 20 74 68 65 20 64 62 20 70 61 73 73 65 64  if the db passed
12c0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
12d0: 69 73 20 61 20 6d 75 6c 74 69 2d 74 68 72 65 61  is a multi-threa
12e0: 64 65 64 20 4c 53 4d 0a 2a 2a 20 63 6f 6e 6e 65  ded LSM.** conne
12f0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 74 64  ction..*/.int td
1300: 62 5f 6c 73 6d 5f 6d 75 6c 74 69 74 68 72 65 61  b_lsm_multithrea
1310: 64 28 54 65 73 74 44 62 20 2a 70 44 62 29 3b 0a  d(TestDb *pDb);.
1320: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1330: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  pointer to the l
1340: 73 6d 5f 65 6e 76 20 6f 62 6a 65 63 74 20 75 73  sm_env object us
1350: 65 64 20 62 79 20 61 6c 6c 20 6c 73 6d 20 64 61  ed by all lsm da
1360: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
1370: 74 69 6f 6e 73 20 69 6e 69 74 69 61 6c 69 7a 65  tions initialize
1380: 64 20 61 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d as a copy of t
1390: 68 65 20 6f 62 6a 65 63 74 20 72 65 74 75 72 6e  he object return
13a0: 65 64 20 62 79 20 0a 2a 2a 20 6c 73 6d 5f 64 65  ed by .** lsm_de
13b0: 66 61 75 6c 74 5f 65 6e 76 28 29 2e 20 49 74 20  fault_env(). It 
13c0: 6d 61 79 20 62 65 20 6d 6f 64 69 66 69 65 64 20  may be modified 
13d0: 28 65 2e 67 2e 20 74 6f 20 6f 76 65 72 72 69 64  (e.g. to overrid
13e0: 65 20 66 75 6e 63 74 69 6f 6e 73 29 0a 2a 2a 20  e functions).** 
13f0: 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 63 61  if the caller ca
1400: 6e 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  n guarantee that
1410: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1420: 64 79 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 6c 73  dy in use..*/.ls
1430: 6d 5f 65 6e 76 20 2a 74 64 62 5f 6c 73 6d 5f 65  m_env *tdb_lsm_e
1440: 6e 76 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a  nv(void);../*.**
1450: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
1460: 75 6e 63 74 69 6f 6e 73 20 6f 6e 6c 79 20 77 6f  unctions only wo
1470: 72 6b 20 77 69 74 68 20 4c 53 4d 20 64 61 74 61  rk with LSM data
1480: 62 61 73 65 20 68 61 6e 64 6c 65 73 2e 20 49 74  base handles. It
1490: 20 69 73 0a 2a 2a 20 69 6c 6c 65 67 61 6c 20 74   is.** illegal t
14a0: 6f 20 63 61 6c 6c 20 74 68 65 6d 20 77 69 74 68  o call them with
14b0: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
14c0: 6f 66 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  of database hand
14d0: 6c 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  le specified.** 
14e0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
14f0: 2a 2f 0a 76 6f 69 64 20 74 64 62 5f 6c 73 6d 5f  */.void tdb_lsm_
1500: 65 6e 61 62 6c 65 5f 6c 6f 67 28 54 65 73 74 44  enable_log(TestD
1510: 62 20 2a 70 44 62 2c 20 69 6e 74 20 62 45 6e 61  b *pDb, int bEna
1520: 62 6c 65 29 3b 0a 76 6f 69 64 20 74 64 62 5f 6c  ble);.void tdb_l
1530: 73 6d 5f 61 70 70 6c 69 63 61 74 69 6f 6e 5f 63  sm_application_c
1540: 72 61 73 68 28 54 65 73 74 44 62 20 2a 70 44 62  rash(TestDb *pDb
1550: 29 3b 0a 76 6f 69 64 20 74 64 62 5f 6c 73 6d 5f  );.void tdb_lsm_
1560: 70 72 65 70 61 72 65 5f 73 79 73 74 65 6d 5f 63  prepare_system_c
1570: 72 61 73 68 28 54 65 73 74 44 62 20 2a 70 44 62  rash(TestDb *pDb
1580: 29 3b 0a 76 6f 69 64 20 74 64 62 5f 6c 73 6d 5f  );.void tdb_lsm_
1590: 73 79 73 74 65 6d 5f 63 72 61 73 68 28 54 65 73  system_crash(Tes
15a0: 74 44 62 20 2a 70 44 62 29 3b 0a 76 6f 69 64 20  tDb *pDb);.void 
15b0: 74 64 62 5f 6c 73 6d 5f 70 72 65 70 61 72 65 5f  tdb_lsm_prepare_
15c0: 73 79 6e 63 5f 63 72 61 73 68 28 54 65 73 74 44  sync_crash(TestD
15d0: 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 53 79 6e  b *pDb, int iSyn
15e0: 63 29 3b 0a 0a 0a 76 6f 69 64 20 74 64 62 5f 6c  c);...void tdb_l
15f0: 73 6d 5f 73 61 66 65 74 79 28 54 65 73 74 44 62  sm_safety(TestDb
1600: 20 2a 70 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65   *pDb, int eMode
1610: 29 3b 0a 76 6f 69 64 20 74 64 62 5f 6c 73 6d 5f  );.void tdb_lsm_
1620: 63 6f 6e 66 69 67 5f 77 6f 72 6b 5f 68 6f 6f 6b  config_work_hook
1630: 28 54 65 73 74 44 62 20 2a 70 44 62 2c 20 76 6f  (TestDb *pDb, vo
1640: 69 64 20 28 2a 29 28 6c 73 6d 5f 64 62 20 2a 2c  id (*)(lsm_db *,
1650: 20 76 6f 69 64 20 2a 29 2c 20 76 6f 69 64 20 2a   void *), void *
1660: 29 3b 0a 76 6f 69 64 20 74 64 62 5f 6c 73 6d 5f  );.void tdb_lsm_
1670: 77 72 69 74 65 5f 68 6f 6f 6b 28 54 65 73 74 44  write_hook(TestD
1680: 62 20 2a 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69  b *, void(*)(voi
1690: 64 2a 2c 69 6e 74 2c 6c 73 6d 5f 69 36 34 2c 69  d*,int,lsm_i64,i
16a0: 6e 74 2c 69 6e 74 29 2c 20 76 6f 69 64 2a 29 3b  nt,int), void*);
16b0: 0a 69 6e 74 20 74 64 62 5f 6c 73 6d 5f 63 6f 6e  .int tdb_lsm_con
16c0: 66 69 67 5f 73 74 72 28 54 65 73 74 44 62 20 2a  fig_str(TestDb *
16d0: 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  pDb, const char 
16e0: 2a 7a 53 74 72 29 3b 0a 0a 23 69 66 64 65 66 20  *zStr);..#ifdef 
16f0: 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 20 20 2f  __cplusplus.}  /
1700: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 27 65 78  * End of the 'ex
1710: 74 65 72 6e 20 22 43 22 27 20 62 6c 6f 63 6b 20  tern "C"' block 
1720: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69  */.#endif..#endi
1730: 66 0a                                            f.