@@ -19,10 +19,11 @@
19 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** from the local repository.
20 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
21 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "config.h"
22 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "checkout.h"
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <assert.h>
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #include <zlib.h>
24 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
26 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Check to see if there is an existing check-out that has been
27 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** modified. Return values:
28 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -429,5 +430,229 @@
429 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
430 431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unlink_local_database(1);
431 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_close(1);
432 433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unlink_local_database(0);
433 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: get
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil get URL ?VERSION? ?OPTIONS?
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Download a single check-in from a remote repository named URL and
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** unpack all of the files locally. The check-in is identified by VERSION.
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** URL can be a traditional URL like one of:
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * https://domain.com/project
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * ssh://my-server/project.fossil
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * file:/home/user/Fossils/project.fossil
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Or URL can be just the name of a local repository without the "file:"
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** prefix.
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This command works by downloading an SQL archive of the requested
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** check-in and then extracting all the files from the archive.
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Options:
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** --dest DIRECTORY Extract files into DIRECTORY. Use "--dest ."
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to extract into the local directory.
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** -f|--force Overwrite existing files
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** --list List all the files that would have been checked
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** out but do not actually write anything to the
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** filesystem.
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** --sqlar ARCHIVE Store the check-out in an SQL-archive rather
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** than unpacking them into separate files.
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** -v|--verbose Show all files as they are extracted
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void get_cmd(void){
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int forceFlag = find_option("force","f",0)!=0;
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bVerbose = find_option("verbose","v",0)!=0;
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bQuiet = find_option("quiet","q",0)!=0;
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bDebug = find_option("debug",0,0)!=0;
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bList = find_option("list",0,0)!=0;
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zSqlArchive = find_option("sqlar",0,1);
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *z;
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zDest = 0; /* Where to store results */
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zSql; /* SQL used to query the results */
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zUrl; /* Url to get */
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zVers; /* Version name to get */
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int mHttpFlags = HTTP_GENERIC|HTTP_NOCOMPRESS;
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob in, out; /* I/O for the HTTP request */
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob file; /* A file to extract */
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3 *db; /* Database containing downloaded sqlar */
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_stmt *pStmt; /* Statement for querying the database */
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Result of subroutine calls */
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nFile = 0; /* Number of files written */
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nDir = 0; /* Number of directories written */
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 nByte = 0; /* Number of bytes written */
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ z = find_option("dest",0,1);
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( z ) zDest = fossil_strdup(z);
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verify_all_options();
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc<3 || g.argc>4 ){
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ usage("get URL ?VERSION? ?OPTIONS?");
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUrl = g.argv[2];
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zVers = g.argc==4 ? g.argv[3] : "trunk";
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Parse the URL of the repository */
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url_parse(zUrl, 0);
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Construct an appropriate name for the destination directory */
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zDest==0 ){
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTail;
510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zDot;
511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n;
512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.url.isFile ){
513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTail = file_tail(g.url.name);
514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTail = file_tail(g.url.path);
516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDot = strchr(zTail,'.');
518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zDot==0 ) zDot = zTail+strlen(zTail);
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n = (int)(zDot - zTail);
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDest = mprintf("%.*s-%s", n, zTail, zVers);
521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; zDest[i]; i++){
522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char c = zDest[i];
523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !fossil_isalnum(c) && c!='-' && c!='^' && c!='~' && c!='_' ){
524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDest[i] = '-';
525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bDebug ){
529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("dest = %s\n", zDest);
530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Error checking */
533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zDest!=file_tail(zDest) ){
534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("--dest must be a simple directory name, not a path");
535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zVers!=file_tail(zVers) ){
537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("The \"fossil get\" command does not current work with"
538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " version names that contain \"/\". This will be fixed in"
539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " a future release.");
540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* To relax the restrictions above, change the subpath URL formula below
542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to use query parameters. Ex: /sqlar?r=%t&name=%t */
543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !forceFlag ){
545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zSqlArchive ){
546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( file_isdir(zSqlArchive, ExtFILE)>0 ){
547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("file already exists: \"%s\"", zSqlArchive);
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( file_isdir(zDest, ExtFILE)>0 ){
550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strcmp(zDest,".")==0 ){
551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( file_directory_size(zDest,0,1) ){
552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("current directory is not empty");
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("\"%s\" already exists", zDest);
556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Construct a subpath on the URL if necessary */
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.url.isSsh || g.url.isFile ){
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.url.subpath = mprintf("/sqlar/%t/%t.sqlar", zVers, zDest);
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.url.subpath = mprintf("%s/sqlar/%t/%t.sqlar", g.url.path, zVers, zDest);
565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bDebug ){
568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ urlparse_print(0);
569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Fetch the ZIP archive for the requested check-in */
572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&in, 0, 0);
573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&out, 0, 0);
574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bDebug ) mHttpFlags |= HTTP_VERBOSE;
575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bQuiet ) mHttpFlags |= HTTP_QUIET;
576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = http_exchange(&in, &out, mHttpFlags, 4, 0);
577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc
578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || out.nUsed<512
579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (out.nUsed%512)!=0
580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || memcmp(out.aData,"SQLite format 3",16)!=0
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Server did not return the requested check-in.");
583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zSqlArchive ){
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_write_to_file(&out, zSqlArchive);
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bVerbose ) fossil_print("%s\n", zSqlArchive);
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_open(":memory:", &db);
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sz = blob_size(&out);
594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_deserialize(db, 0, (unsigned char*)blob_buffer(&out), sz, sz,
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_DESERIALIZE_READONLY);
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Cannot create an in-memory database: %s",
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_errmsg(db));
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSql = mprintf("SELECT name, mode, sz, data FROM sqlar"
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE name GLOB '%q*'", zDest);
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zSql);
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=0 ){
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("SQL error: %s\n", sqlite3_errmsg(db));
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&file, 0, 0);
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( sqlite3_step(pStmt)==SQLITE_ROW ){
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zFilename = (const char*)sqlite3_column_text(pStmt, 0);
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mode = sqlite3_column_int(pStmt, 1);
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sz = sqlite3_column_int(pStmt, 2);
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bList ){
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%s\n", zFilename);
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( mode & 0x4000 ){
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A directory name */
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDir++;
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file_mkdir(zFilename, ExtFILE, 1);
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A file */
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned char *inBuf = (unsigned char*)sqlite3_column_blob(pStmt,3);
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int nIn = (unsigned int)sqlite3_column_bytes(pStmt,3);
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned long int nOut2 = (unsigned long int)sz;
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nFile++;
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nByte += sz;
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_resize(&file, sz);
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nIn<sz ){
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = uncompress((unsigned char*)blob_buffer(&file), &nOut2,
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inBuf, nIn);
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=Z_OK ){
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Failed to uncompress file %s", zFilename);
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(blob_buffer(&file), inBuf, sz);
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_write_to_file(&file, zFilename);
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( mode & 0x40 ){
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file_setexe(zFilename, 1);
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&file);
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bVerbose ){
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%s\n", zFilename);
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_finalize(pStmt);
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_close(db);
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&out);
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !bVerbose && !bQuiet && nFile>0 && zDest ){
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%d files (%,lld bytes) written into %s",
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nFile, nByte, zDest);
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nDir>1 ){
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print(" and %d subdirectories\n", nDir-1);
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n");
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
434 659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!