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 ** A TCL Interface to SQLite 13 ** 14 ** $Id: tclsqlite.c,v 1.83 2004/06/10 10:50:38 danielk1977 Exp $ 15 */ 16 #ifndef NO_TCL /* Omit this whole file if TCL is unavailable */ 17 18 #include "sqliteInt.h" 19 #include "tcl.h" 20 #include <stdlib.h> 21 #include <string.h> 22 #include <assert.h> 23 24 /* 25 ** If TCL uses UTF-8 and SQLite is configured to use iso8859, then we 26 ** have to do a translation when going between the two. Set the 27 ** UTF_TRANSLATION_NEEDED macro to indicate that we need to do 28 ** this translation. 29 */ 30 #if defined(TCL_UTF_MAX) && !defined(SQLITE_UTF8) 31 # define UTF_TRANSLATION_NEEDED 1 32 #endif 33 34 /* 35 ** New SQL functions can be created as TCL scripts. Each such function 36 ** is described by an instance of the following structure. 37 */ 38 typedef struct SqlFunc SqlFunc; 39 struct SqlFunc { 40 Tcl_Interp *interp; /* The TCL interpret to execute the function */ 41 char *zScript; /* The script to be run */ 42 SqlFunc *pNext; /* Next function on the list of them all */ 43 }; 44 45 /* 46 ** New collation sequences function can be created as TCL scripts. Each such 47 ** function is described by an instance of the following structure. 48 */ 49 typedef struct SqlCollate SqlCollate; 50 struct SqlCollate { 51 Tcl_Interp *interp; /* The TCL interpret to execute the function */ 52 char *zScript; /* The script to be run */ 53 SqlCollate *pNext; /* Next function on the list of them all */ 54 }; 55 56 /* 57 ** There is one instance of this structure for each SQLite database 58 ** that has been opened by the SQLite TCL interface. 59 */ 60 typedef struct SqliteDb SqliteDb; 61 struct SqliteDb { 62 sqlite *db; /* The "real" database structure */ 63 Tcl_Interp *interp; /* The interpreter used for this database */ 64 char *zBusy; /* The busy callback routine */ 65 char *zCommit; /* The commit hook callback routine */ 66 char *zTrace; /* The trace callback routine */ 67 char *zProgress; /* The progress callback routine */ 68 char *zAuth; /* The authorization callback routine */ 69 SqlFunc *pFunc; /* List of SQL functions */ 70 SqlCollate *pCollate; /* List of SQL collation functions */ 71 int rc; /* Return code of most recent sqlite3_exec() */ 72 int nChange; /* Database changes for the most recent eval */ 73 Tcl_Obj *pCollateNeeded; /* Collation needed script */ 74 }; 75 76 /* 77 ** An instance of this structure passes information thru the sqlite 78 ** logic from the original TCL command into the callback routine. 79 */ 80 typedef struct CallbackData CallbackData; 81 struct CallbackData { 82 Tcl_Interp *interp; /* The TCL interpreter */ 83 char *zArray; /* The array into which data is written */ 84 Tcl_Obj *pCode; /* The code to execute for each row */ 85 int once; /* Set for first callback only */ 86 int tcl_rc; /* Return code from TCL script */ 87 int nColName; /* Number of entries in the azColName[] array */ 88 char **azColName; /* Column names translated to UTF-8 */ 89 }; 90 91 /* 92 ** This is a second alternative callback for database queries. A the 93 ** first column of the first row of the result is made the TCL result. 94 */ 95 static int DbEvalCallback3( 96 void *clientData, /* An instance of CallbackData */ 97 int nCol, /* Number of columns in the result */ 98 char ** azCol, /* Data for each column */ 99 char ** azN /* Name for each column */ 100 ){ 101 Tcl_Interp *interp = (Tcl_Interp*)clientData; 102 Tcl_Obj *pElem; 103 if( azCol==0 ) return 1; 104 if( nCol==0 ) return 1; 105 #ifdef UTF_TRANSLATION_NEEDED 106 { 107 Tcl_DString dCol; 108 Tcl_DStringInit(&dCol); 109 Tcl_ExternalToUtfDString(NULL, azCol[0], -1, &dCol); 110 pElem = Tcl_NewStringObj(Tcl_DStringValue(&dCol), -1); 111 Tcl_DStringFree(&dCol); 112 } 113 #else 114 pElem = Tcl_NewStringObj(azCol[0], -1); 115 #endif 116 Tcl_SetObjResult(interp, pElem); 117 return 1; 118 } 119 120 /* 121 ** Called when the command is deleted. 122 */ 123 static void DbDeleteCmd(void *db){ 124 SqliteDb *pDb = (SqliteDb*)db; 125 sqlite3_close(pDb->db); 126 while( pDb->pFunc ){ 127 SqlFunc *pFunc = pDb->pFunc; 128 pDb->pFunc = pFunc->pNext; 129 Tcl_Free((char*)pFunc); 130 } 131 while( pDb->pCollate ){ 132 SqlCollate *pCollate = pDb->pCollate; 133 pDb->pCollate = pCollate->pNext; 134 Tcl_Free((char*)pCollate); 135 } 136 if( pDb->zBusy ){ 137 Tcl_Free(pDb->zBusy); 138 } 139 if( pDb->zTrace ){ 140 Tcl_Free(pDb->zTrace); 141 } 142 if( pDb->zAuth ){ 143 Tcl_Free(pDb->zAuth); 144 } 145 Tcl_Free((char*)pDb); 146 } 147 148 /* 149 ** This routine is called when a database file is locked while trying 150 ** to execute SQL. 151 */ 152 static int DbBusyHandler(void *cd, const char *zTable, int nTries){ 153 SqliteDb *pDb = (SqliteDb*)cd; 154 int rc; 155 char zVal[30]; 156 char *zCmd; 157 Tcl_DString cmd; 158 159 Tcl_DStringInit(&cmd); 160 Tcl_DStringAppend(&cmd, pDb->zBusy, -1); 161 Tcl_DStringAppendElement(&cmd, zTable); 162 sprintf(zVal, " %d", nTries); 163 Tcl_DStringAppend(&cmd, zVal, -1); 164 zCmd = Tcl_DStringValue(&cmd); 165 rc = Tcl_Eval(pDb->interp, zCmd); 166 Tcl_DStringFree(&cmd); 167 if( rc!=TCL_OK || atoi(Tcl_GetStringResult(pDb->interp)) ){ 168 return 0; 169 } 170 return 1; 171 } 172 173 /* 174 ** This routine is invoked as the 'progress callback' for the database. 175 */ 176 static int DbProgressHandler(void *cd){ 177 SqliteDb *pDb = (SqliteDb*)cd; 178 int rc; 179 180 assert( pDb->zProgress ); 181 rc = Tcl_Eval(pDb->interp, pDb->zProgress); 182 if( rc!=TCL_OK || atoi(Tcl_GetStringResult(pDb->interp)) ){ 183 return 1; 184 } 185 return 0; 186 } 187 188 /* 189 ** This routine is called by the SQLite trace handler whenever a new 190 ** block of SQL is executed. The TCL script in pDb->zTrace is executed. 191 */ 192 static void DbTraceHandler(void *cd, const char *zSql){ 193 SqliteDb *pDb = (SqliteDb*)cd; 194 Tcl_DString str; 195 196 Tcl_DStringInit(&str); 197 Tcl_DStringAppend(&str, pDb->zTrace, -1); 198 Tcl_DStringAppendElement(&str, zSql); 199 Tcl_Eval(pDb->interp, Tcl_DStringValue(&str)); 200 Tcl_DStringFree(&str); 201 Tcl_ResetResult(pDb->interp); 202 } 203 204 /* 205 ** This routine is called when a transaction is committed. The 206 ** TCL script in pDb->zCommit is executed. If it returns non-zero or 207 ** if it throws an exception, the transaction is rolled back instead 208 ** of being committed. 209 */ 210 static int DbCommitHandler(void *cd){ 211 SqliteDb *pDb = (SqliteDb*)cd; 212 int rc; 213 214 rc = Tcl_Eval(pDb->interp, pDb->zCommit); 215 if( rc!=TCL_OK || atoi(Tcl_GetStringResult(pDb->interp)) ){ 216 return 1; 217 } 218 return 0; 219 } 220 221 static void tclCollateNeeded( 222 void *pCtx, 223 sqlite *db, 224 int enc, 225 const char *zName 226 ){ 227 SqliteDb *pDb = (SqliteDb *)pCtx; 228 Tcl_Obj *pScript = Tcl_DuplicateObj(pDb->pCollateNeeded); 229 Tcl_IncrRefCount(pScript); 230 Tcl_ListObjAppendElement(0, pScript, Tcl_NewStringObj(zName, -1)); 231 Tcl_EvalObjEx(pDb->interp, pScript, 0); 232 Tcl_DecrRefCount(pScript); 233 } 234 235 /* 236 ** This routine is called to evaluate an SQL collation function implemented 237 ** using TCL script. 238 */ 239 static int tclSqlCollate( 240 void *pCtx, 241 int nA, 242 const void *zA, 243 int nB, 244 const void *zB 245 ){ 246 SqlCollate *p = (SqlCollate *)pCtx; 247 Tcl_Obj *pCmd; 248 249 pCmd = Tcl_NewStringObj(p->zScript, -1); 250 Tcl_IncrRefCount(pCmd); 251 Tcl_ListObjAppendElement(p->interp, pCmd, Tcl_NewStringObj(zA, nA)); 252 Tcl_ListObjAppendElement(p->interp, pCmd, Tcl_NewStringObj(zB, nB)); 253 Tcl_EvalObjEx(p->interp, pCmd, 0); 254 Tcl_DecrRefCount(pCmd); 255 return (atoi(Tcl_GetStringResult(p->interp))); 256 } 257 258 /* 259 ** This routine is called to evaluate an SQL function implemented 260 ** using TCL script. 261 */ 262 static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ 263 SqlFunc *p = sqlite3_user_data(context); 264 Tcl_DString cmd; 265 int i; 266 int rc; 267 268 Tcl_DStringInit(&cmd); 269 Tcl_DStringAppend(&cmd, p->zScript, -1); 270 for(i=0; i<argc; i++){ 271 if( SQLITE_NULL==sqlite3_value_type(argv[i]) ){ 272 Tcl_DStringAppendElement(&cmd, ""); 273 }else{ 274 Tcl_DStringAppendElement(&cmd, sqlite3_value_text(argv[i])); 275 } 276 } 277 rc = Tcl_Eval(p->interp, Tcl_DStringValue(&cmd)); 278 if( rc ){ 279 sqlite3_result_error(context, Tcl_GetStringResult(p->interp), -1); 280 }else{ 281 sqlite3_result_text(context, Tcl_GetStringResult(p->interp), -1, 1); 282 } 283 } 284 #ifndef SQLITE_OMIT_AUTHORIZATION 285 /* 286 ** This is the authentication function. It appends the authentication 287 ** type code and the two arguments to zCmd[] then invokes the result 288 ** on the interpreter. The reply is examined to determine if the 289 ** authentication fails or succeeds. 290 */ 291 static int auth_callback( 292 void *pArg, 293 int code, 294 const char *zArg1, 295 const char *zArg2, 296 const char *zArg3, 297 const char *zArg4 298 ){ 299 char *zCode; 300 Tcl_DString str; 301 int rc; 302 const char *zReply; 303 SqliteDb *pDb = (SqliteDb*)pArg; 304 305 switch( code ){ 306 case SQLITE_COPY : zCode="SQLITE_COPY"; break; 307 case SQLITE_CREATE_INDEX : zCode="SQLITE_CREATE_INDEX"; break; 308 case SQLITE_CREATE_TABLE : zCode="SQLITE_CREATE_TABLE"; break; 309 case SQLITE_CREATE_TEMP_INDEX : zCode="SQLITE_CREATE_TEMP_INDEX"; break; 310 case SQLITE_CREATE_TEMP_TABLE : zCode="SQLITE_CREATE_TEMP_TABLE"; break; 311 case SQLITE_CREATE_TEMP_TRIGGER: zCode="SQLITE_CREATE_TEMP_TRIGGER"; break; 312 case SQLITE_CREATE_TEMP_VIEW : zCode="SQLITE_CREATE_TEMP_VIEW"; break; 313 case SQLITE_CREATE_TRIGGER : zCode="SQLITE_CREATE_TRIGGER"; break; 314 case SQLITE_CREATE_VIEW : zCode="SQLITE_CREATE_VIEW"; break; 315 case SQLITE_DELETE : zCode="SQLITE_DELETE"; break; 316 case SQLITE_DROP_INDEX : zCode="SQLITE_DROP_INDEX"; break; 317 case SQLITE_DROP_TABLE : zCode="SQLITE_DROP_TABLE"; break; 318 case SQLITE_DROP_TEMP_INDEX : zCode="SQLITE_DROP_TEMP_INDEX"; break; 319 case SQLITE_DROP_TEMP_TABLE : zCode="SQLITE_DROP_TEMP_TABLE"; break; 320 case SQLITE_DROP_TEMP_TRIGGER : zCode="SQLITE_DROP_TEMP_TRIGGER"; break; 321 case SQLITE_DROP_TEMP_VIEW : zCode="SQLITE_DROP_TEMP_VIEW"; break; 322 case SQLITE_DROP_TRIGGER : zCode="SQLITE_DROP_TRIGGER"; break; 323 case SQLITE_DROP_VIEW : zCode="SQLITE_DROP_VIEW"; break; 324 case SQLITE_INSERT : zCode="SQLITE_INSERT"; break; 325 case SQLITE_PRAGMA : zCode="SQLITE_PRAGMA"; break; 326 case SQLITE_READ : zCode="SQLITE_READ"; break; 327 case SQLITE_SELECT : zCode="SQLITE_SELECT"; break; 328 case SQLITE_TRANSACTION : zCode="SQLITE_TRANSACTION"; break; 329 case SQLITE_UPDATE : zCode="SQLITE_UPDATE"; break; 330 case SQLITE_ATTACH : zCode="SQLITE_ATTACH"; break; 331 case SQLITE_DETACH : zCode="SQLITE_DETACH"; break; 332 default : zCode="????"; break; 333 } 334 Tcl_DStringInit(&str); 335 Tcl_DStringAppend(&str, pDb->zAuth, -1); 336 Tcl_DStringAppendElement(&str, zCode); 337 Tcl_DStringAppendElement(&str, zArg1 ? zArg1 : ""); 338 Tcl_DStringAppendElement(&str, zArg2 ? zArg2 : ""); 339 Tcl_DStringAppendElement(&str, zArg3 ? zArg3 : ""); 340 Tcl_DStringAppendElement(&str, zArg4 ? zArg4 : ""); 341 rc = Tcl_GlobalEval(pDb->interp, Tcl_DStringValue(&str)); 342 Tcl_DStringFree(&str); 343 zReply = Tcl_GetStringResult(pDb->interp); 344 if( strcmp(zReply,"SQLITE_OK")==0 ){ 345 rc = SQLITE_OK; 346 }else if( strcmp(zReply,"SQLITE_DENY")==0 ){ 347 rc = SQLITE_DENY; 348 }else if( strcmp(zReply,"SQLITE_IGNORE")==0 ){ 349 rc = SQLITE_IGNORE; 350 }else{ 351 rc = 999; 352 } 353 return rc; 354 } 355 #endif /* SQLITE_OMIT_AUTHORIZATION */ 356 357 /* 358 ** zText is a pointer to text obtained via an sqlite3_result_text() 359 ** or similar interface. This routine returns a Tcl string object, 360 ** reference count set to 0, containing the text. If a translation 361 ** between iso8859 and UTF-8 is required, it is preformed. 362 */ 363 static Tcl_Obj *dbTextToObj(char const *zText){ 364 Tcl_Obj *pVal; 365 #ifdef UTF_TRANSLATION_NEEDED 366 Tcl_DString dCol; 367 Tcl_DStringInit(&dCol); 368 Tcl_ExternalToUtfDString(NULL, zText, -1, &dCol); 369 pVal = Tcl_NewStringObj(Tcl_DStringValue(&dCol), -1); 370 Tcl_DStringFree(&dCol); 371 #else 372 pVal = Tcl_NewStringObj(zText, -1); 373 #endif 374 return pVal; 375 } 376 377 /* 378 ** The "sqlite" command below creates a new Tcl command for each 379 ** connection it opens to an SQLite database. This routine is invoked 380 ** whenever one of those connection-specific commands is executed 381 ** in Tcl. For example, if you run Tcl code like this: 382 ** 383 ** sqlite db1 "my_database" 384 ** db1 close 385 ** 386 ** The first command opens a connection to the "my_database" database 387 ** and calls that connection "db1". The second command causes this 388 ** subroutine to be invoked. 389 */ 390 static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ 391 SqliteDb *pDb = (SqliteDb*)cd; 392 int choice; 393 int rc = TCL_OK; 394 static const char *DB_strs[] = { 395 "authorizer", "busy", "changes", 396 "close", "commit_hook", "complete", 397 "errorcode", "eval", "function", 398 "last_insert_rowid", "last_statement_changes", "onecolumn", 399 "progress", "rekey", "timeout", 400 "trace", "collate", "collation_needed", 401 0 402 }; 403 enum DB_enum { 404 DB_AUTHORIZER, DB_BUSY, DB_CHANGES, 405 DB_CLOSE, DB_COMMIT_HOOK, DB_COMPLETE, 406 DB_ERRORCODE, DB_EVAL, DB_FUNCTION, 407 DB_LAST_INSERT_ROWID, DB_LAST_STATEMENT_CHANGES, DB_ONECOLUMN, 408 DB_PROGRESS, DB_REKEY, DB_TIMEOUT, 409 DB_TRACE, DB_COLLATE, DB_COLLATION_NEEDED 410 }; 411 412 if( objc<2 ){ 413 Tcl_WrongNumArgs(interp, 1, objv, "SUBCOMMAND ..."); 414 return TCL_ERROR; 415 } 416 if( Tcl_GetIndexFromObj(interp, objv[1], DB_strs, "option", 0, &choice) ){ 417 return TCL_ERROR; 418 } 419 420 switch( (enum DB_enum)choice ){ 421 422 /* $db authorizer ?CALLBACK? 423 ** 424 ** Invoke the given callback to authorize each SQL operation as it is 425 ** compiled. 5 arguments are appended to the callback before it is 426 ** invoked: 427 ** 428 ** (1) The authorization type (ex: SQLITE_CREATE_TABLE, SQLITE_INSERT, ...) 429 ** (2) First descriptive name (depends on authorization type) 430 ** (3) Second descriptive name 431 ** (4) Name of the database (ex: "main", "temp") 432 ** (5) Name of trigger that is doing the access 433 ** 434 ** The callback should return on of the following strings: SQLITE_OK, 435 ** SQLITE_IGNORE, or SQLITE_DENY. Any other return value is an error. 436 ** 437 ** If this method is invoked with no arguments, the current authorization 438 ** callback string is returned. 439 */ 440 case DB_AUTHORIZER: { 441 if( objc>3 ){ 442 Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?"); 443 }else if( objc==2 ){ 444 if( pDb->zAuth ){ 445 Tcl_AppendResult(interp, pDb->zAuth, 0); 446 } 447 }else{ 448 char *zAuth; 449 int len; 450 if( pDb->zAuth ){ 451 Tcl_Free(pDb->zAuth); 452 } 453 zAuth = Tcl_GetStringFromObj(objv[2], &len); 454 if( zAuth && len>0 ){ 455 pDb->zAuth = Tcl_Alloc( len + 1 ); 456 strcpy(pDb->zAuth, zAuth); 457 }else{ 458 pDb->zAuth = 0; 459 } 460 #ifndef SQLITE_OMIT_AUTHORIZATION 461 if( pDb->zAuth ){ 462 pDb->interp = interp; 463 sqlite3_set_authorizer(pDb->db, auth_callback, pDb); 464 }else{ 465 sqlite3_set_authorizer(pDb->db, 0, 0); 466 } 467 #endif 468 } 469 break; 470 } 471 472 /* $db busy ?CALLBACK? 473 ** 474 ** Invoke the given callback if an SQL statement attempts to open 475 ** a locked database file. 476 */ 477 case DB_BUSY: { 478 if( objc>3 ){ 479 Tcl_WrongNumArgs(interp, 2, objv, "CALLBACK"); 480 return TCL_ERROR; 481 }else if( objc==2 ){ 482 if( pDb->zBusy ){ 483 Tcl_AppendResult(interp, pDb->zBusy, 0); 484 } 485 }else{ 486 char *zBusy; 487 int len; 488 if( pDb->zBusy ){ 489 Tcl_Free(pDb->zBusy); 490 } 491 zBusy = Tcl_GetStringFromObj(objv[2], &len); 492 if( zBusy && len>0 ){ 493 pDb->zBusy = Tcl_Alloc( len + 1 ); 494 strcpy(pDb->zBusy, zBusy); 495 }else{ 496 pDb->zBusy = 0; 497 } 498 if( pDb->zBusy ){ 499 pDb->interp = interp; 500 sqlite3_busy_handler(pDb->db, DbBusyHandler, pDb); 501 }else{ 502 sqlite3_busy_handler(pDb->db, 0, 0); 503 } 504 } 505 break; 506 } 507 508 /* $db progress ?N CALLBACK? 509 ** 510 ** Invoke the given callback every N virtual machine opcodes while executing 511 ** queries. 512 */ 513 case DB_PROGRESS: { 514 if( objc==2 ){ 515 if( pDb->zProgress ){ 516 Tcl_AppendResult(interp, pDb->zProgress, 0); 517 } 518 }else if( objc==4 ){ 519 char *zProgress; 520 int len; 521 int N; 522 if( TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &N) ){ 523 return TCL_ERROR; 524 }; 525 if( pDb->zProgress ){ 526 Tcl_Free(pDb->zProgress); 527 } 528 zProgress = Tcl_GetStringFromObj(objv[3], &len); 529 if( zProgress && len>0 ){ 530 pDb->zProgress = Tcl_Alloc( len + 1 ); 531 strcpy(pDb->zProgress, zProgress); 532 }else{ 533 pDb->zProgress = 0; 534 } 535 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 536 if( pDb->zProgress ){ 537 pDb->interp = interp; 538 sqlite3_progress_handler(pDb->db, N, DbProgressHandler, pDb); 539 }else{ 540 sqlite3_progress_handler(pDb->db, 0, 0, 0); 541 } 542 #endif 543 }else{ 544 Tcl_WrongNumArgs(interp, 2, objv, "N CALLBACK"); 545 return TCL_ERROR; 546 } 547 break; 548 } 549 550 /* 551 ** $db changes 552 ** 553 ** Return the number of rows that were modified, inserted, or deleted by 554 ** the most recent "eval". 555 */ 556 case DB_CHANGES: { 557 Tcl_Obj *pResult; 558 int nChange; 559 if( objc!=2 ){ 560 Tcl_WrongNumArgs(interp, 2, objv, ""); 561 return TCL_ERROR; 562 } 563 /* nChange = sqlite3_changes(pDb->db); */ 564 nChange = pDb->nChange; 565 pResult = Tcl_GetObjResult(interp); 566 Tcl_SetIntObj(pResult, nChange); 567 break; 568 } 569 570 /* 571 ** $db last_statement_changes 572 ** 573 ** Return the number of rows that were modified, inserted, or deleted by 574 ** the last statment to complete execution (excluding changes due to 575 ** triggers) 576 */ 577 case DB_LAST_STATEMENT_CHANGES: { 578 Tcl_Obj *pResult; 579 int lsChange; 580 if( objc!=2 ){ 581 Tcl_WrongNumArgs(interp, 2, objv, ""); 582 return TCL_ERROR; 583 } 584 lsChange = sqlite3_last_statement_changes(pDb->db); 585 pResult = Tcl_GetObjResult(interp); 586 Tcl_SetIntObj(pResult, lsChange); 587 break; 588 } 589 590 /* $db close 591 ** 592 ** Shutdown the database 593 */ 594 case DB_CLOSE: { 595 Tcl_DeleteCommand(interp, Tcl_GetStringFromObj(objv[0], 0)); 596 break; 597 } 598 599 /* $db commit_hook ?CALLBACK? 600 ** 601 ** Invoke the given callback just before committing every SQL transaction. 602 ** If the callback throws an exception or returns non-zero, then the 603 ** transaction is aborted. If CALLBACK is an empty string, the callback 604 ** is disabled. 605 */ 606 case DB_COMMIT_HOOK: { 607 if( objc>3 ){ 608 Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?"); 609 }else if( objc==2 ){ 610 if( pDb->zCommit ){ 611 Tcl_AppendResult(interp, pDb->zCommit, 0); 612 } 613 }else{ 614 char *zCommit; 615 int len; 616 if( pDb->zCommit ){ 617 Tcl_Free(pDb->zCommit); 618 } 619 zCommit = Tcl_GetStringFromObj(objv[2], &len); 620 if( zCommit && len>0 ){ 621 pDb->zCommit = Tcl_Alloc( len + 1 ); 622 strcpy(pDb->zCommit, zCommit); 623 }else{ 624 pDb->zCommit = 0; 625 } 626 if( pDb->zCommit ){ 627 pDb->interp = interp; 628 sqlite3_commit_hook(pDb->db, DbCommitHandler, pDb); 629 }else{ 630 sqlite3_commit_hook(pDb->db, 0, 0); 631 } 632 } 633 break; 634 } 635 636 /* $db complete SQL 637 ** 638 ** Return TRUE if SQL is a complete SQL statement. Return FALSE if 639 ** additional lines of input are needed. This is similar to the 640 ** built-in "info complete" command of Tcl. 641 */ 642 case DB_COMPLETE: { 643 Tcl_Obj *pResult; 644 int isComplete; 645 if( objc!=3 ){ 646 Tcl_WrongNumArgs(interp, 2, objv, "SQL"); 647 return TCL_ERROR; 648 } 649 isComplete = sqlite3_complete( Tcl_GetStringFromObj(objv[2], 0) ); 650 pResult = Tcl_GetObjResult(interp); 651 Tcl_SetBooleanObj(pResult, isComplete); 652 break; 653 } 654 655 /* 656 ** $db errorcode 657 ** 658 ** Return the numeric error code that was returned by the most recent 659 ** call to sqlite3_exec(). 660 */ 661 case DB_ERRORCODE: { 662 Tcl_SetObjResult(interp, Tcl_NewIntObj(pDb->rc)); 663 break; 664 } 665 666 /* 667 ** $db eval $sql ?array { ...code... }? 668 ** 669 ** The SQL statement in $sql is evaluated. For each row, the values are 670 ** placed in elements of the array named "array" and ...code... is executed. 671 ** If "array" and "code" are omitted, then no callback is every invoked. 672 ** If "array" is an empty string, then the values are placed in variables 673 ** that have the same name as the fields extracted by the query. 674 */ 675 case DB_EVAL: { 676 char const *zSql; 677 char const *zLeft; 678 sqlite3_stmt *pStmt; 679 680 Tcl_Obj *pRet = Tcl_NewObj(); 681 Tcl_IncrRefCount(pRet); 682 683 if( objc!=5 && objc!=3 ){ 684 Tcl_WrongNumArgs(interp, 2, objv, "SQL ?ARRAY-NAME CODE?"); 685 return TCL_ERROR; 686 } 687 688 pDb->nChange = 0; 689 zSql = Tcl_GetStringFromObj(objv[2], 0); 690 while( zSql[0] ){ 691 int i; 692 693 if( SQLITE_OK!=sqlite3_prepare(pDb->db, zSql, -1, &pStmt, &zLeft) ){ 694 Tcl_SetObjResult(interp, dbTextToObj(sqlite3_errmsg(pDb->db))); 695 rc = TCL_ERROR; 696 break; 697 } 698 699 if( pStmt && objc==5 ){ 700 Tcl_Obj *pColList = Tcl_NewObj(); 701 Tcl_IncrRefCount(pColList); 702 703 for(i=0; i<sqlite3_column_count(pStmt); i++){ 704 Tcl_ListObjAppendElement(interp, pColList, 705 dbTextToObj(sqlite3_column_name(pStmt, i)) 706 ); 707 } 708 Tcl_ObjSetVar2(interp,objv[3],Tcl_NewStringObj("*",-1),pColList,0); 709 } 710 711 while( pStmt && SQLITE_ROW==sqlite3_step(pStmt) ){ 712 for(i=0; i<sqlite3_column_count(pStmt); i++){ 713 Tcl_Obj *pVal; 714 715 /* Set pVal to contain the i'th column of this row. */ 716 if( SQLITE_BLOB!=sqlite3_column_type(pStmt, i) ){ 717 pVal = dbTextToObj(sqlite3_column_text(pStmt, i)); 718 }else{ 719 int bytes = sqlite3_column_bytes(pStmt, i); 720 pVal = Tcl_NewByteArrayObj(sqlite3_column_blob(pStmt, i), bytes); 721 } 722 723 if( objc==5 ){ 724 Tcl_Obj *pName = dbTextToObj(sqlite3_column_name(pStmt, i)); 725 Tcl_IncrRefCount(pName); 726 if( !strcmp("", Tcl_GetString(objv[3])) ){ 727 Tcl_ObjSetVar2(interp, pName, 0, pVal, 0); 728 }else{ 729 Tcl_ObjSetVar2(interp, objv[3], pName, pVal, 0); 730 } 731 Tcl_DecrRefCount(pName); 732 }else{ 733 Tcl_ListObjAppendElement(interp, pRet, pVal); 734 } 735 } 736 737 if( objc==5 ){ 738 rc = Tcl_EvalObjEx(interp, objv[4], 0); 739 if( rc!=TCL_ERROR ) rc = TCL_OK; 740 } 741 } 742 743 if( pStmt && SQLITE_SCHEMA==sqlite3_finalize(pStmt) ){ 744 continue; 745 } 746 747 if( pStmt && SQLITE_OK!=sqlite3_errcode(pDb->db) ){ 748 Tcl_SetObjResult(interp, dbTextToObj(sqlite3_errmsg(pDb->db))); 749 rc = TCL_ERROR; 750 break; 751 } 752 753 pDb->nChange += sqlite3_changes(pDb->db); 754 zSql = zLeft; 755 } 756 757 if( rc==TCL_OK ){ 758 Tcl_SetObjResult(interp, pRet); 759 } 760 Tcl_DecrRefCount(pRet); 761 762 break; 763 } 764 765 /* 766 ** $db function NAME SCRIPT 767 ** 768 ** Create a new SQL function called NAME. Whenever that function is 769 ** called, invoke SCRIPT to evaluate the function. 770 */ 771 case DB_FUNCTION: { 772 SqlFunc *pFunc; 773 char *zName; 774 char *zScript; 775 int nScript; 776 if( objc!=4 ){ 777 Tcl_WrongNumArgs(interp, 2, objv, "NAME SCRIPT"); 778 return TCL_ERROR; 779 } 780 zName = Tcl_GetStringFromObj(objv[2], 0); 781 zScript = Tcl_GetStringFromObj(objv[3], &nScript); 782 pFunc = (SqlFunc*)Tcl_Alloc( sizeof(*pFunc) + nScript + 1 ); 783 if( pFunc==0 ) return TCL_ERROR; 784 pFunc->interp = interp; 785 pFunc->pNext = pDb->pFunc; 786 pFunc->zScript = (char*)&pFunc[1]; 787 strcpy(pFunc->zScript, zScript); 788 sqlite3_create_function(pDb->db, zName, -1, 0, 0, pFunc, tclSqlFunc, 0, 0); 789 break; 790 } 791 792 /* 793 ** $db last_insert_rowid 794 ** 795 ** Return an integer which is the ROWID for the most recent insert. 796 */ 797 case DB_LAST_INSERT_ROWID: { 798 Tcl_Obj *pResult; 799 int rowid; 800 if( objc!=2 ){ 801 Tcl_WrongNumArgs(interp, 2, objv, ""); 802 return TCL_ERROR; 803 } 804 rowid = sqlite3_last_insert_rowid(pDb->db); 805 pResult = Tcl_GetObjResult(interp); 806 Tcl_SetIntObj(pResult, rowid); 807 break; 808 } 809 810 /* 811 ** $db onecolumn SQL 812 ** 813 ** Return a single column from a single row of the given SQL query. 814 */ 815 case DB_ONECOLUMN: { 816 char *zSql; 817 char *zErrMsg = 0; 818 if( objc!=3 ){ 819 Tcl_WrongNumArgs(interp, 2, objv, "SQL"); 820 return TCL_ERROR; 821 } 822 zSql = Tcl_GetStringFromObj(objv[2], 0); 823 rc = sqlite3_exec(pDb->db, zSql, DbEvalCallback3, interp, &zErrMsg); 824 if( rc==SQLITE_ABORT ){ 825 rc = SQLITE_OK; 826 }else if( zErrMsg ){ 827 Tcl_SetResult(interp, zErrMsg, TCL_VOLATILE); 828 free(zErrMsg); 829 rc = TCL_ERROR; 830 }else if( rc!=SQLITE_OK ){ 831 Tcl_AppendResult(interp, sqlite3ErrStr(rc), 0); 832 rc = TCL_ERROR; 833 } 834 break; 835 } 836 837 /* 838 ** $db rekey KEY 839 ** 840 ** Change the encryption key on the currently open database. 841 */ 842 case DB_REKEY: { 843 int nKey; 844 void *pKey; 845 if( objc!=3 ){ 846 Tcl_WrongNumArgs(interp, 2, objv, "KEY"); 847 return TCL_ERROR; 848 } 849 pKey = Tcl_GetByteArrayFromObj(objv[2], &nKey); 850 #ifdef SQLITE_HAS_CODEC 851 rc = sqlite_rekey(pDb->db, pKey, nKey); 852 if( rc ){ 853 Tcl_AppendResult(interp, sqlite3ErrStr(rc), 0); 854 rc = TCL_ERROR; 855 } 856 #endif 857 break; 858 } 859 860 /* 861 ** $db timeout MILLESECONDS 862 ** 863 ** Delay for the number of milliseconds specified when a file is locked. 864 */ 865 case DB_TIMEOUT: { 866 int ms; 867 if( objc!=3 ){ 868 Tcl_WrongNumArgs(interp, 2, objv, "MILLISECONDS"); 869 return TCL_ERROR; 870 } 871 if( Tcl_GetIntFromObj(interp, objv[2], &ms) ) return TCL_ERROR; 872 sqlite3_busy_timeout(pDb->db, ms); 873 break; 874 } 875 876 /* $db trace ?CALLBACK? 877 ** 878 ** Make arrangements to invoke the CALLBACK routine for each SQL statement 879 ** that is executed. The text of the SQL is appended to CALLBACK before 880 ** it is executed. 881 */ 882 case DB_TRACE: { 883 if( objc>3 ){ 884 Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?"); 885 }else if( objc==2 ){ 886 if( pDb->zTrace ){ 887 Tcl_AppendResult(interp, pDb->zTrace, 0); 888 } 889 }else{ 890 char *zTrace; 891 int len; 892 if( pDb->zTrace ){ 893 Tcl_Free(pDb->zTrace); 894 } 895 zTrace = Tcl_GetStringFromObj(objv[2], &len); 896 if( zTrace && len>0 ){ 897 pDb->zTrace = Tcl_Alloc( len + 1 ); 898 strcpy(pDb->zTrace, zTrace); 899 }else{ 900 pDb->zTrace = 0; 901 } 902 if( pDb->zTrace ){ 903 pDb->interp = interp; 904 sqlite3_trace(pDb->db, DbTraceHandler, pDb); 905 }else{ 906 sqlite3_trace(pDb->db, 0, 0); 907 } 908 } 909 break; 910 } 911 912 /* 913 ** $db collate NAME SCRIPT 914 ** 915 ** Create a new SQL collation function called NAME. Whenever 916 ** that function is called, invoke SCRIPT to evaluate the function. 917 */ 918 case DB_COLLATE: { 919 SqlCollate *pCollate; 920 char *zName; 921 char *zScript; 922 int nScript; 923 if( objc!=4 ){ 924 Tcl_WrongNumArgs(interp, 2, objv, "NAME SCRIPT"); 925 return TCL_ERROR; 926 } 927 zName = Tcl_GetStringFromObj(objv[2], 0); 928 zScript = Tcl_GetStringFromObj(objv[3], &nScript); 929 pCollate = (SqlCollate*)Tcl_Alloc( sizeof(*pCollate) + nScript + 1 ); 930 if( pCollate==0 ) return TCL_ERROR; 931 pCollate->interp = interp; 932 pCollate->pNext = pDb->pCollate; 933 pCollate->zScript = (char*)&pCollate[1]; 934 strcpy(pCollate->zScript, zScript); 935 if( sqlite3_create_collation(pDb->db, zName, SQLITE_UTF8, 936 pCollate, tclSqlCollate) ){ 937 return TCL_ERROR; 938 } 939 break; 940 } 941 942 /* 943 ** $db collate_needed SCRIPT 944 ** 945 ** Create a new SQL collation function called NAME. Whenever 946 ** that function is called, invoke SCRIPT to evaluate the function. 947 */ 948 case DB_COLLATION_NEEDED: { 949 if( objc!=3 ){ 950 Tcl_WrongNumArgs(interp, 2, objv, "SCRIPT"); 951 return TCL_ERROR; 952 } 953 if( pDb->pCollateNeeded ){ 954 Tcl_DecrRefCount(pDb->pCollateNeeded); 955 } 956 pDb->pCollateNeeded = Tcl_DuplicateObj(objv[2]); 957 Tcl_IncrRefCount(pDb->pCollateNeeded); 958 sqlite3_collation_needed(pDb->db, pDb, tclCollateNeeded); 959 break; 960 } 961 962 } /* End of the SWITCH statement */ 963 return rc; 964 } 965 966 /* 967 ** sqlite DBNAME FILENAME ?MODE? ?-key KEY? 968 ** 969 ** This is the main Tcl command. When the "sqlite" Tcl command is 970 ** invoked, this routine runs to process that command. 971 ** 972 ** The first argument, DBNAME, is an arbitrary name for a new 973 ** database connection. This command creates a new command named 974 ** DBNAME that is used to control that connection. The database 975 ** connection is deleted when the DBNAME command is deleted. 976 ** 977 ** The second argument is the name of the directory that contains 978 ** the sqlite database that is to be accessed. 979 ** 980 ** For testing purposes, we also support the following: 981 ** 982 ** sqlite -encoding 983 ** 984 ** Return the encoding used by LIKE and GLOB operators. Choices 985 ** are UTF-8 and iso8859. 986 ** 987 ** sqlite -version 988 ** 989 ** Return the version number of the SQLite library. 990 ** 991 ** sqlite -tcl-uses-utf 992 ** 993 ** Return "1" if compiled with a Tcl uses UTF-8. Return "0" if 994 ** not. Used by tests to make sure the library was compiled 995 ** correctly. 996 */ 997 static int DbMain(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ 998 SqliteDb *p; 999 void *pKey = 0; 1000 int nKey = 0; 1001 const char *zArg; 1002 char *zErrMsg; 1003 const char *zFile; 1004 char zBuf[80]; 1005 if( objc==2 ){ 1006 zArg = Tcl_GetStringFromObj(objv[1], 0); 1007 if( strcmp(zArg,"-version")==0 ){ 1008 Tcl_AppendResult(interp,sqlite3_version,0); 1009 return TCL_OK; 1010 } 1011 if( strcmp(zArg,"-has-codec")==0 ){ 1012 #ifdef SQLITE_HAS_CODEC 1013 Tcl_AppendResult(interp,"1",0); 1014 #else 1015 Tcl_AppendResult(interp,"0",0); 1016 #endif 1017 return TCL_OK; 1018 } 1019 if( strcmp(zArg,"-tcl-uses-utf")==0 ){ 1020 #ifdef TCL_UTF_MAX 1021 Tcl_AppendResult(interp,"1",0); 1022 #else 1023 Tcl_AppendResult(interp,"0",0); 1024 #endif 1025 return TCL_OK; 1026 } 1027 } 1028 if( objc==5 || objc==6 ){ 1029 zArg = Tcl_GetStringFromObj(objv[objc-2], 0); 1030 if( strcmp(zArg,"-key")==0 ){ 1031 pKey = Tcl_GetByteArrayFromObj(objv[objc-1], &nKey); 1032 objc -= 2; 1033 } 1034 } 1035 if( objc!=3 && objc!=4 ){ 1036 Tcl_WrongNumArgs(interp, 1, objv, 1037 #ifdef SQLITE_HAS_CODEC 1038 "HANDLE FILENAME ?-key CODEC-KEY?" 1039 #else 1040 "HANDLE FILENAME ?MODE?" 1041 #endif 1042 ); 1043 return TCL_ERROR; 1044 } 1045 zErrMsg = 0; 1046 p = (SqliteDb*)Tcl_Alloc( sizeof(*p) ); 1047 if( p==0 ){ 1048 Tcl_SetResult(interp, "malloc failed", TCL_STATIC); 1049 return TCL_ERROR; 1050 } 1051 memset(p, 0, sizeof(*p)); 1052 zFile = Tcl_GetStringFromObj(objv[2], 0); 1053 #ifdef SQLITE_HAS_CODEC 1054 p->db = sqlite3_open_encrypted(zFile, pKey, nKey, 0, &zErrMsg); 1055 #else 1056 sqlite3_open(zFile, &p->db); 1057 if( SQLITE_OK!=sqlite3_errcode(p->db) ){ 1058 zErrMsg = strdup(sqlite3_errmsg(p->db)); 1059 sqlite3_close(p->db); 1060 p->db = 0; 1061 } 1062 #endif 1063 if( p->db==0 ){ 1064 Tcl_SetResult(interp, zErrMsg, TCL_VOLATILE); 1065 Tcl_Free((char*)p); 1066 free(zErrMsg); 1067 return TCL_ERROR; 1068 } 1069 zArg = Tcl_GetStringFromObj(objv[1], 0); 1070 Tcl_CreateObjCommand(interp, zArg, DbObjCmd, (char*)p, DbDeleteCmd); 1071 1072 /* The return value is the value of the sqlite* pointer 1073 */ 1074 sprintf(zBuf, "%p", p->db); 1075 if( strncmp(zBuf,"0x",2) ){ 1076 sprintf(zBuf, "0x%p", p->db); 1077 } 1078 Tcl_AppendResult(interp, zBuf, 0); 1079 1080 /* If compiled with SQLITE_TEST turned on, then register the "md5sum" 1081 ** SQL function. 1082 */ 1083 #ifdef SQLITE_TEST 1084 { 1085 extern void Md5_Register(sqlite*); 1086 Md5_Register(p->db); 1087 } 1088 #endif 1089 p->interp = interp; 1090 return TCL_OK; 1091 } 1092 1093 /* 1094 ** Provide a dummy Tcl_InitStubs if we are using this as a static 1095 ** library. 1096 */ 1097 #ifndef USE_TCL_STUBS 1098 # undef Tcl_InitStubs 1099 # define Tcl_InitStubs(a,b,c) 1100 #endif 1101 1102 /* 1103 ** Initialize this module. 1104 ** 1105 ** This Tcl module contains only a single new Tcl command named "sqlite". 1106 ** (Hence there is no namespace. There is no point in using a namespace 1107 ** if the extension only supplies one new name!) The "sqlite" command is 1108 ** used to open a new SQLite database. See the DbMain() routine above 1109 ** for additional information. 1110 */ 1111 int Sqlite_Init(Tcl_Interp *interp){ 1112 Tcl_InitStubs(interp, "8.0", 0); 1113 Tcl_CreateObjCommand(interp, "sqlite", (Tcl_ObjCmdProc*)DbMain, 0, 0); 1114 Tcl_PkgProvide(interp, "sqlite", "2.0"); 1115 return TCL_OK; 1116 } 1117 int Tclsqlite_Init(Tcl_Interp *interp){ 1118 Tcl_InitStubs(interp, "8.0", 0); 1119 Tcl_CreateObjCommand(interp, "sqlite", (Tcl_ObjCmdProc*)DbMain, 0, 0); 1120 Tcl_PkgProvide(interp, "sqlite", "2.0"); 1121 return TCL_OK; 1122 } 1123 int Sqlite_SafeInit(Tcl_Interp *interp){ 1124 return TCL_OK; 1125 } 1126 int Tclsqlite_SafeInit(Tcl_Interp *interp){ 1127 return TCL_OK; 1128 } 1129 1130 #if 0 1131 /* 1132 ** If compiled using mktclapp, this routine runs to initialize 1133 ** everything. 1134 */ 1135 int Et_AppInit(Tcl_Interp *interp){ 1136 return Sqlite_Init(interp); 1137 } 1138 #endif 1139 1140 /* 1141 ** If the macro TCLSH is defined and is one, then put in code for the 1142 ** "main" routine that will initialize Tcl. 1143 */ 1144 #if defined(TCLSH) && TCLSH==1 1145 static char zMainloop[] = 1146 "set line {}\n" 1147 "while {![eof stdin]} {\n" 1148 "if {$line!=\"\"} {\n" 1149 "puts -nonewline \"> \"\n" 1150 "} else {\n" 1151 "puts -nonewline \"% \"\n" 1152 "}\n" 1153 "flush stdout\n" 1154 "append line [gets stdin]\n" 1155 "if {[info complete $line]} {\n" 1156 "if {[catch {uplevel #0 $line} result]} {\n" 1157 "puts stderr \"Error: $result\"\n" 1158 "} elseif {$result!=\"\"} {\n" 1159 "puts $result\n" 1160 "}\n" 1161 "set line {}\n" 1162 "} else {\n" 1163 "append line \\n\n" 1164 "}\n" 1165 "}\n" 1166 ; 1167 1168 #define TCLSH_MAIN main /* Needed to fake out mktclapp */ 1169 int TCLSH_MAIN(int argc, char **argv){ 1170 Tcl_Interp *interp; 1171 Tcl_FindExecutable(argv[0]); 1172 interp = Tcl_CreateInterp(); 1173 Sqlite_Init(interp); 1174 #ifdef SQLITE_TEST 1175 { 1176 extern int Sqlitetest1_Init(Tcl_Interp*); 1177 extern int Sqlitetest2_Init(Tcl_Interp*); 1178 extern int Sqlitetest3_Init(Tcl_Interp*); 1179 extern int Sqlitetest4_Init(Tcl_Interp*); 1180 extern int Sqlitetest5_Init(Tcl_Interp*); 1181 extern int Md5_Init(Tcl_Interp*); 1182 Sqlitetest1_Init(interp); 1183 Sqlitetest2_Init(interp); 1184 Sqlitetest3_Init(interp); 1185 Sqlitetest4_Init(interp); 1186 Sqlitetest5_Init(interp); 1187 Md5_Init(interp); 1188 } 1189 #endif 1190 if( argc>=2 ){ 1191 int i; 1192 Tcl_SetVar(interp,"argv0",argv[1],TCL_GLOBAL_ONLY); 1193 Tcl_SetVar(interp,"argv", "", TCL_GLOBAL_ONLY); 1194 for(i=2; i<argc; i++){ 1195 Tcl_SetVar(interp, "argv", argv[i], 1196 TCL_GLOBAL_ONLY | TCL_LIST_ELEMENT | TCL_APPEND_VALUE); 1197 } 1198 if( Tcl_EvalFile(interp, argv[1])!=TCL_OK ){ 1199 const char *zInfo = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY); 1200 if( zInfo==0 ) zInfo = interp->result; 1201 fprintf(stderr,"%s: %s\n", *argv, zInfo); 1202 return 1; 1203 } 1204 }else{ 1205 Tcl_GlobalEval(interp, zMainloop); 1206 } 1207 return 0; 1208 } 1209 #endif /* TCLSH */ 1210 1211 #endif /* !defined(NO_TCL) */ 1212