blob: 4b98925a93dc74997349facb80cd903c8778da7f [file] [log] [blame]
drh5c4d9702001-08-20 00:33:58 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh5c4d9702001-08-20 00:33:58 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh5c4d9702001-08-20 00:33:58 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** 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.
drh5c4d9702001-08-20 00:33:58 +000010**
11*************************************************************************
12** Code for testing the pager.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**
drh90f5ecb2004-07-22 01:19:35 +000016** $Id: test2.c,v 1.24 2004/07/22 01:19:35 drh Exp $
drh5c4d9702001-08-20 00:33:58 +000017*/
drhd0d006e2002-12-01 02:00:57 +000018#include "os.h"
drh5c4d9702001-08-20 00:33:58 +000019#include "sqliteInt.h"
20#include "pager.h"
21#include "tcl.h"
22#include <stdlib.h>
23#include <string.h>
24
25/*
26** Interpret an SQLite error number
27*/
28static char *errorName(int rc){
29 char *zName;
30 switch( rc ){
31 case SQLITE_OK: zName = "SQLITE_OK"; break;
32 case SQLITE_ERROR: zName = "SQLITE_ERROR"; break;
33 case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break;
34 case SQLITE_PERM: zName = "SQLITE_PERM"; break;
35 case SQLITE_ABORT: zName = "SQLITE_ABORT"; break;
36 case SQLITE_BUSY: zName = "SQLITE_BUSY"; break;
37 case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break;
38 case SQLITE_READONLY: zName = "SQLITE_READONLY"; break;
39 case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break;
40 case SQLITE_IOERR: zName = "SQLITE_IOERR"; break;
41 case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break;
42 case SQLITE_NOTFOUND: zName = "SQLITE_NOTFOUND"; break;
43 case SQLITE_FULL: zName = "SQLITE_FULL"; break;
44 case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break;
45 case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break;
drh247be432002-05-10 05:44:55 +000046 case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break;
47 case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break;
48 case SQLITE_TOOBIG: zName = "SQLITE_TOOBIG"; break;
49 case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break;
50 case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break;
51 case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break;
drh8766c342002-11-09 00:33:15 +000052 case SQLITE_NOLFS: zName = "SQLITE_NOLFS"; break;
drh5c4d9702001-08-20 00:33:58 +000053 default: zName = "SQLITE_Unknown"; break;
54 }
55 return zName;
56}
57
58/*
drh90f5ecb2004-07-22 01:19:35 +000059** Page size and reserved size used for testing.
60*/
61static int test_pagesize = 1024;
62
63/*
drh5c4d9702001-08-20 00:33:58 +000064** Usage: pager_open FILENAME N-PAGE
65**
66** Open a new pager
67*/
68static int pager_open(
69 void *NotUsed,
70 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
71 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +000072 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +000073){
74 Pager *pPager;
75 int nPage;
76 int rc;
77 char zBuf[100];
78 if( argc!=3 ){
79 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
80 " FILENAME N-PAGE\"", 0);
81 return TCL_ERROR;
82 }
83 if( Tcl_GetInt(interp, argv[2], &nPage) ) return TCL_ERROR;
drh90f5ecb2004-07-22 01:19:35 +000084 rc = sqlite3pager_open(&pPager, argv[1], 0, 1);
drh5c4d9702001-08-20 00:33:58 +000085 if( rc!=SQLITE_OK ){
86 Tcl_AppendResult(interp, errorName(rc), 0);
87 return TCL_ERROR;
88 }
drh90f5ecb2004-07-22 01:19:35 +000089 sqlite3pager_set_cachesize(pPager, nPage);
90 sqlite3pager_set_pagesize(pPager, test_pagesize);
drh5c4d9702001-08-20 00:33:58 +000091 sprintf(zBuf,"0x%x",(int)pPager);
92 Tcl_AppendResult(interp, zBuf, 0);
93 return TCL_OK;
94}
95
96/*
97** Usage: pager_close ID
98**
99** Close the given pager.
100*/
101static int pager_close(
102 void *NotUsed,
103 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
104 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000105 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000106){
107 Pager *pPager;
108 int rc;
109 if( argc!=2 ){
110 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
111 " ID\"", 0);
112 return TCL_ERROR;
113 }
114 if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000115 rc = sqlite3pager_close(pPager);
drh5c4d9702001-08-20 00:33:58 +0000116 if( rc!=SQLITE_OK ){
117 Tcl_AppendResult(interp, errorName(rc), 0);
118 return TCL_ERROR;
119 }
120 return TCL_OK;
121}
122
123/*
124** Usage: pager_rollback ID
125**
126** Rollback changes
127*/
128static int pager_rollback(
129 void *NotUsed,
130 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
131 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000132 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000133){
134 Pager *pPager;
135 int rc;
136 if( argc!=2 ){
137 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
138 " ID\"", 0);
139 return TCL_ERROR;
140 }
141 if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000142 rc = sqlite3pager_rollback(pPager);
drh5c4d9702001-08-20 00:33:58 +0000143 if( rc!=SQLITE_OK ){
144 Tcl_AppendResult(interp, errorName(rc), 0);
145 return TCL_ERROR;
146 }
147 return TCL_OK;
148}
149
150/*
151** Usage: pager_commit ID
152**
153** Commit all changes
154*/
155static int pager_commit(
156 void *NotUsed,
157 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
158 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000159 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000160){
161 Pager *pPager;
162 int rc;
163 if( argc!=2 ){
164 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
165 " ID\"", 0);
166 return TCL_ERROR;
167 }
168 if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000169 rc = sqlite3pager_commit(pPager);
drh5c4d9702001-08-20 00:33:58 +0000170 if( rc!=SQLITE_OK ){
171 Tcl_AppendResult(interp, errorName(rc), 0);
172 return TCL_ERROR;
173 }
174 return TCL_OK;
175}
176
177/*
drh3aac2dd2004-04-26 14:10:20 +0000178** Usage: pager_stmt_begin ID
drhfa86c412002-02-02 15:01:15 +0000179**
180** Start a new checkpoint.
181*/
drh3aac2dd2004-04-26 14:10:20 +0000182static int pager_stmt_begin(
drhfa86c412002-02-02 15:01:15 +0000183 void *NotUsed,
184 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
185 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000186 const char **argv /* Text of each argument */
drhfa86c412002-02-02 15:01:15 +0000187){
188 Pager *pPager;
189 int rc;
190 if( argc!=2 ){
191 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
192 " ID\"", 0);
193 return TCL_ERROR;
194 }
195 if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000196 rc = sqlite3pager_stmt_begin(pPager);
drhfa86c412002-02-02 15:01:15 +0000197 if( rc!=SQLITE_OK ){
198 Tcl_AppendResult(interp, errorName(rc), 0);
199 return TCL_ERROR;
200 }
201 return TCL_OK;
202}
203
204/*
drh3aac2dd2004-04-26 14:10:20 +0000205** Usage: pager_stmt_rollback ID
drhfa86c412002-02-02 15:01:15 +0000206**
207** Rollback changes to a checkpoint
208*/
drh3aac2dd2004-04-26 14:10:20 +0000209static int pager_stmt_rollback(
drhfa86c412002-02-02 15:01:15 +0000210 void *NotUsed,
211 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
212 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000213 const char **argv /* Text of each argument */
drhfa86c412002-02-02 15:01:15 +0000214){
215 Pager *pPager;
216 int rc;
217 if( argc!=2 ){
218 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
219 " ID\"", 0);
220 return TCL_ERROR;
221 }
222 if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000223 rc = sqlite3pager_stmt_rollback(pPager);
drhfa86c412002-02-02 15:01:15 +0000224 if( rc!=SQLITE_OK ){
225 Tcl_AppendResult(interp, errorName(rc), 0);
226 return TCL_ERROR;
227 }
228 return TCL_OK;
229}
230
231/*
drh3aac2dd2004-04-26 14:10:20 +0000232** Usage: pager_stmt_commit ID
drhfa86c412002-02-02 15:01:15 +0000233**
234** Commit changes to a checkpoint
235*/
drh3aac2dd2004-04-26 14:10:20 +0000236static int pager_stmt_commit(
drhfa86c412002-02-02 15:01:15 +0000237 void *NotUsed,
238 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
239 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000240 const char **argv /* Text of each argument */
drhfa86c412002-02-02 15:01:15 +0000241){
242 Pager *pPager;
243 int rc;
244 if( argc!=2 ){
245 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
246 " ID\"", 0);
247 return TCL_ERROR;
248 }
249 if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000250 rc = sqlite3pager_stmt_commit(pPager);
drhfa86c412002-02-02 15:01:15 +0000251 if( rc!=SQLITE_OK ){
252 Tcl_AppendResult(interp, errorName(rc), 0);
253 return TCL_ERROR;
254 }
255 return TCL_OK;
256}
257
258/*
drh5c4d9702001-08-20 00:33:58 +0000259** Usage: pager_stats ID
260**
261** Return pager statistics.
262*/
263static int pager_stats(
264 void *NotUsed,
265 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
266 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000267 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000268){
269 Pager *pPager;
270 int i, *a;
271 if( argc!=2 ){
272 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
273 " ID\"", 0);
274 return TCL_ERROR;
275 }
276 if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000277 a = sqlite3pager_stats(pPager);
drh5c4d9702001-08-20 00:33:58 +0000278 for(i=0; i<9; i++){
279 static char *zName[] = {
280 "ref", "page", "max", "size", "state", "err",
281 "hit", "miss", "ovfl",
282 };
283 char zBuf[100];
284 Tcl_AppendElement(interp, zName[i]);
285 sprintf(zBuf,"%d",a[i]);
286 Tcl_AppendElement(interp, zBuf);
287 }
288 return TCL_OK;
289}
290
291/*
292** Usage: pager_pagecount ID
293**
294** Return the size of the database file.
295*/
296static int pager_pagecount(
297 void *NotUsed,
298 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
299 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000300 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000301){
302 Pager *pPager;
303 char zBuf[100];
304 if( argc!=2 ){
305 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
306 " ID\"", 0);
307 return TCL_ERROR;
308 }
309 if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000310 sprintf(zBuf,"%d",sqlite3pager_pagecount(pPager));
drh5c4d9702001-08-20 00:33:58 +0000311 Tcl_AppendResult(interp, zBuf, 0);
312 return TCL_OK;
313}
314
315/*
316** Usage: page_get ID PGNO
317**
318** Return a pointer to a page from the database.
319*/
320static int page_get(
321 void *NotUsed,
322 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
323 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000324 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000325){
326 Pager *pPager;
327 char zBuf[100];
328 void *pPage;
329 int pgno;
330 int rc;
331 if( argc!=3 ){
332 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
333 " ID PGNO\"", 0);
334 return TCL_ERROR;
335 }
336 if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR;
337 if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000338 rc = sqlite3pager_get(pPager, pgno, &pPage);
drh5c4d9702001-08-20 00:33:58 +0000339 if( rc!=SQLITE_OK ){
340 Tcl_AppendResult(interp, errorName(rc), 0);
341 return TCL_ERROR;
342 }
343 sprintf(zBuf,"0x%x",(int)pPage);
344 Tcl_AppendResult(interp, zBuf, 0);
345 return TCL_OK;
346}
347
348/*
349** Usage: page_lookup ID PGNO
350**
351** Return a pointer to a page if the page is already in cache.
352** If not in cache, return an empty string.
353*/
354static int page_lookup(
355 void *NotUsed,
356 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
357 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000358 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000359){
360 Pager *pPager;
361 char zBuf[100];
362 void *pPage;
363 int pgno;
364 if( argc!=3 ){
365 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
366 " ID PGNO\"", 0);
367 return TCL_ERROR;
368 }
369 if( Tcl_GetInt(interp, argv[1], (int*)&pPager) ) return TCL_ERROR;
370 if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000371 pPage = sqlite3pager_lookup(pPager, pgno);
drh5c4d9702001-08-20 00:33:58 +0000372 if( pPage ){
373 sprintf(zBuf,"0x%x",(int)pPage);
374 Tcl_AppendResult(interp, zBuf, 0);
375 }
376 return TCL_OK;
377}
378
379/*
380** Usage: page_unref PAGE
381**
382** Drop a pointer to a page.
383*/
384static int page_unref(
385 void *NotUsed,
386 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
387 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000388 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000389){
390 void *pPage;
391 int rc;
392 if( argc!=2 ){
393 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
394 " PAGE\"", 0);
395 return TCL_ERROR;
396 }
397 if( Tcl_GetInt(interp, argv[1], (int*)&pPage) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000398 rc = sqlite3pager_unref(pPage);
drh5c4d9702001-08-20 00:33:58 +0000399 if( rc!=SQLITE_OK ){
400 Tcl_AppendResult(interp, errorName(rc), 0);
401 return TCL_ERROR;
402 }
403 return TCL_OK;
404}
405
406/*
407** Usage: page_read PAGE
408**
409** Return the content of a page
410*/
411static int page_read(
412 void *NotUsed,
413 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
414 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000415 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000416){
417 char zBuf[100];
418 void *pPage;
419 if( argc!=2 ){
420 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
421 " PAGE\"", 0);
422 return TCL_ERROR;
423 }
424 if( Tcl_GetInt(interp, argv[1], (int*)&pPage) ) return TCL_ERROR;
425 memcpy(zBuf, pPage, sizeof(zBuf));
426 Tcl_AppendResult(interp, zBuf, 0);
427 return TCL_OK;
428}
429
430/*
431** Usage: page_number PAGE
432**
433** Return the page number for a page.
434*/
435static int page_number(
436 void *NotUsed,
437 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
438 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000439 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000440){
441 char zBuf[100];
442 void *pPage;
443 if( argc!=2 ){
444 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
445 " PAGE\"", 0);
446 return TCL_ERROR;
447 }
448 if( Tcl_GetInt(interp, argv[1], (int*)&pPage) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000449 sprintf(zBuf, "%d", sqlite3pager_pagenumber(pPage));
drh5c4d9702001-08-20 00:33:58 +0000450 Tcl_AppendResult(interp, zBuf, 0);
451 return TCL_OK;
452}
453
454/*
455** Usage: page_write PAGE DATA
456**
457** Write something into a page.
458*/
459static int page_write(
460 void *NotUsed,
461 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
462 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000463 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000464){
465 void *pPage;
466 int rc;
467 if( argc!=3 ){
468 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
469 " PAGE DATA\"", 0);
470 return TCL_ERROR;
471 }
472 if( Tcl_GetInt(interp, argv[1], (int*)&pPage) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000473 rc = sqlite3pager_write(pPage);
drh5c4d9702001-08-20 00:33:58 +0000474 if( rc!=SQLITE_OK ){
475 Tcl_AppendResult(interp, errorName(rc), 0);
476 return TCL_ERROR;
477 }
drh90f5ecb2004-07-22 01:19:35 +0000478 strncpy((char*)pPage, argv[2], test_pagesize-1);
479 ((char*)pPage)[test_pagesize-1] = 0;
drh5c4d9702001-08-20 00:33:58 +0000480 return TCL_OK;
481}
482
483/*
drhd0d006e2002-12-01 02:00:57 +0000484** Usage: fake_big_file N FILENAME
485**
486** Write a few bytes at the N megabyte point of FILENAME. This will
487** create a large file. If the file was a valid SQLite database, then
488** the next time the database is opened, SQLite will begin allocating
489** new pages after N. If N is 2096 or bigger, this will test the
490** ability of SQLite to write to large files.
491*/
492static int fake_big_file(
493 void *NotUsed,
494 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
495 int argc, /* Number of arguments */
496 const char **argv /* Text of each argument */
497){
498 int rc;
499 int n;
500 off_t offset;
501 OsFile fd;
502 int readOnly = 0;
503 if( argc!=3 ){
504 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
505 " N-MEGABYTES FILE\"", 0);
506 return TCL_ERROR;
507 }
508 if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR;
drhda71ce12004-06-21 18:14:45 +0000509 memset(&fd, 0, sizeof(fd));
danielk19774adee202004-05-08 08:23:19 +0000510 rc = sqlite3OsOpenReadWrite(argv[2], &fd, &readOnly);
drhd0d006e2002-12-01 02:00:57 +0000511 if( rc ){
512 Tcl_AppendResult(interp, "open failed: ", errorName(rc), 0);
513 return TCL_ERROR;
514 }
515 offset = n;
516 offset *= 1024*1024;
danielk19774adee202004-05-08 08:23:19 +0000517 rc = sqlite3OsSeek(&fd, offset);
drhd0d006e2002-12-01 02:00:57 +0000518 if( rc ){
519 Tcl_AppendResult(interp, "seek failed: ", errorName(rc), 0);
520 return TCL_ERROR;
521 }
danielk19774adee202004-05-08 08:23:19 +0000522 rc = sqlite3OsWrite(&fd, "Hello, World!", 14);
523 sqlite3OsClose(&fd);
drhd0d006e2002-12-01 02:00:57 +0000524 if( rc ){
525 Tcl_AppendResult(interp, "write failed: ", errorName(rc), 0);
526 return TCL_ERROR;
527 }
drhd0d006e2002-12-01 02:00:57 +0000528 return TCL_OK;
529}
530
531/*
drh5c4d9702001-08-20 00:33:58 +0000532** Register commands with the TCL interpreter.
533*/
534int Sqlitetest2_Init(Tcl_Interp *interp){
danielk19776f8a5032004-05-10 10:34:51 +0000535 extern int sqlite3_io_error_pending;
drhc2eef3b2002-08-31 18:53:06 +0000536 static struct {
537 char *zName;
538 Tcl_CmdProc *xProc;
539 } aCmd[] = {
540 { "pager_open", (Tcl_CmdProc*)pager_open },
541 { "pager_close", (Tcl_CmdProc*)pager_close },
542 { "pager_commit", (Tcl_CmdProc*)pager_commit },
543 { "pager_rollback", (Tcl_CmdProc*)pager_rollback },
drh3aac2dd2004-04-26 14:10:20 +0000544 { "pager_stmt_begin", (Tcl_CmdProc*)pager_stmt_begin },
545 { "pager_stmt_commit", (Tcl_CmdProc*)pager_stmt_commit },
546 { "pager_stmt_rollback", (Tcl_CmdProc*)pager_stmt_rollback },
drhc2eef3b2002-08-31 18:53:06 +0000547 { "pager_stats", (Tcl_CmdProc*)pager_stats },
548 { "pager_pagecount", (Tcl_CmdProc*)pager_pagecount },
549 { "page_get", (Tcl_CmdProc*)page_get },
550 { "page_lookup", (Tcl_CmdProc*)page_lookup },
551 { "page_unref", (Tcl_CmdProc*)page_unref },
552 { "page_read", (Tcl_CmdProc*)page_read },
553 { "page_write", (Tcl_CmdProc*)page_write },
554 { "page_number", (Tcl_CmdProc*)page_number },
drhd0d006e2002-12-01 02:00:57 +0000555 { "fake_big_file", (Tcl_CmdProc*)fake_big_file },
drhc2eef3b2002-08-31 18:53:06 +0000556 };
557 int i;
558 for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){
559 Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0);
560 }
danielk1977369f27e2004-06-15 11:40:04 +0000561 Tcl_LinkVar(interp, "sqlite_io_error_pending",
danielk19776f8a5032004-05-10 10:34:51 +0000562 (char*)&sqlite3_io_error_pending, TCL_LINK_INT);
drh90f5ecb2004-07-22 01:19:35 +0000563 Tcl_LinkVar(interp, "pager_pagesize",
564 (char*)&test_pagesize, TCL_LINK_INT);
drh5c4d9702001-08-20 00:33:58 +0000565 return TCL_OK;
566}