OLD | NEW |
1 /* | 1 /* |
2 ** 2001 September 15 | 2 ** 2001 September 15 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
11 ************************************************************************* | 11 ************************************************************************* |
12 ** Code for testing the pager.c module in SQLite. This code | 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 | 13 ** is not included in the SQLite library. It is used for automated |
14 ** testing of the SQLite library. | 14 ** testing of the SQLite library. |
15 */ | 15 */ |
16 #include "sqliteInt.h" | 16 #include "sqliteInt.h" |
17 #include "tcl.h" | 17 #include "tcl.h" |
18 #include <stdlib.h> | 18 #include <stdlib.h> |
19 #include <string.h> | 19 #include <string.h> |
20 #include <ctype.h> | 20 #include <ctype.h> |
21 | 21 |
22 /* | 22 extern const char *sqlite3ErrName(int); |
23 ** Interpret an SQLite error number | |
24 */ | |
25 static char *errorName(int rc){ | |
26 char *zName; | |
27 switch( rc ){ | |
28 case SQLITE_OK: zName = "SQLITE_OK"; break; | |
29 case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; | |
30 case SQLITE_PERM: zName = "SQLITE_PERM"; break; | |
31 case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; | |
32 case SQLITE_BUSY: zName = "SQLITE_BUSY"; break; | |
33 case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break; | |
34 case SQLITE_READONLY: zName = "SQLITE_READONLY"; break; | |
35 case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; | |
36 case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; | |
37 case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break; | |
38 case SQLITE_FULL: zName = "SQLITE_FULL"; break; | |
39 case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break; | |
40 case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break; | |
41 case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break; | |
42 case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break; | |
43 case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break; | |
44 case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break; | |
45 case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break; | |
46 case SQLITE_NOLFS: zName = "SQLITE_NOLFS"; break; | |
47 default: zName = "SQLITE_Unknown"; break; | |
48 } | |
49 return zName; | |
50 } | |
51 | 23 |
52 /* | 24 /* |
53 ** Page size and reserved size used for testing. | 25 ** Page size and reserved size used for testing. |
54 */ | 26 */ |
55 static int test_pagesize = 1024; | 27 static int test_pagesize = 1024; |
56 | 28 |
57 /* | 29 /* |
58 ** Dummy page reinitializer | 30 ** Dummy page reinitializer |
59 */ | 31 */ |
60 static void pager_test_reiniter(DbPage *pNotUsed){ | 32 static void pager_test_reiniter(DbPage *pNotUsed){ |
(...skipping 19 matching lines...) Expand all Loading... |
80 if( argc!=3 ){ | 52 if( argc!=3 ){ |
81 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 53 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
82 " FILENAME N-PAGE\"", 0); | 54 " FILENAME N-PAGE\"", 0); |
83 return TCL_ERROR; | 55 return TCL_ERROR; |
84 } | 56 } |
85 if( Tcl_GetInt(interp, argv[2], &nPage) ) return TCL_ERROR; | 57 if( Tcl_GetInt(interp, argv[2], &nPage) ) return TCL_ERROR; |
86 rc = sqlite3PagerOpen(sqlite3_vfs_find(0), &pPager, argv[1], 0, 0, | 58 rc = sqlite3PagerOpen(sqlite3_vfs_find(0), &pPager, argv[1], 0, 0, |
87 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MAIN_DB, | 59 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MAIN_DB, |
88 pager_test_reiniter); | 60 pager_test_reiniter); |
89 if( rc!=SQLITE_OK ){ | 61 if( rc!=SQLITE_OK ){ |
90 Tcl_AppendResult(interp, errorName(rc), 0); | 62 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
91 return TCL_ERROR; | 63 return TCL_ERROR; |
92 } | 64 } |
93 sqlite3PagerSetCachesize(pPager, nPage); | 65 sqlite3PagerSetCachesize(pPager, nPage); |
94 pageSize = test_pagesize; | 66 pageSize = test_pagesize; |
95 sqlite3PagerSetPagesize(pPager, &pageSize, -1); | 67 sqlite3PagerSetPagesize(pPager, &pageSize, -1); |
96 sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPager); | 68 sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPager); |
97 Tcl_AppendResult(interp, zBuf, 0); | 69 Tcl_AppendResult(interp, zBuf, 0); |
98 return TCL_OK; | 70 return TCL_OK; |
99 } | 71 } |
100 | 72 |
(...skipping 11 matching lines...) Expand all Loading... |
112 Pager *pPager; | 84 Pager *pPager; |
113 int rc; | 85 int rc; |
114 if( argc!=2 ){ | 86 if( argc!=2 ){ |
115 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 87 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
116 " ID\"", 0); | 88 " ID\"", 0); |
117 return TCL_ERROR; | 89 return TCL_ERROR; |
118 } | 90 } |
119 pPager = sqlite3TestTextToPtr(argv[1]); | 91 pPager = sqlite3TestTextToPtr(argv[1]); |
120 rc = sqlite3PagerClose(pPager); | 92 rc = sqlite3PagerClose(pPager); |
121 if( rc!=SQLITE_OK ){ | 93 if( rc!=SQLITE_OK ){ |
122 Tcl_AppendResult(interp, errorName(rc), 0); | 94 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
123 return TCL_ERROR; | 95 return TCL_ERROR; |
124 } | 96 } |
125 return TCL_OK; | 97 return TCL_OK; |
126 } | 98 } |
127 | 99 |
128 /* | 100 /* |
129 ** Usage: pager_rollback ID | 101 ** Usage: pager_rollback ID |
130 ** | 102 ** |
131 ** Rollback changes | 103 ** Rollback changes |
132 */ | 104 */ |
133 static int pager_rollback( | 105 static int pager_rollback( |
134 void *NotUsed, | 106 void *NotUsed, |
135 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | 107 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
136 int argc, /* Number of arguments */ | 108 int argc, /* Number of arguments */ |
137 const char **argv /* Text of each argument */ | 109 const char **argv /* Text of each argument */ |
138 ){ | 110 ){ |
139 Pager *pPager; | 111 Pager *pPager; |
140 int rc; | 112 int rc; |
141 if( argc!=2 ){ | 113 if( argc!=2 ){ |
142 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 114 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
143 " ID\"", 0); | 115 " ID\"", 0); |
144 return TCL_ERROR; | 116 return TCL_ERROR; |
145 } | 117 } |
146 pPager = sqlite3TestTextToPtr(argv[1]); | 118 pPager = sqlite3TestTextToPtr(argv[1]); |
147 rc = sqlite3PagerRollback(pPager); | 119 rc = sqlite3PagerRollback(pPager); |
148 if( rc!=SQLITE_OK ){ | 120 if( rc!=SQLITE_OK ){ |
149 Tcl_AppendResult(interp, errorName(rc), 0); | 121 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
150 return TCL_ERROR; | 122 return TCL_ERROR; |
151 } | 123 } |
152 return TCL_OK; | 124 return TCL_OK; |
153 } | 125 } |
154 | 126 |
155 /* | 127 /* |
156 ** Usage: pager_commit ID | 128 ** Usage: pager_commit ID |
157 ** | 129 ** |
158 ** Commit all changes | 130 ** Commit all changes |
159 */ | 131 */ |
160 static int pager_commit( | 132 static int pager_commit( |
161 void *NotUsed, | 133 void *NotUsed, |
162 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | 134 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
163 int argc, /* Number of arguments */ | 135 int argc, /* Number of arguments */ |
164 const char **argv /* Text of each argument */ | 136 const char **argv /* Text of each argument */ |
165 ){ | 137 ){ |
166 Pager *pPager; | 138 Pager *pPager; |
167 int rc; | 139 int rc; |
168 if( argc!=2 ){ | 140 if( argc!=2 ){ |
169 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 141 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
170 " ID\"", 0); | 142 " ID\"", 0); |
171 return TCL_ERROR; | 143 return TCL_ERROR; |
172 } | 144 } |
173 pPager = sqlite3TestTextToPtr(argv[1]); | 145 pPager = sqlite3TestTextToPtr(argv[1]); |
174 rc = sqlite3PagerCommitPhaseOne(pPager, 0, 0); | 146 rc = sqlite3PagerCommitPhaseOne(pPager, 0, 0); |
175 if( rc!=SQLITE_OK ){ | 147 if( rc!=SQLITE_OK ){ |
176 Tcl_AppendResult(interp, errorName(rc), 0); | 148 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
177 return TCL_ERROR; | 149 return TCL_ERROR; |
178 } | 150 } |
179 rc = sqlite3PagerCommitPhaseTwo(pPager); | 151 rc = sqlite3PagerCommitPhaseTwo(pPager); |
180 if( rc!=SQLITE_OK ){ | 152 if( rc!=SQLITE_OK ){ |
181 Tcl_AppendResult(interp, errorName(rc), 0); | 153 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
182 return TCL_ERROR; | 154 return TCL_ERROR; |
183 } | 155 } |
184 return TCL_OK; | 156 return TCL_OK; |
185 } | 157 } |
186 | 158 |
187 /* | 159 /* |
188 ** Usage: pager_stmt_begin ID | 160 ** Usage: pager_stmt_begin ID |
189 ** | 161 ** |
190 ** Start a new checkpoint. | 162 ** Start a new checkpoint. |
191 */ | 163 */ |
192 static int pager_stmt_begin( | 164 static int pager_stmt_begin( |
193 void *NotUsed, | 165 void *NotUsed, |
194 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | 166 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
195 int argc, /* Number of arguments */ | 167 int argc, /* Number of arguments */ |
196 const char **argv /* Text of each argument */ | 168 const char **argv /* Text of each argument */ |
197 ){ | 169 ){ |
198 Pager *pPager; | 170 Pager *pPager; |
199 int rc; | 171 int rc; |
200 if( argc!=2 ){ | 172 if( argc!=2 ){ |
201 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 173 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
202 " ID\"", 0); | 174 " ID\"", 0); |
203 return TCL_ERROR; | 175 return TCL_ERROR; |
204 } | 176 } |
205 pPager = sqlite3TestTextToPtr(argv[1]); | 177 pPager = sqlite3TestTextToPtr(argv[1]); |
206 rc = sqlite3PagerOpenSavepoint(pPager, 1); | 178 rc = sqlite3PagerOpenSavepoint(pPager, 1); |
207 if( rc!=SQLITE_OK ){ | 179 if( rc!=SQLITE_OK ){ |
208 Tcl_AppendResult(interp, errorName(rc), 0); | 180 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
209 return TCL_ERROR; | 181 return TCL_ERROR; |
210 } | 182 } |
211 return TCL_OK; | 183 return TCL_OK; |
212 } | 184 } |
213 | 185 |
214 /* | 186 /* |
215 ** Usage: pager_stmt_rollback ID | 187 ** Usage: pager_stmt_rollback ID |
216 ** | 188 ** |
217 ** Rollback changes to a checkpoint | 189 ** Rollback changes to a checkpoint |
218 */ | 190 */ |
219 static int pager_stmt_rollback( | 191 static int pager_stmt_rollback( |
220 void *NotUsed, | 192 void *NotUsed, |
221 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | 193 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
222 int argc, /* Number of arguments */ | 194 int argc, /* Number of arguments */ |
223 const char **argv /* Text of each argument */ | 195 const char **argv /* Text of each argument */ |
224 ){ | 196 ){ |
225 Pager *pPager; | 197 Pager *pPager; |
226 int rc; | 198 int rc; |
227 if( argc!=2 ){ | 199 if( argc!=2 ){ |
228 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 200 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
229 " ID\"", 0); | 201 " ID\"", 0); |
230 return TCL_ERROR; | 202 return TCL_ERROR; |
231 } | 203 } |
232 pPager = sqlite3TestTextToPtr(argv[1]); | 204 pPager = sqlite3TestTextToPtr(argv[1]); |
233 rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, 0); | 205 rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, 0); |
234 sqlite3PagerSavepoint(pPager, SAVEPOINT_RELEASE, 0); | 206 sqlite3PagerSavepoint(pPager, SAVEPOINT_RELEASE, 0); |
235 if( rc!=SQLITE_OK ){ | 207 if( rc!=SQLITE_OK ){ |
236 Tcl_AppendResult(interp, errorName(rc), 0); | 208 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
237 return TCL_ERROR; | 209 return TCL_ERROR; |
238 } | 210 } |
239 return TCL_OK; | 211 return TCL_OK; |
240 } | 212 } |
241 | 213 |
242 /* | 214 /* |
243 ** Usage: pager_stmt_commit ID | 215 ** Usage: pager_stmt_commit ID |
244 ** | 216 ** |
245 ** Commit changes to a checkpoint | 217 ** Commit changes to a checkpoint |
246 */ | 218 */ |
247 static int pager_stmt_commit( | 219 static int pager_stmt_commit( |
248 void *NotUsed, | 220 void *NotUsed, |
249 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | 221 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
250 int argc, /* Number of arguments */ | 222 int argc, /* Number of arguments */ |
251 const char **argv /* Text of each argument */ | 223 const char **argv /* Text of each argument */ |
252 ){ | 224 ){ |
253 Pager *pPager; | 225 Pager *pPager; |
254 int rc; | 226 int rc; |
255 if( argc!=2 ){ | 227 if( argc!=2 ){ |
256 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 228 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
257 " ID\"", 0); | 229 " ID\"", 0); |
258 return TCL_ERROR; | 230 return TCL_ERROR; |
259 } | 231 } |
260 pPager = sqlite3TestTextToPtr(argv[1]); | 232 pPager = sqlite3TestTextToPtr(argv[1]); |
261 rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_RELEASE, 0); | 233 rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_RELEASE, 0); |
262 if( rc!=SQLITE_OK ){ | 234 if( rc!=SQLITE_OK ){ |
263 Tcl_AppendResult(interp, errorName(rc), 0); | 235 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
264 return TCL_ERROR; | 236 return TCL_ERROR; |
265 } | 237 } |
266 return TCL_OK; | 238 return TCL_OK; |
267 } | 239 } |
268 | 240 |
269 /* | 241 /* |
270 ** Usage: pager_stats ID | 242 ** Usage: pager_stats ID |
271 ** | 243 ** |
272 ** Return pager statistics. | 244 ** Return pager statistics. |
273 */ | 245 */ |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 " ID PGNO\"", 0); | 318 " ID PGNO\"", 0); |
347 return TCL_ERROR; | 319 return TCL_ERROR; |
348 } | 320 } |
349 pPager = sqlite3TestTextToPtr(argv[1]); | 321 pPager = sqlite3TestTextToPtr(argv[1]); |
350 if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR; | 322 if( Tcl_GetInt(interp, argv[2], &pgno) ) return TCL_ERROR; |
351 rc = sqlite3PagerSharedLock(pPager); | 323 rc = sqlite3PagerSharedLock(pPager); |
352 if( rc==SQLITE_OK ){ | 324 if( rc==SQLITE_OK ){ |
353 rc = sqlite3PagerGet(pPager, pgno, &pPage); | 325 rc = sqlite3PagerGet(pPager, pgno, &pPage); |
354 } | 326 } |
355 if( rc!=SQLITE_OK ){ | 327 if( rc!=SQLITE_OK ){ |
356 Tcl_AppendResult(interp, errorName(rc), 0); | 328 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
357 return TCL_ERROR; | 329 return TCL_ERROR; |
358 } | 330 } |
359 sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPage); | 331 sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPage); |
360 Tcl_AppendResult(interp, zBuf, 0); | 332 Tcl_AppendResult(interp, zBuf, 0); |
361 return TCL_OK; | 333 return TCL_OK; |
362 } | 334 } |
363 | 335 |
364 /* | 336 /* |
365 ** Usage: page_lookup ID PGNO | 337 ** Usage: page_lookup ID PGNO |
366 ** | 338 ** |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 char *pData; | 472 char *pData; |
501 int rc; | 473 int rc; |
502 if( argc!=3 ){ | 474 if( argc!=3 ){ |
503 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 475 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
504 " PAGE DATA\"", 0); | 476 " PAGE DATA\"", 0); |
505 return TCL_ERROR; | 477 return TCL_ERROR; |
506 } | 478 } |
507 pPage = (DbPage *)sqlite3TestTextToPtr(argv[1]); | 479 pPage = (DbPage *)sqlite3TestTextToPtr(argv[1]); |
508 rc = sqlite3PagerWrite(pPage); | 480 rc = sqlite3PagerWrite(pPage); |
509 if( rc!=SQLITE_OK ){ | 481 if( rc!=SQLITE_OK ){ |
510 Tcl_AppendResult(interp, errorName(rc), 0); | 482 Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
511 return TCL_ERROR; | 483 return TCL_ERROR; |
512 } | 484 } |
513 pData = sqlite3PagerGetData(pPage); | 485 pData = sqlite3PagerGetData(pPage); |
514 strncpy(pData, argv[2], test_pagesize-1); | 486 strncpy(pData, argv[2], test_pagesize-1); |
515 pData[test_pagesize-1] = 0; | 487 pData[test_pagesize-1] = 0; |
516 return TCL_OK; | 488 return TCL_OK; |
517 } | 489 } |
518 | 490 |
519 #ifndef SQLITE_OMIT_DISKIO | 491 #ifndef SQLITE_OMIT_DISKIO |
520 /* | 492 /* |
521 ** Usage: fake_big_file N FILENAME | 493 ** Usage: fake_big_file N FILENAME |
522 ** | 494 ** |
523 ** Write a few bytes at the N megabyte point of FILENAME. This will | 495 ** Write a few bytes at the N megabyte point of FILENAME. This will |
524 ** create a large file. If the file was a valid SQLite database, then | 496 ** create a large file. If the file was a valid SQLite database, then |
525 ** the next time the database is opened, SQLite will begin allocating | 497 ** the next time the database is opened, SQLite will begin allocating |
526 ** new pages after N. If N is 2096 or bigger, this will test the | 498 ** new pages after N. If N is 2096 or bigger, this will test the |
527 ** ability of SQLite to write to large files. | 499 ** ability of SQLite to write to large files. |
528 */ | 500 */ |
529 static int fake_big_file( | 501 static int fake_big_file( |
530 void *NotUsed, | 502 void *NotUsed, |
531 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | 503 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
532 int argc, /* Number of arguments */ | 504 int argc, /* Number of arguments */ |
533 const char **argv /* Text of each argument */ | 505 const char **argv /* Text of each argument */ |
534 ){ | 506 ){ |
535 sqlite3_vfs *pVfs; | 507 sqlite3_vfs *pVfs; |
536 sqlite3_file *fd = 0; | 508 sqlite3_file *fd = 0; |
537 int rc; | 509 int rc; |
538 int n; | 510 int n; |
539 i64 offset; | 511 i64 offset; |
| 512 char *zFile; |
| 513 int nFile; |
540 if( argc!=3 ){ | 514 if( argc!=3 ){ |
541 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 515 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
542 " N-MEGABYTES FILE\"", 0); | 516 " N-MEGABYTES FILE\"", 0); |
543 return TCL_ERROR; | 517 return TCL_ERROR; |
544 } | 518 } |
545 if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR; | 519 if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR; |
546 | 520 |
547 pVfs = sqlite3_vfs_find(0); | 521 pVfs = sqlite3_vfs_find(0); |
548 rc = sqlite3OsOpenMalloc(pVfs, argv[2], &fd, | 522 nFile = (int)strlen(argv[2]); |
| 523 zFile = sqlite3_malloc( nFile+2 ); |
| 524 if( zFile==0 ) return TCL_ERROR; |
| 525 memcpy(zFile, argv[2], nFile+1); |
| 526 zFile[nFile+1] = 0; |
| 527 rc = sqlite3OsOpenMalloc(pVfs, zFile, &fd, |
549 (SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB), 0 | 528 (SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB), 0 |
550 ); | 529 ); |
551 if( rc ){ | 530 if( rc ){ |
552 Tcl_AppendResult(interp, "open failed: ", errorName(rc), 0); | 531 Tcl_AppendResult(interp, "open failed: ", sqlite3ErrName(rc), 0); |
| 532 sqlite3_free(zFile); |
553 return TCL_ERROR; | 533 return TCL_ERROR; |
554 } | 534 } |
555 offset = n; | 535 offset = n; |
556 offset *= 1024*1024; | 536 offset *= 1024*1024; |
557 rc = sqlite3OsWrite(fd, "Hello, World!", 14, offset); | 537 rc = sqlite3OsWrite(fd, "Hello, World!", 14, offset); |
558 sqlite3OsCloseFree(fd); | 538 sqlite3OsCloseFree(fd); |
| 539 sqlite3_free(zFile); |
559 if( rc ){ | 540 if( rc ){ |
560 Tcl_AppendResult(interp, "write failed: ", errorName(rc), 0); | 541 Tcl_AppendResult(interp, "write failed: ", sqlite3ErrName(rc), 0); |
561 return TCL_ERROR; | 542 return TCL_ERROR; |
562 } | 543 } |
563 return TCL_OK; | 544 return TCL_OK; |
564 } | 545 } |
565 #endif | 546 #endif |
566 | 547 |
567 | 548 |
568 /* | 549 /* |
569 ** test_control_pending_byte PENDING_BYTE | 550 ** test_control_pending_byte PENDING_BYTE |
570 ** | 551 ** |
571 ** Set the PENDING_BYTE using the sqlite3_test_control() interface. | 552 ** Set the PENDING_BYTE using the sqlite3_test_control() interface. |
572 */ | 553 */ |
573 static int testPendingByte( | 554 static int testPendingByte( |
574 void *NotUsed, | 555 void *NotUsed, |
575 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | 556 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
576 int argc, /* Number of arguments */ | 557 int argc, /* Number of arguments */ |
577 const char **argv /* Text of each argument */ | 558 const char **argv /* Text of each argument */ |
578 ){ | 559 ){ |
579 int pbyte; | 560 int pbyte; |
580 int rc; | 561 int rc; |
581 if( argc!=2 ){ | 562 if( argc!=2 ){ |
582 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 563 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
583 " PENDING-BYTE\"", (void*)0); | 564 " PENDING-BYTE\"", (void*)0); |
584 return TCL_ERROR; | 565 return TCL_ERROR; |
585 } | 566 } |
586 if( Tcl_GetInt(interp, argv[1], &pbyte) ) return TCL_ERROR; | 567 if( Tcl_GetInt(interp, argv[1], &pbyte) ) return TCL_ERROR; |
587 rc = sqlite3_test_control(SQLITE_TESTCTRL_PENDING_BYTE, pbyte); | 568 rc = sqlite3_test_control(SQLITE_TESTCTRL_PENDING_BYTE, pbyte); |
588 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | 569 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); |
589 return TCL_OK; | 570 return TCL_OK; |
590 } | 571 } |
| 572 |
| 573 /* |
| 574 ** The sqlite3FaultSim() callback: |
| 575 */ |
| 576 static Tcl_Interp *faultSimInterp = 0; |
| 577 static int faultSimScriptSize = 0; |
| 578 static char *faultSimScript; |
| 579 static int faultSimCallback(int x){ |
| 580 char zInt[30]; |
| 581 int i; |
| 582 int isNeg; |
| 583 int rc; |
| 584 if( x==0 ){ |
| 585 memcpy(faultSimScript+faultSimScriptSize, "0", 2); |
| 586 }else{ |
| 587 /* Convert x to text without using any sqlite3 routines */ |
| 588 if( x<0 ){ |
| 589 isNeg = 1; |
| 590 x = -x; |
| 591 }else{ |
| 592 isNeg = 0; |
| 593 } |
| 594 zInt[sizeof(zInt)-1] = 0; |
| 595 for(i=sizeof(zInt)-2; i>0 && x>0; i--, x /= 10){ |
| 596 zInt[i] = (x%10) + '0'; |
| 597 } |
| 598 if( isNeg ) zInt[i--] = '-'; |
| 599 memcpy(faultSimScript+faultSimScriptSize, zInt+i+1, sizeof(zInt)-i); |
| 600 } |
| 601 rc = Tcl_Eval(faultSimInterp, faultSimScript); |
| 602 if( rc ){ |
| 603 fprintf(stderr, "fault simulator script failed: [%s]", faultSimScript); |
| 604 rc = SQLITE_ERROR; |
| 605 }else{ |
| 606 rc = atoi(Tcl_GetStringResult(faultSimInterp)); |
| 607 } |
| 608 Tcl_ResetResult(faultSimInterp); |
| 609 return rc; |
| 610 } |
| 611 |
| 612 /* |
| 613 ** sqlite3_test_control_fault_install SCRIPT |
| 614 ** |
| 615 ** Arrange to invoke SCRIPT with the integer argument to sqlite3FaultSim() |
| 616 ** appended, whenever sqlite3FaultSim() is called. Or, if SCRIPT is the |
| 617 ** empty string, cancel the sqlite3FaultSim() callback. |
| 618 */ |
| 619 static int faultInstallCmd( |
| 620 void *NotUsed, |
| 621 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
| 622 int argc, /* Number of arguments */ |
| 623 const char **argv /* Text of each argument */ |
| 624 ){ |
| 625 const char *zScript; |
| 626 int nScript; |
| 627 int rc; |
| 628 if( argc!=1 && argc!=2 ){ |
| 629 Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
| 630 " SCRIPT\"", (void*)0); |
| 631 } |
| 632 zScript = argc==2 ? argv[1] : ""; |
| 633 nScript = (int)strlen(zScript); |
| 634 if( faultSimScript ){ |
| 635 free(faultSimScript); |
| 636 faultSimScript = 0; |
| 637 } |
| 638 if( nScript==0 ){ |
| 639 rc = sqlite3_test_control(SQLITE_TESTCTRL_FAULT_INSTALL, 0); |
| 640 }else{ |
| 641 faultSimScript = malloc( nScript+100 ); |
| 642 if( faultSimScript==0 ){ |
| 643 Tcl_AppendResult(interp, "out of memory", (void*)0); |
| 644 return SQLITE_ERROR; |
| 645 } |
| 646 memcpy(faultSimScript, zScript, nScript); |
| 647 faultSimScript[nScript] = ' '; |
| 648 faultSimScriptSize = nScript+1; |
| 649 faultSimInterp = interp; |
| 650 rc = sqlite3_test_control(SQLITE_TESTCTRL_FAULT_INSTALL, faultSimCallback); |
| 651 } |
| 652 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); |
| 653 return SQLITE_OK; |
| 654 } |
591 | 655 |
592 /* | 656 /* |
593 ** sqlite3BitvecBuiltinTest SIZE PROGRAM | 657 ** sqlite3BitvecBuiltinTest SIZE PROGRAM |
594 ** | 658 ** |
595 ** Invoke the SQLITE_TESTCTRL_BITVEC_TEST operator on test_control. | 659 ** Invoke the SQLITE_TESTCTRL_BITVEC_TEST operator on test_control. |
596 ** See comments on sqlite3BitvecBuiltinTest() for additional information. | 660 ** See comments on sqlite3BitvecBuiltinTest() for additional information. |
597 */ | 661 */ |
598 static int testBitvecBuiltinTest( | 662 static int testBitvecBuiltinTest( |
599 void *NotUsed, | 663 void *NotUsed, |
600 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | 664 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
650 { "page_lookup", (Tcl_CmdProc*)page_lookup }, | 714 { "page_lookup", (Tcl_CmdProc*)page_lookup }, |
651 { "page_unref", (Tcl_CmdProc*)page_unref }, | 715 { "page_unref", (Tcl_CmdProc*)page_unref }, |
652 { "page_read", (Tcl_CmdProc*)page_read }, | 716 { "page_read", (Tcl_CmdProc*)page_read }, |
653 { "page_write", (Tcl_CmdProc*)page_write }, | 717 { "page_write", (Tcl_CmdProc*)page_write }, |
654 { "page_number", (Tcl_CmdProc*)page_number }, | 718 { "page_number", (Tcl_CmdProc*)page_number }, |
655 { "pager_truncate", (Tcl_CmdProc*)pager_truncate }, | 719 { "pager_truncate", (Tcl_CmdProc*)pager_truncate }, |
656 #ifndef SQLITE_OMIT_DISKIO | 720 #ifndef SQLITE_OMIT_DISKIO |
657 { "fake_big_file", (Tcl_CmdProc*)fake_big_file }, | 721 { "fake_big_file", (Tcl_CmdProc*)fake_big_file }, |
658 #endif | 722 #endif |
659 { "sqlite3BitvecBuiltinTest",(Tcl_CmdProc*)testBitvecBuiltinTest }, | 723 { "sqlite3BitvecBuiltinTest",(Tcl_CmdProc*)testBitvecBuiltinTest }, |
660 { "sqlite3_test_control_pending_byte", (Tcl_CmdProc*)testPendingByte }, | 724 { "sqlite3_test_control_pending_byte", (Tcl_CmdProc*)testPendingByte }, |
| 725 { "sqlite3_test_control_fault_install", (Tcl_CmdProc*)faultInstallCmd }, |
661 }; | 726 }; |
662 int i; | 727 int i; |
663 for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){ | 728 for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){ |
664 Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0); | 729 Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0); |
665 } | 730 } |
666 Tcl_LinkVar(interp, "sqlite_io_error_pending", | 731 Tcl_LinkVar(interp, "sqlite_io_error_pending", |
667 (char*)&sqlite3_io_error_pending, TCL_LINK_INT); | 732 (char*)&sqlite3_io_error_pending, TCL_LINK_INT); |
668 Tcl_LinkVar(interp, "sqlite_io_error_persist", | 733 Tcl_LinkVar(interp, "sqlite_io_error_persist", |
669 (char*)&sqlite3_io_error_persist, TCL_LINK_INT); | 734 (char*)&sqlite3_io_error_persist, TCL_LINK_INT); |
670 Tcl_LinkVar(interp, "sqlite_io_error_hit", | 735 Tcl_LinkVar(interp, "sqlite_io_error_hit", |
671 (char*)&sqlite3_io_error_hit, TCL_LINK_INT); | 736 (char*)&sqlite3_io_error_hit, TCL_LINK_INT); |
672 Tcl_LinkVar(interp, "sqlite_io_error_hardhit", | 737 Tcl_LinkVar(interp, "sqlite_io_error_hardhit", |
673 (char*)&sqlite3_io_error_hardhit, TCL_LINK_INT); | 738 (char*)&sqlite3_io_error_hardhit, TCL_LINK_INT); |
674 Tcl_LinkVar(interp, "sqlite_diskfull_pending", | 739 Tcl_LinkVar(interp, "sqlite_diskfull_pending", |
675 (char*)&sqlite3_diskfull_pending, TCL_LINK_INT); | 740 (char*)&sqlite3_diskfull_pending, TCL_LINK_INT); |
676 Tcl_LinkVar(interp, "sqlite_diskfull", | 741 Tcl_LinkVar(interp, "sqlite_diskfull", |
677 (char*)&sqlite3_diskfull, TCL_LINK_INT); | 742 (char*)&sqlite3_diskfull, TCL_LINK_INT); |
678 #ifndef SQLITE_OMIT_WSD | 743 #ifndef SQLITE_OMIT_WSD |
679 Tcl_LinkVar(interp, "sqlite_pending_byte", | 744 Tcl_LinkVar(interp, "sqlite_pending_byte", |
680 (char*)&sqlite3PendingByte, TCL_LINK_INT | TCL_LINK_READ_ONLY); | 745 (char*)&sqlite3PendingByte, TCL_LINK_INT | TCL_LINK_READ_ONLY); |
681 #endif | 746 #endif |
682 return TCL_OK; | 747 return TCL_OK; |
683 } | 748 } |
OLD | NEW |