Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: third_party/sqlite/sqlite-src-3170000/src/test3.c

Issue 2747283002: [sql] Import reference version of SQLite 3.17.. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 ** 2001 September 15
3 **
4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
6 **
7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 ** Code for testing the btree.c module in SQLite. This code
13 ** is not included in the SQLite library. It is used for automated
14 ** testing of the SQLite library.
15 */
16 #include "sqliteInt.h"
17 #include "btreeInt.h"
18 #if defined(INCLUDE_SQLITE_TCL_H)
19 # include "sqlite_tcl.h"
20 #else
21 # include "tcl.h"
22 #endif
23 #include <stdlib.h>
24 #include <string.h>
25
26 extern const char *sqlite3ErrName(int);
27
28 /*
29 ** A bogus sqlite3 connection structure for use in the btree
30 ** tests.
31 */
32 static sqlite3 sDb;
33 static int nRefSqlite3 = 0;
34
35 /*
36 ** Usage: btree_open FILENAME NCACHE
37 **
38 ** Open a new database
39 */
40 static int SQLITE_TCLAPI btree_open(
41 void *NotUsed,
42 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
43 int argc, /* Number of arguments */
44 const char **argv /* Text of each argument */
45 ){
46 Btree *pBt;
47 int rc, nCache;
48 char zBuf[100];
49 int n;
50 char *zFilename;
51 if( argc!=3 ){
52 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
53 " FILENAME NCACHE FLAGS\"", 0);
54 return TCL_ERROR;
55 }
56 if( Tcl_GetInt(interp, argv[2], &nCache) ) return TCL_ERROR;
57 nRefSqlite3++;
58 if( nRefSqlite3==1 ){
59 sDb.pVfs = sqlite3_vfs_find(0);
60 sDb.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
61 sqlite3_mutex_enter(sDb.mutex);
62 }
63 n = (int)strlen(argv[1]);
64 zFilename = sqlite3_malloc( n+2 );
65 if( zFilename==0 ) return TCL_ERROR;
66 memcpy(zFilename, argv[1], n+1);
67 zFilename[n+1] = 0;
68 rc = sqlite3BtreeOpen(sDb.pVfs, zFilename, &sDb, &pBt, 0,
69 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MAIN_DB);
70 sqlite3_free(zFilename);
71 if( rc!=SQLITE_OK ){
72 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
73 return TCL_ERROR;
74 }
75 sqlite3BtreeSetCacheSize(pBt, nCache);
76 sqlite3_snprintf(sizeof(zBuf), zBuf,"%p", pBt);
77 Tcl_AppendResult(interp, zBuf, 0);
78 return TCL_OK;
79 }
80
81 /*
82 ** Usage: btree_close ID
83 **
84 ** Close the given database.
85 */
86 static int SQLITE_TCLAPI btree_close(
87 void *NotUsed,
88 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
89 int argc, /* Number of arguments */
90 const char **argv /* Text of each argument */
91 ){
92 Btree *pBt;
93 int rc;
94 if( argc!=2 ){
95 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
96 " ID\"", 0);
97 return TCL_ERROR;
98 }
99 pBt = sqlite3TestTextToPtr(argv[1]);
100 rc = sqlite3BtreeClose(pBt);
101 if( rc!=SQLITE_OK ){
102 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
103 return TCL_ERROR;
104 }
105 nRefSqlite3--;
106 if( nRefSqlite3==0 ){
107 sqlite3_mutex_leave(sDb.mutex);
108 sqlite3_mutex_free(sDb.mutex);
109 sDb.mutex = 0;
110 sDb.pVfs = 0;
111 }
112 return TCL_OK;
113 }
114
115
116 /*
117 ** Usage: btree_begin_transaction ID
118 **
119 ** Start a new transaction
120 */
121 static int SQLITE_TCLAPI btree_begin_transaction(
122 void *NotUsed,
123 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
124 int argc, /* Number of arguments */
125 const char **argv /* Text of each argument */
126 ){
127 Btree *pBt;
128 int rc;
129 if( argc!=2 ){
130 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
131 " ID\"", 0);
132 return TCL_ERROR;
133 }
134 pBt = sqlite3TestTextToPtr(argv[1]);
135 sqlite3BtreeEnter(pBt);
136 rc = sqlite3BtreeBeginTrans(pBt, 1);
137 sqlite3BtreeLeave(pBt);
138 if( rc!=SQLITE_OK ){
139 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
140 return TCL_ERROR;
141 }
142 return TCL_OK;
143 }
144
145 /*
146 ** Usage: btree_pager_stats ID
147 **
148 ** Returns pager statistics
149 */
150 static int SQLITE_TCLAPI btree_pager_stats(
151 void *NotUsed,
152 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
153 int argc, /* Number of arguments */
154 const char **argv /* Text of each argument */
155 ){
156 Btree *pBt;
157 int i;
158 int *a;
159
160 if( argc!=2 ){
161 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
162 " ID\"", 0);
163 return TCL_ERROR;
164 }
165 pBt = sqlite3TestTextToPtr(argv[1]);
166
167 /* Normally in this file, with a b-tree handle opened using the
168 ** [btree_open] command it is safe to call sqlite3BtreeEnter() directly.
169 ** But this function is sometimes called with a btree handle obtained
170 ** from an open SQLite connection (using [btree_from_db]). In this case
171 ** we need to obtain the mutex for the controlling SQLite handle before
172 ** it is safe to call sqlite3BtreeEnter().
173 */
174 sqlite3_mutex_enter(pBt->db->mutex);
175
176 sqlite3BtreeEnter(pBt);
177 a = sqlite3PagerStats(sqlite3BtreePager(pBt));
178 for(i=0; i<11; i++){
179 static char *zName[] = {
180 "ref", "page", "max", "size", "state", "err",
181 "hit", "miss", "ovfl", "read", "write"
182 };
183 char zBuf[100];
184 Tcl_AppendElement(interp, zName[i]);
185 sqlite3_snprintf(sizeof(zBuf), zBuf,"%d",a[i]);
186 Tcl_AppendElement(interp, zBuf);
187 }
188 sqlite3BtreeLeave(pBt);
189
190 /* Release the mutex on the SQLite handle that controls this b-tree */
191 sqlite3_mutex_leave(pBt->db->mutex);
192 return TCL_OK;
193 }
194
195 /*
196 ** Usage: btree_cursor ID TABLENUM WRITEABLE
197 **
198 ** Create a new cursor. Return the ID for the cursor.
199 */
200 static int SQLITE_TCLAPI btree_cursor(
201 void *NotUsed,
202 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
203 int argc, /* Number of arguments */
204 const char **argv /* Text of each argument */
205 ){
206 Btree *pBt;
207 int iTable;
208 BtCursor *pCur;
209 int rc = SQLITE_OK;
210 int wrFlag;
211 char zBuf[30];
212
213 if( argc!=4 ){
214 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
215 " ID TABLENUM WRITEABLE\"", 0);
216 return TCL_ERROR;
217 }
218 pBt = sqlite3TestTextToPtr(argv[1]);
219 if( Tcl_GetInt(interp, argv[2], &iTable) ) return TCL_ERROR;
220 if( Tcl_GetBoolean(interp, argv[3], &wrFlag) ) return TCL_ERROR;
221 if( wrFlag ) wrFlag = BTREE_WRCSR;
222 pCur = (BtCursor *)ckalloc(sqlite3BtreeCursorSize());
223 memset(pCur, 0, sqlite3BtreeCursorSize());
224 sqlite3_mutex_enter(pBt->db->mutex);
225 sqlite3BtreeEnter(pBt);
226 #ifndef SQLITE_OMIT_SHARED_CACHE
227 rc = sqlite3BtreeLockTable(pBt, iTable, !!wrFlag);
228 #endif
229 if( rc==SQLITE_OK ){
230 rc = sqlite3BtreeCursor(pBt, iTable, wrFlag, 0, pCur);
231 }
232 sqlite3BtreeLeave(pBt);
233 sqlite3_mutex_leave(pBt->db->mutex);
234 if( rc ){
235 ckfree((char *)pCur);
236 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
237 return TCL_ERROR;
238 }
239 sqlite3_snprintf(sizeof(zBuf), zBuf,"%p", pCur);
240 Tcl_AppendResult(interp, zBuf, 0);
241 return SQLITE_OK;
242 }
243
244 /*
245 ** Usage: btree_close_cursor ID
246 **
247 ** Close a cursor opened using btree_cursor.
248 */
249 static int SQLITE_TCLAPI btree_close_cursor(
250 void *NotUsed,
251 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
252 int argc, /* Number of arguments */
253 const char **argv /* Text of each argument */
254 ){
255 BtCursor *pCur;
256 int rc;
257
258 if( argc!=2 ){
259 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
260 " ID\"", 0);
261 return TCL_ERROR;
262 }
263 pCur = sqlite3TestTextToPtr(argv[1]);
264 #if SQLITE_THREADSAFE>0
265 {
266 Btree *pBt = pCur->pBtree;
267 sqlite3_mutex_enter(pBt->db->mutex);
268 sqlite3BtreeEnter(pBt);
269 rc = sqlite3BtreeCloseCursor(pCur);
270 sqlite3BtreeLeave(pBt);
271 sqlite3_mutex_leave(pBt->db->mutex);
272 }
273 #else
274 rc = sqlite3BtreeCloseCursor(pCur);
275 #endif
276 ckfree((char *)pCur);
277 if( rc ){
278 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
279 return TCL_ERROR;
280 }
281 return SQLITE_OK;
282 }
283
284 /*
285 ** Usage: btree_next ID
286 **
287 ** Move the cursor to the next entry in the table. Return 0 on success
288 ** or 1 if the cursor was already on the last entry in the table or if
289 ** the table is empty.
290 */
291 static int SQLITE_TCLAPI btree_next(
292 void *NotUsed,
293 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
294 int argc, /* Number of arguments */
295 const char **argv /* Text of each argument */
296 ){
297 BtCursor *pCur;
298 int rc;
299 int res = 0;
300 char zBuf[100];
301
302 if( argc!=2 ){
303 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
304 " ID\"", 0);
305 return TCL_ERROR;
306 }
307 pCur = sqlite3TestTextToPtr(argv[1]);
308 sqlite3BtreeEnter(pCur->pBtree);
309 rc = sqlite3BtreeNext(pCur, &res);
310 sqlite3BtreeLeave(pCur->pBtree);
311 if( rc ){
312 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
313 return TCL_ERROR;
314 }
315 sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",res);
316 Tcl_AppendResult(interp, zBuf, 0);
317 return SQLITE_OK;
318 }
319
320 /*
321 ** Usage: btree_first ID
322 **
323 ** Move the cursor to the first entry in the table. Return 0 if the
324 ** cursor was left point to something and 1 if the table is empty.
325 */
326 static int SQLITE_TCLAPI btree_first(
327 void *NotUsed,
328 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
329 int argc, /* Number of arguments */
330 const char **argv /* Text of each argument */
331 ){
332 BtCursor *pCur;
333 int rc;
334 int res = 0;
335 char zBuf[100];
336
337 if( argc!=2 ){
338 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
339 " ID\"", 0);
340 return TCL_ERROR;
341 }
342 pCur = sqlite3TestTextToPtr(argv[1]);
343 sqlite3BtreeEnter(pCur->pBtree);
344 rc = sqlite3BtreeFirst(pCur, &res);
345 sqlite3BtreeLeave(pCur->pBtree);
346 if( rc ){
347 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
348 return TCL_ERROR;
349 }
350 sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",res);
351 Tcl_AppendResult(interp, zBuf, 0);
352 return SQLITE_OK;
353 }
354
355 /*
356 ** Usage: btree_eof ID
357 **
358 ** Return TRUE if the given cursor is not pointing at a valid entry.
359 ** Return FALSE if the cursor does point to a valid entry.
360 */
361 static int SQLITE_TCLAPI btree_eof(
362 void *NotUsed,
363 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
364 int argc, /* Number of arguments */
365 const char **argv /* Text of each argument */
366 ){
367 BtCursor *pCur;
368 int rc;
369 char zBuf[50];
370
371 if( argc!=2 ){
372 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
373 " ID\"", 0);
374 return TCL_ERROR;
375 }
376 pCur = sqlite3TestTextToPtr(argv[1]);
377 sqlite3BtreeEnter(pCur->pBtree);
378 rc = sqlite3BtreeEof(pCur);
379 sqlite3BtreeLeave(pCur->pBtree);
380 sqlite3_snprintf(sizeof(zBuf),zBuf, "%d", rc);
381 Tcl_AppendResult(interp, zBuf, 0);
382 return SQLITE_OK;
383 }
384
385 /*
386 ** Usage: btree_payload_size ID
387 **
388 ** Return the number of bytes of payload
389 */
390 static int SQLITE_TCLAPI btree_payload_size(
391 void *NotUsed,
392 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
393 int argc, /* Number of arguments */
394 const char **argv /* Text of each argument */
395 ){
396 BtCursor *pCur;
397 u32 n;
398 char zBuf[50];
399
400 if( argc!=2 ){
401 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
402 " ID\"", 0);
403 return TCL_ERROR;
404 }
405 pCur = sqlite3TestTextToPtr(argv[1]);
406 sqlite3BtreeEnter(pCur->pBtree);
407 n = sqlite3BtreePayloadSize(pCur);
408 sqlite3BtreeLeave(pCur->pBtree);
409 sqlite3_snprintf(sizeof(zBuf),zBuf, "%u", n);
410 Tcl_AppendResult(interp, zBuf, 0);
411 return SQLITE_OK;
412 }
413
414 /*
415 ** usage: varint_test START MULTIPLIER COUNT INCREMENT
416 **
417 ** This command tests the putVarint() and getVarint()
418 ** routines, both for accuracy and for speed.
419 **
420 ** An integer is written using putVarint() and read back with
421 ** getVarint() and varified to be unchanged. This repeats COUNT
422 ** times. The first integer is START*MULTIPLIER. Each iteration
423 ** increases the integer by INCREMENT.
424 **
425 ** This command returns nothing if it works. It returns an error message
426 ** if something goes wrong.
427 */
428 static int SQLITE_TCLAPI btree_varint_test(
429 void *NotUsed,
430 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
431 int argc, /* Number of arguments */
432 const char **argv /* Text of each argument */
433 ){
434 u32 start, mult, count, incr;
435 u64 in, out;
436 int n1, n2, i, j;
437 unsigned char zBuf[100];
438 if( argc!=5 ){
439 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
440 " START MULTIPLIER COUNT INCREMENT\"", 0);
441 return TCL_ERROR;
442 }
443 if( Tcl_GetInt(interp, argv[1], (int*)&start) ) return TCL_ERROR;
444 if( Tcl_GetInt(interp, argv[2], (int*)&mult) ) return TCL_ERROR;
445 if( Tcl_GetInt(interp, argv[3], (int*)&count) ) return TCL_ERROR;
446 if( Tcl_GetInt(interp, argv[4], (int*)&incr) ) return TCL_ERROR;
447 in = start;
448 in *= mult;
449 for(i=0; i<(int)count; i++){
450 char zErr[200];
451 n1 = putVarint(zBuf, in);
452 if( n1>9 || n1<1 ){
453 sqlite3_snprintf(sizeof(zErr), zErr,
454 "putVarint returned %d - should be between 1 and 9", n1);
455 Tcl_AppendResult(interp, zErr, 0);
456 return TCL_ERROR;
457 }
458 n2 = getVarint(zBuf, &out);
459 if( n1!=n2 ){
460 sqlite3_snprintf(sizeof(zErr), zErr,
461 "putVarint returned %d and getVarint returned %d", n1, n2);
462 Tcl_AppendResult(interp, zErr, 0);
463 return TCL_ERROR;
464 }
465 if( in!=out ){
466 sqlite3_snprintf(sizeof(zErr), zErr,
467 "Wrote 0x%016llx and got back 0x%016llx", in, out);
468 Tcl_AppendResult(interp, zErr, 0);
469 return TCL_ERROR;
470 }
471 if( (in & 0xffffffff)==in ){
472 u32 out32;
473 n2 = getVarint32(zBuf, out32);
474 out = out32;
475 if( n1!=n2 ){
476 sqlite3_snprintf(sizeof(zErr), zErr,
477 "putVarint returned %d and GetVarint32 returned %d",
478 n1, n2);
479 Tcl_AppendResult(interp, zErr, 0);
480 return TCL_ERROR;
481 }
482 if( in!=out ){
483 sqlite3_snprintf(sizeof(zErr), zErr,
484 "Wrote 0x%016llx and got back 0x%016llx from GetVarint32",
485 in, out);
486 Tcl_AppendResult(interp, zErr, 0);
487 return TCL_ERROR;
488 }
489 }
490
491 /* In order to get realistic timings, run getVarint 19 more times.
492 ** This is because getVarint is called about 20 times more often
493 ** than putVarint.
494 */
495 for(j=0; j<19; j++){
496 getVarint(zBuf, &out);
497 }
498 in += incr;
499 }
500 return TCL_OK;
501 }
502
503 /*
504 ** usage: btree_from_db DB-HANDLE
505 **
506 ** This command returns the btree handle for the main database associated
507 ** with the database-handle passed as the argument. Example usage:
508 **
509 ** sqlite3 db test.db
510 ** set bt [btree_from_db db]
511 */
512 static int SQLITE_TCLAPI btree_from_db(
513 void *NotUsed,
514 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
515 int argc, /* Number of arguments */
516 const char **argv /* Text of each argument */
517 ){
518 char zBuf[100];
519 Tcl_CmdInfo info;
520 sqlite3 *db;
521 Btree *pBt;
522 int iDb = 0;
523
524 if( argc!=2 && argc!=3 ){
525 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
526 " DB-HANDLE ?N?\"", 0);
527 return TCL_ERROR;
528 }
529
530 if( 1!=Tcl_GetCommandInfo(interp, argv[1], &info) ){
531 Tcl_AppendResult(interp, "No such db-handle: \"", argv[1], "\"", 0);
532 return TCL_ERROR;
533 }
534 if( argc==3 ){
535 iDb = atoi(argv[2]);
536 }
537
538 db = *((sqlite3 **)info.objClientData);
539 assert( db );
540
541 pBt = db->aDb[iDb].pBt;
542 sqlite3_snprintf(sizeof(zBuf), zBuf, "%p", pBt);
543 Tcl_SetResult(interp, zBuf, TCL_VOLATILE);
544 return TCL_OK;
545 }
546
547 /*
548 ** Usage: btree_ismemdb ID
549 **
550 ** Return true if the B-Tree is currently stored entirely in memory.
551 */
552 static int SQLITE_TCLAPI btree_ismemdb(
553 void *NotUsed,
554 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
555 int argc, /* Number of arguments */
556 const char **argv /* Text of each argument */
557 ){
558 Btree *pBt;
559 int res;
560 sqlite3_file *pFile;
561
562 if( argc!=2 ){
563 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
564 " ID\"", 0);
565 return TCL_ERROR;
566 }
567 pBt = sqlite3TestTextToPtr(argv[1]);
568 sqlite3_mutex_enter(pBt->db->mutex);
569 sqlite3BtreeEnter(pBt);
570 pFile = sqlite3PagerFile(sqlite3BtreePager(pBt));
571 res = (pFile->pMethods==0);
572 sqlite3BtreeLeave(pBt);
573 sqlite3_mutex_leave(pBt->db->mutex);
574 Tcl_SetObjResult(interp, Tcl_NewBooleanObj(res));
575 return SQLITE_OK;
576 }
577
578 /*
579 ** usage: btree_set_cache_size ID NCACHE
580 **
581 ** Set the size of the cache used by btree $ID.
582 */
583 static int SQLITE_TCLAPI btree_set_cache_size(
584 void *NotUsed,
585 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
586 int argc, /* Number of arguments */
587 const char **argv /* Text of each argument */
588 ){
589 int nCache;
590 Btree *pBt;
591
592 if( argc!=3 ){
593 Tcl_AppendResult(
594 interp, "wrong # args: should be \"", argv[0], " BT NCACHE\"", 0);
595 return TCL_ERROR;
596 }
597 pBt = sqlite3TestTextToPtr(argv[1]);
598 if( Tcl_GetInt(interp, argv[2], &nCache) ) return TCL_ERROR;
599
600 sqlite3_mutex_enter(pBt->db->mutex);
601 sqlite3BtreeEnter(pBt);
602 sqlite3BtreeSetCacheSize(pBt, nCache);
603 sqlite3BtreeLeave(pBt);
604 sqlite3_mutex_leave(pBt->db->mutex);
605 return TCL_OK;
606 }
607
608 /*
609 ** usage: btree_insert CSR ?KEY? VALUE
610 **
611 ** Set the size of the cache used by btree $ID.
612 */
613 static int SQLITE_TCLAPI btree_insert(
614 ClientData clientData,
615 Tcl_Interp *interp,
616 int objc,
617 Tcl_Obj *const objv[]
618 ){
619 BtCursor *pCur;
620 int rc;
621 BtreePayload x;
622
623 if( objc!=4 && objc!=3 ){
624 Tcl_WrongNumArgs(interp, 1, objv, "?-intkey? CSR KEY VALUE");
625 return TCL_ERROR;
626 }
627
628 memset(&x, 0, sizeof(x));
629 if( objc==4 ){
630 if( Tcl_GetIntFromObj(interp, objv[2], &rc) ) return TCL_ERROR;
631 x.nKey = rc;
632 x.pData = (void*)Tcl_GetByteArrayFromObj(objv[3], &x.nData);
633 }else{
634 x.pKey = (void*)Tcl_GetByteArrayFromObj(objv[2], &rc);
635 x.nKey = rc;
636 }
637 pCur = (BtCursor*)sqlite3TestTextToPtr(Tcl_GetString(objv[1]));
638
639 sqlite3_mutex_enter(pCur->pBtree->db->mutex);
640 sqlite3BtreeEnter(pCur->pBtree);
641 rc = sqlite3BtreeInsert(pCur, &x, 0, 0);
642 sqlite3BtreeLeave(pCur->pBtree);
643 sqlite3_mutex_leave(pCur->pBtree->db->mutex);
644
645 Tcl_ResetResult(interp);
646 if( rc ){
647 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
648 return TCL_ERROR;
649 }
650 return TCL_OK;
651 }
652
653
654 /*
655 ** Register commands with the TCL interpreter.
656 */
657 int Sqlitetest3_Init(Tcl_Interp *interp){
658 static struct {
659 char *zName;
660 Tcl_CmdProc *xProc;
661 } aCmd[] = {
662 { "btree_open", (Tcl_CmdProc*)btree_open },
663 { "btree_close", (Tcl_CmdProc*)btree_close },
664 { "btree_begin_transaction", (Tcl_CmdProc*)btree_begin_transaction },
665 { "btree_pager_stats", (Tcl_CmdProc*)btree_pager_stats },
666 { "btree_cursor", (Tcl_CmdProc*)btree_cursor },
667 { "btree_close_cursor", (Tcl_CmdProc*)btree_close_cursor },
668 { "btree_next", (Tcl_CmdProc*)btree_next },
669 { "btree_eof", (Tcl_CmdProc*)btree_eof },
670 { "btree_payload_size", (Tcl_CmdProc*)btree_payload_size },
671 { "btree_first", (Tcl_CmdProc*)btree_first },
672 { "btree_varint_test", (Tcl_CmdProc*)btree_varint_test },
673 { "btree_from_db", (Tcl_CmdProc*)btree_from_db },
674 { "btree_ismemdb", (Tcl_CmdProc*)btree_ismemdb },
675 { "btree_set_cache_size", (Tcl_CmdProc*)btree_set_cache_size }
676 };
677 int i;
678
679 for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){
680 Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0);
681 }
682
683 Tcl_CreateObjCommand(interp, "btree_insert", btree_insert, 0, 0);
684
685 return TCL_OK;
686 }
OLDNEW
« no previous file with comments | « third_party/sqlite/sqlite-src-3170000/src/test2.c ('k') | third_party/sqlite/sqlite-src-3170000/src/test4.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698