Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fixes to the dump logic. All appears to be working in preliminary tests. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | dbdump |
Files: | files | file ages | folders |
SHA3-256: |
007b11e301d444361c8eff8734dc2fb9 |
User & Date: | drh 2017-03-13 21:49:48.351 |
Context
2017-03-13
| ||
22:02 | Add dbdump.exe to the MSVC makefile. (Closed-Leaf check-in: 59241a50ad user: drh tags: dbdump) | |
21:49 | Fixes to the dump logic. All appears to be working in preliminary tests. (check-in: 007b11e301 user: drh tags: dbdump) | |
21:26 | First draft of the complete dbdump.c library. (check-in: 84ea4fcc52 user: drh tags: dbdump) | |
Changes
Changes to ext/misc/dbdump.c.
︙ | ︙ | |||
220 221 222 223 224 225 226 | int rc; zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); if( zSql==0 ) return 0; rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); sqlite3_free(zSql); if( rc ) return 0; | < > | 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | int rc; zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); if( zSql==0 ) return 0; rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); sqlite3_free(zSql); if( rc ) return 0; while( sqlite3_step(pStmt)==SQLITE_ROW ){ if( nCol>=nAlloc-2 ){ char **azNew; nAlloc = nAlloc*2 + nCol + 10; azNew = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); if( azNew==0 ) goto col_oom; azCol = azNew; azCol[0] = 0; } azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); if( azCol[nCol]==0 ) goto col_oom; if( sqlite3_column_int(pStmt, 5) ){ nPK++; if( nPK==1 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), |
︙ | ︙ | |||
313 314 315 316 317 318 319 | /* ** Send mprintf-formatted content to the output callback. */ static void output_formatted(DState *p, const char *zFormat, ...){ va_list ap; char *z; va_start(ap, zFormat); | | | 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 | /* ** Send mprintf-formatted content to the output callback. */ static void output_formatted(DState *p, const char *zFormat, ...){ va_list ap; char *z; va_start(ap, zFormat); z = sqlite3_vmprintf(zFormat, ap); va_end(ap); p->xCallback(z, p->pArg); sqlite3_free(z); } /* ** Output the given string as a quoted string using SQL quoting conventions. |
︙ | ︙ | |||
426 427 428 429 430 431 432 433 434 | char **azCol; int i; int nCol; azCol = tableColumnList(p, zTable); if( azCol==0 ) return 0; /* Always quote the table name, even if it appears to be pure ascii, ** in case it is a keyword. Ex: INSERT INTO "table" ... */ | > > > < > | 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 | char **azCol; int i; int nCol; azCol = tableColumnList(p, zTable); if( azCol==0 ) return 0; initText(&sTable); appendText(&sTable, "INSERT INTO ", 0); /* Always quote the table name, even if it appears to be pure ascii, ** in case it is a keyword. Ex: INSERT INTO "table" ... */ appendText(&sTable, zTable, quoteChar(zTable)); /* If preserving the rowid, add a column list after the table name. ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" ** instead of the usual "INSERT INTO tab VALUES(...)". */ if( azCol[0] ){ appendText(&sTable, "(", 0); appendText(&sTable, azCol[0], 0); |
︙ | ︙ | |||
458 459 460 461 462 463 464 | } for(i=1; azCol[i]; i++){ appendText(&sSelect, azCol[i], quoteChar(azCol[i])); if( azCol[i+1] ){ appendText(&sSelect, ",", 0); } } | | > | 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 | } for(i=1; azCol[i]; i++){ appendText(&sSelect, azCol[i], quoteChar(azCol[i])); if( azCol[i+1] ){ appendText(&sSelect, ",", 0); } } nCol = i; if( azCol[0]==0 ) nCol--; freeColumnList(azCol); appendText(&sSelect, " FROM ", 0); appendText(&sSelect, zTable, quoteChar(zTable)); rc = sqlite3_prepare_v2(p->db, sSelect.z, -1, &pStmt, 0); if( rc!=SQLITE_OK ){ p->nErr++; |
︙ | ︙ | |||
541 542 543 544 545 546 547 | int rc; int nResult; int i; const char *z; char *zSql; va_list ap; va_start(ap, zSelect); | | | 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 | int rc; int nResult; int i; const char *z; char *zSql; va_list ap; va_start(ap, zSelect); zSql = sqlite3_vmprintf(zSelect, ap); va_end(ap); if( zSql==0 ){ p->rc = SQLITE_NOMEM; p->nErr++; return; } rc = sqlite3_prepare_v2(p->db, zSql, -1, &pSelect, 0); |
︙ | ︙ | |||
598 599 600 601 602 603 604 | const char *zQuery, ... ){ char *zErr = 0; char *z; va_list ap; va_start(ap, zQuery); | | | 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 | const char *zQuery, ... ){ char *zErr = 0; char *z; va_list ap; va_start(ap, zQuery); z = sqlite3_vmprintf(zQuery, ap); va_end(ap); sqlite3_exec(p->db, z, dump_callback, p, &zErr); sqlite3_free(z); if( zErr ){ output_formatted(p, "/****** %s ******/\n", zErr); sqlite3_free(zErr); p->nErr++; |
︙ | ︙ |