blob: d9acb2b79166e480e4ad0f9525e4383d543742ae [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**
drhd5eb79e2007-03-15 12:17:42 +000016** $Id: test2.c,v 1.40 2007/03/15 12:17:43 drh Exp $
drh5c4d9702001-08-20 00:33:58 +000017*/
18#include "sqliteInt.h"
drheb206252004-10-01 02:00:31 +000019#include "os.h"
drh5c4d9702001-08-20 00:33:58 +000020#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;
drh5c4d9702001-08-20 00:33:58 +000033 case SQLITE_PERM: zName = "SQLITE_PERM"; break;
34 case SQLITE_ABORT: zName = "SQLITE_ABORT"; break;
35 case SQLITE_BUSY: zName = "SQLITE_BUSY"; break;
36 case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break;
37 case SQLITE_READONLY: zName = "SQLITE_READONLY"; break;
38 case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break;
39 case SQLITE_IOERR: zName = "SQLITE_IOERR"; break;
40 case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break;
drh5c4d9702001-08-20 00:33:58 +000041 case SQLITE_FULL: zName = "SQLITE_FULL"; break;
42 case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break;
43 case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break;
drh247be432002-05-10 05:44:55 +000044 case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break;
45 case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break;
drh247be432002-05-10 05:44:55 +000046 case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break;
47 case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break;
48 case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break;
drh8766c342002-11-09 00:33:15 +000049 case SQLITE_NOLFS: zName = "SQLITE_NOLFS"; break;
drh5c4d9702001-08-20 00:33:58 +000050 default: zName = "SQLITE_Unknown"; break;
51 }
52 return zName;
53}
54
55/*
drh90f5ecb2004-07-22 01:19:35 +000056** Page size and reserved size used for testing.
57*/
58static int test_pagesize = 1024;
59
60/*
drh5c4d9702001-08-20 00:33:58 +000061** Usage: pager_open FILENAME N-PAGE
62**
63** Open a new pager
64*/
65static int pager_open(
66 void *NotUsed,
67 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
68 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +000069 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +000070){
71 Pager *pPager;
72 int nPage;
73 int rc;
74 char zBuf[100];
75 if( argc!=3 ){
76 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
77 " FILENAME N-PAGE\"", 0);
78 return TCL_ERROR;
79 }
80 if( Tcl_GetInt(interp, argv[2], &nPage) ) return TCL_ERROR;
drh7bec5052005-02-06 02:45:41 +000081 rc = sqlite3pager_open(&pPager, argv[1], 0, 0);
drh5c4d9702001-08-20 00:33:58 +000082 if( rc!=SQLITE_OK ){
83 Tcl_AppendResult(interp, errorName(rc), 0);
84 return TCL_ERROR;
85 }
drh90f5ecb2004-07-22 01:19:35 +000086 sqlite3pager_set_cachesize(pPager, nPage);
87 sqlite3pager_set_pagesize(pPager, test_pagesize);
drhfe63d1c2004-09-08 20:13:04 +000088 sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPager);
drh5c4d9702001-08-20 00:33:58 +000089 Tcl_AppendResult(interp, zBuf, 0);
90 return TCL_OK;
91}
92
93/*
94** Usage: pager_close ID
95**
96** Close the given pager.
97*/
98static int pager_close(
99 void *NotUsed,
100 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
101 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000102 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000103){
104 Pager *pPager;
105 int rc;
106 if( argc!=2 ){
107 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
108 " ID\"", 0);
109 return TCL_ERROR;
110 }
drhfe63d1c2004-09-08 20:13:04 +0000111 pPager = sqlite3TextToPtr(argv[1]);
drh3aac2dd2004-04-26 14:10:20 +0000112 rc = sqlite3pager_close(pPager);
drh5c4d9702001-08-20 00:33:58 +0000113 if( rc!=SQLITE_OK ){
114 Tcl_AppendResult(interp, errorName(rc), 0);
115 return TCL_ERROR;
116 }
117 return TCL_OK;
118}
119
120/*
121** Usage: pager_rollback ID
122**
123** Rollback changes
124*/
125static int pager_rollback(
126 void *NotUsed,
127 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
128 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000129 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000130){
131 Pager *pPager;
132 int rc;
133 if( argc!=2 ){
134 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
135 " ID\"", 0);
136 return TCL_ERROR;
137 }
drhfe63d1c2004-09-08 20:13:04 +0000138 pPager = sqlite3TextToPtr(argv[1]);
drh3aac2dd2004-04-26 14:10:20 +0000139 rc = sqlite3pager_rollback(pPager);
drh5c4d9702001-08-20 00:33:58 +0000140 if( rc!=SQLITE_OK ){
141 Tcl_AppendResult(interp, errorName(rc), 0);
142 return TCL_ERROR;
143 }
144 return TCL_OK;
145}
146
147/*
148** Usage: pager_commit ID
149**
150** Commit all changes
151*/
152static int pager_commit(
153 void *NotUsed,
154 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
155 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000156 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000157){
158 Pager *pPager;
159 int rc;
160 if( argc!=2 ){
161 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
162 " ID\"", 0);
163 return TCL_ERROR;
164 }
drhfe63d1c2004-09-08 20:13:04 +0000165 pPager = sqlite3TextToPtr(argv[1]);
drh3aac2dd2004-04-26 14:10:20 +0000166 rc = sqlite3pager_commit(pPager);
drh5c4d9702001-08-20 00:33:58 +0000167 if( rc!=SQLITE_OK ){
168 Tcl_AppendResult(interp, errorName(rc), 0);
169 return TCL_ERROR;
170 }
171 return TCL_OK;
172}
173
174/*
drh3aac2dd2004-04-26 14:10:20 +0000175** Usage: pager_stmt_begin ID
drhfa86c412002-02-02 15:01:15 +0000176**
177** Start a new checkpoint.
178*/
drh3aac2dd2004-04-26 14:10:20 +0000179static int pager_stmt_begin(
drhfa86c412002-02-02 15:01:15 +0000180 void *NotUsed,
181 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
182 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000183 const char **argv /* Text of each argument */
drhfa86c412002-02-02 15:01:15 +0000184){
185 Pager *pPager;
186 int rc;
187 if( argc!=2 ){
188 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
189 " ID\"", 0);
190 return TCL_ERROR;
191 }
drhfe63d1c2004-09-08 20:13:04 +0000192 pPager = sqlite3TextToPtr(argv[1]);
drh3aac2dd2004-04-26 14:10:20 +0000193 rc = sqlite3pager_stmt_begin(pPager);
drhfa86c412002-02-02 15:01:15 +0000194 if( rc!=SQLITE_OK ){
195 Tcl_AppendResult(interp, errorName(rc), 0);
196 return TCL_ERROR;
197 }
198 return TCL_OK;
199}
200
201/*
drh3aac2dd2004-04-26 14:10:20 +0000202** Usage: pager_stmt_rollback ID
drhfa86c412002-02-02 15:01:15 +0000203**
204** Rollback changes to a checkpoint
205*/
drh3aac2dd2004-04-26 14:10:20 +0000206static int pager_stmt_rollback(
drhfa86c412002-02-02 15:01:15 +0000207 void *NotUsed,
208 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
209 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000210 const char **argv /* Text of each argument */
drhfa86c412002-02-02 15:01:15 +0000211){
212 Pager *pPager;
213 int rc;
214 if( argc!=2 ){
215 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
216 " ID\"", 0);
217 return TCL_ERROR;
218 }
drhfe63d1c2004-09-08 20:13:04 +0000219 pPager = sqlite3TextToPtr(argv[1]);
drh3aac2dd2004-04-26 14:10:20 +0000220 rc = sqlite3pager_stmt_rollback(pPager);
drhfa86c412002-02-02 15:01:15 +0000221 if( rc!=SQLITE_OK ){
222 Tcl_AppendResult(interp, errorName(rc), 0);
223 return TCL_ERROR;
224 }
225 return TCL_OK;
226}
227
228/*
drh3aac2dd2004-04-26 14:10:20 +0000229** Usage: pager_stmt_commit ID
drhfa86c412002-02-02 15:01:15 +0000230**
231** Commit changes to a checkpoint
232*/
drh3aac2dd2004-04-26 14:10:20 +0000233static int pager_stmt_commit(
drhfa86c412002-02-02 15:01:15 +0000234 void *NotUsed,
235 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
236 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000237 const char **argv /* Text of each argument */
drhfa86c412002-02-02 15:01:15 +0000238){
239 Pager *pPager;
240 int rc;
241 if( argc!=2 ){
242 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
243 " ID\"", 0);
244 return TCL_ERROR;
245 }
drhfe63d1c2004-09-08 20:13:04 +0000246 pPager = sqlite3TextToPtr(argv[1]);
drh3aac2dd2004-04-26 14:10:20 +0000247 rc = sqlite3pager_stmt_commit(pPager);
drhfa86c412002-02-02 15:01:15 +0000248 if( rc!=SQLITE_OK ){
249 Tcl_AppendResult(interp, errorName(rc), 0);
250 return TCL_ERROR;
251 }
252 return TCL_OK;
253}
254
255/*
drh5c4d9702001-08-20 00:33:58 +0000256** Usage: pager_stats ID
257**
258** Return pager statistics.
259*/
260static int pager_stats(
261 void *NotUsed,
262 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
263 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000264 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000265){
266 Pager *pPager;
267 int i, *a;
268 if( argc!=2 ){
269 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
270 " ID\"", 0);
271 return TCL_ERROR;
272 }
drhfe63d1c2004-09-08 20:13:04 +0000273 pPager = sqlite3TextToPtr(argv[1]);
drh3aac2dd2004-04-26 14:10:20 +0000274 a = sqlite3pager_stats(pPager);
drh5c4d9702001-08-20 00:33:58 +0000275 for(i=0; i<9; i++){
276 static char *zName[] = {
277 "ref", "page", "max", "size", "state", "err",
278 "hit", "miss", "ovfl",
279 };
280 char zBuf[100];
281 Tcl_AppendElement(interp, zName[i]);
drhfe63d1c2004-09-08 20:13:04 +0000282 sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",a[i]);
drh5c4d9702001-08-20 00:33:58 +0000283 Tcl_AppendElement(interp, zBuf);
284 }
285 return TCL_OK;
286}
287
288/*
289** Usage: pager_pagecount ID
290**
291** Return the size of the database file.
292*/
293static int pager_pagecount(
294 void *NotUsed,
295 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
296 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000297 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000298){
299 Pager *pPager;
300 char zBuf[100];
301 if( argc!=2 ){
302 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
303 " ID\"", 0);
304 return TCL_ERROR;
305 }
drhfe63d1c2004-09-08 20:13:04 +0000306 pPager = sqlite3TextToPtr(argv[1]);
307 sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",sqlite3pager_pagecount(pPager));
drh5c4d9702001-08-20 00:33:58 +0000308 Tcl_AppendResult(interp, zBuf, 0);
309 return TCL_OK;
310}
311
312/*
313** Usage: page_get ID PGNO
314**
315** Return a pointer to a page from the database.
316*/
317static int page_get(
318 void *NotUsed,
319 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
320 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000321 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000322){
323 Pager *pPager;
324 char zBuf[100];
325 void *pPage;
326 int pgno;
327 int rc;
328 if( argc!=3 ){
329 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
330 " ID PGNO\"", 0);
331 return TCL_ERROR;
332 }
drhfe63d1c2004-09-08 20:13:04 +0000333 pPager = sqlite3TextToPtr(argv[1]);
drh5c4d9702001-08-20 00:33:58 +0000334 if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000335 rc = sqlite3pager_get(pPager, pgno, &pPage);
drh5c4d9702001-08-20 00:33:58 +0000336 if( rc!=SQLITE_OK ){
337 Tcl_AppendResult(interp, errorName(rc), 0);
338 return TCL_ERROR;
339 }
drhfe63d1c2004-09-08 20:13:04 +0000340 sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPage);
drh5c4d9702001-08-20 00:33:58 +0000341 Tcl_AppendResult(interp, zBuf, 0);
342 return TCL_OK;
343}
344
345/*
346** Usage: page_lookup ID PGNO
347**
348** Return a pointer to a page if the page is already in cache.
349** If not in cache, return an empty string.
350*/
351static int page_lookup(
352 void *NotUsed,
353 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
354 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000355 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000356){
357 Pager *pPager;
358 char zBuf[100];
359 void *pPage;
360 int pgno;
361 if( argc!=3 ){
362 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
363 " ID PGNO\"", 0);
364 return TCL_ERROR;
365 }
drhfe63d1c2004-09-08 20:13:04 +0000366 pPager = sqlite3TextToPtr(argv[1]);
drh5c4d9702001-08-20 00:33:58 +0000367 if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
drh3aac2dd2004-04-26 14:10:20 +0000368 pPage = sqlite3pager_lookup(pPager, pgno);
drh5c4d9702001-08-20 00:33:58 +0000369 if( pPage ){
drhfe63d1c2004-09-08 20:13:04 +0000370 sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPage);
drh5c4d9702001-08-20 00:33:58 +0000371 Tcl_AppendResult(interp, zBuf, 0);
372 }
373 return TCL_OK;
374}
375
376/*
danielk1977aca790a2005-01-13 11:07:52 +0000377** Usage: pager_truncate ID PGNO
378*/
379static int pager_truncate(
380 void *NotUsed,
381 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
382 int argc, /* Number of arguments */
383 const char **argv /* Text of each argument */
384){
385 Pager *pPager;
386 int rc;
387 int pgno;
388 if( argc!=3 ){
389 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
390 " ID PGNO\"", 0);
391 return TCL_ERROR;
392 }
393 pPager = sqlite3TextToPtr(argv[1]);
394 if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR;
395 rc = sqlite3pager_truncate(pPager, pgno);
396 if( rc!=SQLITE_OK ){
397 Tcl_AppendResult(interp, errorName(rc), 0);
398 return TCL_ERROR;
399 }
400 return TCL_OK;
401}
402
403
404/*
drh5c4d9702001-08-20 00:33:58 +0000405** Usage: page_unref PAGE
406**
407** Drop a pointer to a page.
408*/
409static int page_unref(
410 void *NotUsed,
411 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
412 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000413 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000414){
415 void *pPage;
416 int rc;
417 if( argc!=2 ){
418 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
419 " PAGE\"", 0);
420 return TCL_ERROR;
421 }
drhfe63d1c2004-09-08 20:13:04 +0000422 pPage = sqlite3TextToPtr(argv[1]);
drh3aac2dd2004-04-26 14:10:20 +0000423 rc = sqlite3pager_unref(pPage);
drh5c4d9702001-08-20 00:33:58 +0000424 if( rc!=SQLITE_OK ){
425 Tcl_AppendResult(interp, errorName(rc), 0);
426 return TCL_ERROR;
427 }
428 return TCL_OK;
429}
430
431/*
432** Usage: page_read PAGE
433**
434** Return the content of a page
435*/
436static int page_read(
437 void *NotUsed,
438 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
439 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000440 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000441){
442 char zBuf[100];
443 void *pPage;
444 if( argc!=2 ){
445 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
446 " PAGE\"", 0);
447 return TCL_ERROR;
448 }
drhfe63d1c2004-09-08 20:13:04 +0000449 pPage = sqlite3TextToPtr(argv[1]);
drh5c4d9702001-08-20 00:33:58 +0000450 memcpy(zBuf, pPage, sizeof(zBuf));
451 Tcl_AppendResult(interp, zBuf, 0);
452 return TCL_OK;
453}
454
455/*
456** Usage: page_number PAGE
457**
458** Return the page number for a page.
459*/
460static int page_number(
461 void *NotUsed,
462 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
463 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000464 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000465){
466 char zBuf[100];
467 void *pPage;
468 if( argc!=2 ){
469 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
470 " PAGE\"", 0);
471 return TCL_ERROR;
472 }
drhfe63d1c2004-09-08 20:13:04 +0000473 pPage = sqlite3TextToPtr(argv[1]);
474 sqlite3_snprintf(sizeof(zBuf), zBuf, "%d", sqlite3pager_pagenumber(pPage));
drh5c4d9702001-08-20 00:33:58 +0000475 Tcl_AppendResult(interp, zBuf, 0);
476 return TCL_OK;
477}
478
479/*
480** Usage: page_write PAGE DATA
481**
482** Write something into a page.
483*/
484static int page_write(
485 void *NotUsed,
486 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
487 int argc, /* Number of arguments */
drhc2eef3b2002-08-31 18:53:06 +0000488 const char **argv /* Text of each argument */
drh5c4d9702001-08-20 00:33:58 +0000489){
490 void *pPage;
491 int rc;
492 if( argc!=3 ){
493 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
494 " PAGE DATA\"", 0);
495 return TCL_ERROR;
496 }
drhfe63d1c2004-09-08 20:13:04 +0000497 pPage = sqlite3TextToPtr(argv[1]);
drh3aac2dd2004-04-26 14:10:20 +0000498 rc = sqlite3pager_write(pPage);
drh5c4d9702001-08-20 00:33:58 +0000499 if( rc!=SQLITE_OK ){
500 Tcl_AppendResult(interp, errorName(rc), 0);
501 return TCL_ERROR;
502 }
drh90f5ecb2004-07-22 01:19:35 +0000503 strncpy((char*)pPage, argv[2], test_pagesize-1);
504 ((char*)pPage)[test_pagesize-1] = 0;
drh5c4d9702001-08-20 00:33:58 +0000505 return TCL_OK;
506}
507
danielk197744ee5bf2005-05-27 09:41:12 +0000508#ifndef SQLITE_OMIT_DISKIO
drh5c4d9702001-08-20 00:33:58 +0000509/*
drhd0d006e2002-12-01 02:00:57 +0000510** Usage: fake_big_file N FILENAME
511**
512** Write a few bytes at the N megabyte point of FILENAME. This will
513** create a large file. If the file was a valid SQLite database, then
514** the next time the database is opened, SQLite will begin allocating
515** new pages after N. If N is 2096 or bigger, this will test the
516** ability of SQLite to write to large files.
517*/
518static int fake_big_file(
519 void *NotUsed,
520 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
521 int argc, /* Number of arguments */
522 const char **argv /* Text of each argument */
523){
524 int rc;
525 int n;
drheb206252004-10-01 02:00:31 +0000526 i64 offset;
drh9cbe6352005-11-29 03:13:21 +0000527 OsFile *fd = 0;
drhd0d006e2002-12-01 02:00:57 +0000528 int readOnly = 0;
529 if( argc!=3 ){
530 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
531 " N-MEGABYTES FILE\"", 0);
532 return TCL_ERROR;
533 }
534 if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR;
drh66560ad2006-01-06 14:32:19 +0000535 rc = sqlite3OsOpenReadWrite(argv[2], &fd, &readOnly);
drhd0d006e2002-12-01 02:00:57 +0000536 if( rc ){
537 Tcl_AppendResult(interp, "open failed: ", errorName(rc), 0);
538 return TCL_ERROR;
539 }
540 offset = n;
541 offset *= 1024*1024;
drh054889e2005-11-30 03:20:31 +0000542 rc = sqlite3OsSeek(fd, offset);
drhd0d006e2002-12-01 02:00:57 +0000543 if( rc ){
544 Tcl_AppendResult(interp, "seek failed: ", errorName(rc), 0);
545 return TCL_ERROR;
546 }
drh054889e2005-11-30 03:20:31 +0000547 rc = sqlite3OsWrite(fd, "Hello, World!", 14);
548 sqlite3OsClose(&fd);
drhd0d006e2002-12-01 02:00:57 +0000549 if( rc ){
550 Tcl_AppendResult(interp, "write failed: ", errorName(rc), 0);
551 return TCL_ERROR;
552 }
drhd0d006e2002-12-01 02:00:57 +0000553 return TCL_OK;
554}
danielk197744ee5bf2005-05-27 09:41:12 +0000555#endif
drhd0d006e2002-12-01 02:00:57 +0000556
557/*
drh5c4d9702001-08-20 00:33:58 +0000558** Register commands with the TCL interpreter.
559*/
560int Sqlitetest2_Init(Tcl_Interp *interp){
drhd5eb79e2007-03-15 12:17:42 +0000561 extern int sqlite3_io_error_persist;
danielk19776f8a5032004-05-10 10:34:51 +0000562 extern int sqlite3_io_error_pending;
drhc9ac5ca2005-11-04 22:03:30 +0000563 extern int sqlite3_io_error_hit;
drh047d4832004-10-01 14:38:02 +0000564 extern int sqlite3_diskfull_pending;
drhf307a4a2005-09-09 10:46:19 +0000565 extern int sqlite3_diskfull;
drhc2eef3b2002-08-31 18:53:06 +0000566 static struct {
567 char *zName;
568 Tcl_CmdProc *xProc;
569 } aCmd[] = {
570 { "pager_open", (Tcl_CmdProc*)pager_open },
571 { "pager_close", (Tcl_CmdProc*)pager_close },
572 { "pager_commit", (Tcl_CmdProc*)pager_commit },
573 { "pager_rollback", (Tcl_CmdProc*)pager_rollback },
drh3aac2dd2004-04-26 14:10:20 +0000574 { "pager_stmt_begin", (Tcl_CmdProc*)pager_stmt_begin },
575 { "pager_stmt_commit", (Tcl_CmdProc*)pager_stmt_commit },
576 { "pager_stmt_rollback", (Tcl_CmdProc*)pager_stmt_rollback },
drhc2eef3b2002-08-31 18:53:06 +0000577 { "pager_stats", (Tcl_CmdProc*)pager_stats },
578 { "pager_pagecount", (Tcl_CmdProc*)pager_pagecount },
579 { "page_get", (Tcl_CmdProc*)page_get },
580 { "page_lookup", (Tcl_CmdProc*)page_lookup },
581 { "page_unref", (Tcl_CmdProc*)page_unref },
582 { "page_read", (Tcl_CmdProc*)page_read },
583 { "page_write", (Tcl_CmdProc*)page_write },
584 { "page_number", (Tcl_CmdProc*)page_number },
danielk1977aca790a2005-01-13 11:07:52 +0000585 { "pager_truncate", (Tcl_CmdProc*)pager_truncate },
danielk197744ee5bf2005-05-27 09:41:12 +0000586#ifndef SQLITE_OMIT_DISKIO
drhd0d006e2002-12-01 02:00:57 +0000587 { "fake_big_file", (Tcl_CmdProc*)fake_big_file },
danielk197744ee5bf2005-05-27 09:41:12 +0000588#endif
drhc2eef3b2002-08-31 18:53:06 +0000589 };
590 int i;
591 for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){
592 Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0);
593 }
danielk1977369f27e2004-06-15 11:40:04 +0000594 Tcl_LinkVar(interp, "sqlite_io_error_pending",
danielk19776f8a5032004-05-10 10:34:51 +0000595 (char*)&sqlite3_io_error_pending, TCL_LINK_INT);
drhd5eb79e2007-03-15 12:17:42 +0000596 Tcl_LinkVar(interp, "sqlite_io_error_persist",
597 (char*)&sqlite3_io_error_persist, TCL_LINK_INT);
drhc9ac5ca2005-11-04 22:03:30 +0000598 Tcl_LinkVar(interp, "sqlite_io_error_hit",
599 (char*)&sqlite3_io_error_hit, TCL_LINK_INT);
drh047d4832004-10-01 14:38:02 +0000600 Tcl_LinkVar(interp, "sqlite_diskfull_pending",
601 (char*)&sqlite3_diskfull_pending, TCL_LINK_INT);
drhf307a4a2005-09-09 10:46:19 +0000602 Tcl_LinkVar(interp, "sqlite_diskfull",
603 (char*)&sqlite3_diskfull, TCL_LINK_INT);
danielk1977fd5f5b62005-09-16 09:52:29 +0000604 Tcl_LinkVar(interp, "sqlite_pending_byte",
605 (char*)&sqlite3_pending_byte, TCL_LINK_INT);
drh90f5ecb2004-07-22 01:19:35 +0000606 Tcl_LinkVar(interp, "pager_pagesize",
607 (char*)&test_pagesize, TCL_LINK_INT);
drh5c4d9702001-08-20 00:33:58 +0000608 return TCL_OK;
609}