Fossil SCM
Still more speed improvements to the "rebuild" command.
Commit
a9a27f8aaab2a7ab118a6cf92fdb3b5ebd8df7c4
Parent
4c37130fde6b2e8…
1 file changed
+34
-12
+34
-12
| --- src/manifest.c | ||
| +++ src/manifest.c | ||
| @@ -698,10 +698,33 @@ | ||
| 698 | 698 | db_must_be_within_tree(); |
| 699 | 699 | blob_read_from_file(&b, g.argv[2]); |
| 700 | 700 | manifest_parse(&m, &b); |
| 701 | 701 | manifest_clear(&m); |
| 702 | 702 | } |
| 703 | + | |
| 704 | +/* | |
| 705 | +** Translate a filename into a filename-id (fnid). Create a new fnid | |
| 706 | +** if no previously exists. | |
| 707 | +*/ | |
| 708 | +static int filename_to_fnid(const char *zFilename){ | |
| 709 | + static Stmt q1, s1; | |
| 710 | + int fnid; | |
| 711 | + db_static_prepare(&q1, "SELECT fnid FROM filename WHERE name=:fn"); | |
| 712 | + db_bind_text(&q1, ":fn", zFilename); | |
| 713 | + fnid = 0; | |
| 714 | + if( db_step(&q1)==SQLITE_ROW ){ | |
| 715 | + fnid = db_column_int(&q1, 0); | |
| 716 | + } | |
| 717 | + db_reset(&q1); | |
| 718 | + if( fnid==0 ){ | |
| 719 | + db_static_prepare(&s1, "INSERT INTO filename(name) VALUES(:fn)"); | |
| 720 | + db_bind_text(&s1, ":fn", zFilename); | |
| 721 | + db_exec(&s1); | |
| 722 | + fnid = db_last_insert_rowid(); | |
| 723 | + } | |
| 724 | + return fnid; | |
| 725 | +} | |
| 703 | 726 | |
| 704 | 727 | /* |
| 705 | 728 | ** Add a single entry to the mlink table. Also add the filename to |
| 706 | 729 | ** the filename table if it is not there already. |
| 707 | 730 | */ |
| @@ -711,24 +734,17 @@ | ||
| 711 | 734 | const char *zToUuid, /* UUID for the mlink.fid field */ |
| 712 | 735 | const char *zFilename, /* Filename */ |
| 713 | 736 | const char *zPrior /* Previous filename. NULL if unchanged */ |
| 714 | 737 | ){ |
| 715 | 738 | int fnid, pfnid, pid, fid; |
| 739 | + static Stmt s1; | |
| 716 | 740 | |
| 717 | - fnid = db_int(0, "SELECT fnid FROM filename WHERE name=%Q", zFilename); | |
| 718 | - if( fnid==0 ){ | |
| 719 | - db_multi_exec("INSERT INTO filename(name) VALUES(%Q)", zFilename); | |
| 720 | - fnid = db_last_insert_rowid(); | |
| 721 | - } | |
| 741 | + fnid = filename_to_fnid(zFilename); | |
| 722 | 742 | if( zPrior==0 ){ |
| 723 | 743 | pfnid = 0; |
| 724 | 744 | }else{ |
| 725 | - pfnid = db_int(0, "SELECT fnid FROM filename WHERE name=%Q", zPrior); | |
| 726 | - if( pfnid==0 ){ | |
| 727 | - db_multi_exec("INSERT INTO filename(name) VALUES(%Q)", zPrior); | |
| 728 | - pfnid = db_last_insert_rowid(); | |
| 729 | - } | |
| 745 | + pfnid = filename_to_fnid(zPrior); | |
| 730 | 746 | } |
| 731 | 747 | if( zFromUuid==0 ){ |
| 732 | 748 | pid = 0; |
| 733 | 749 | }else{ |
| 734 | 750 | pid = uuid_to_rid(zFromUuid, 1); |
| @@ -736,14 +752,20 @@ | ||
| 736 | 752 | if( zToUuid==0 ){ |
| 737 | 753 | fid = 0; |
| 738 | 754 | }else{ |
| 739 | 755 | fid = uuid_to_rid(zToUuid, 1); |
| 740 | 756 | } |
| 741 | - db_multi_exec( | |
| 757 | + db_static_prepare(&s1, | |
| 742 | 758 | "INSERT INTO mlink(mid,pid,fid,fnid,pfnid)" |
| 743 | - "VALUES(%d,%d,%d,%d,%d)", mid, pid, fid, fnid, pfnid | |
| 759 | + "VALUES(:m,:p,:f,:n,:pfn)" | |
| 744 | 760 | ); |
| 761 | + db_bind_int(&s1, ":m", mid); | |
| 762 | + db_bind_int(&s1, ":p", pid); | |
| 763 | + db_bind_int(&s1, ":f", fid); | |
| 764 | + db_bind_int(&s1, ":n", fnid); | |
| 765 | + db_bind_int(&s1, ":pfn", pfnid); | |
| 766 | + db_exec(&s1); | |
| 745 | 767 | if( pid && fid ){ |
| 746 | 768 | content_deltify(pid, fid, 0); |
| 747 | 769 | } |
| 748 | 770 | } |
| 749 | 771 | |
| 750 | 772 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -698,10 +698,33 @@ | |
| 698 | db_must_be_within_tree(); |
| 699 | blob_read_from_file(&b, g.argv[2]); |
| 700 | manifest_parse(&m, &b); |
| 701 | manifest_clear(&m); |
| 702 | } |
| 703 | |
| 704 | /* |
| 705 | ** Add a single entry to the mlink table. Also add the filename to |
| 706 | ** the filename table if it is not there already. |
| 707 | */ |
| @@ -711,24 +734,17 @@ | |
| 711 | const char *zToUuid, /* UUID for the mlink.fid field */ |
| 712 | const char *zFilename, /* Filename */ |
| 713 | const char *zPrior /* Previous filename. NULL if unchanged */ |
| 714 | ){ |
| 715 | int fnid, pfnid, pid, fid; |
| 716 | |
| 717 | fnid = db_int(0, "SELECT fnid FROM filename WHERE name=%Q", zFilename); |
| 718 | if( fnid==0 ){ |
| 719 | db_multi_exec("INSERT INTO filename(name) VALUES(%Q)", zFilename); |
| 720 | fnid = db_last_insert_rowid(); |
| 721 | } |
| 722 | if( zPrior==0 ){ |
| 723 | pfnid = 0; |
| 724 | }else{ |
| 725 | pfnid = db_int(0, "SELECT fnid FROM filename WHERE name=%Q", zPrior); |
| 726 | if( pfnid==0 ){ |
| 727 | db_multi_exec("INSERT INTO filename(name) VALUES(%Q)", zPrior); |
| 728 | pfnid = db_last_insert_rowid(); |
| 729 | } |
| 730 | } |
| 731 | if( zFromUuid==0 ){ |
| 732 | pid = 0; |
| 733 | }else{ |
| 734 | pid = uuid_to_rid(zFromUuid, 1); |
| @@ -736,14 +752,20 @@ | |
| 736 | if( zToUuid==0 ){ |
| 737 | fid = 0; |
| 738 | }else{ |
| 739 | fid = uuid_to_rid(zToUuid, 1); |
| 740 | } |
| 741 | db_multi_exec( |
| 742 | "INSERT INTO mlink(mid,pid,fid,fnid,pfnid)" |
| 743 | "VALUES(%d,%d,%d,%d,%d)", mid, pid, fid, fnid, pfnid |
| 744 | ); |
| 745 | if( pid && fid ){ |
| 746 | content_deltify(pid, fid, 0); |
| 747 | } |
| 748 | } |
| 749 | |
| 750 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -698,10 +698,33 @@ | |
| 698 | db_must_be_within_tree(); |
| 699 | blob_read_from_file(&b, g.argv[2]); |
| 700 | manifest_parse(&m, &b); |
| 701 | manifest_clear(&m); |
| 702 | } |
| 703 | |
| 704 | /* |
| 705 | ** Translate a filename into a filename-id (fnid). Create a new fnid |
| 706 | ** if no previously exists. |
| 707 | */ |
| 708 | static int filename_to_fnid(const char *zFilename){ |
| 709 | static Stmt q1, s1; |
| 710 | int fnid; |
| 711 | db_static_prepare(&q1, "SELECT fnid FROM filename WHERE name=:fn"); |
| 712 | db_bind_text(&q1, ":fn", zFilename); |
| 713 | fnid = 0; |
| 714 | if( db_step(&q1)==SQLITE_ROW ){ |
| 715 | fnid = db_column_int(&q1, 0); |
| 716 | } |
| 717 | db_reset(&q1); |
| 718 | if( fnid==0 ){ |
| 719 | db_static_prepare(&s1, "INSERT INTO filename(name) VALUES(:fn)"); |
| 720 | db_bind_text(&s1, ":fn", zFilename); |
| 721 | db_exec(&s1); |
| 722 | fnid = db_last_insert_rowid(); |
| 723 | } |
| 724 | return fnid; |
| 725 | } |
| 726 | |
| 727 | /* |
| 728 | ** Add a single entry to the mlink table. Also add the filename to |
| 729 | ** the filename table if it is not there already. |
| 730 | */ |
| @@ -711,24 +734,17 @@ | |
| 734 | const char *zToUuid, /* UUID for the mlink.fid field */ |
| 735 | const char *zFilename, /* Filename */ |
| 736 | const char *zPrior /* Previous filename. NULL if unchanged */ |
| 737 | ){ |
| 738 | int fnid, pfnid, pid, fid; |
| 739 | static Stmt s1; |
| 740 | |
| 741 | fnid = filename_to_fnid(zFilename); |
| 742 | if( zPrior==0 ){ |
| 743 | pfnid = 0; |
| 744 | }else{ |
| 745 | pfnid = filename_to_fnid(zPrior); |
| 746 | } |
| 747 | if( zFromUuid==0 ){ |
| 748 | pid = 0; |
| 749 | }else{ |
| 750 | pid = uuid_to_rid(zFromUuid, 1); |
| @@ -736,14 +752,20 @@ | |
| 752 | if( zToUuid==0 ){ |
| 753 | fid = 0; |
| 754 | }else{ |
| 755 | fid = uuid_to_rid(zToUuid, 1); |
| 756 | } |
| 757 | db_static_prepare(&s1, |
| 758 | "INSERT INTO mlink(mid,pid,fid,fnid,pfnid)" |
| 759 | "VALUES(:m,:p,:f,:n,:pfn)" |
| 760 | ); |
| 761 | db_bind_int(&s1, ":m", mid); |
| 762 | db_bind_int(&s1, ":p", pid); |
| 763 | db_bind_int(&s1, ":f", fid); |
| 764 | db_bind_int(&s1, ":n", fnid); |
| 765 | db_bind_int(&s1, ":pfn", pfnid); |
| 766 | db_exec(&s1); |
| 767 | if( pid && fid ){ |
| 768 | content_deltify(pid, fid, 0); |
| 769 | } |
| 770 | } |
| 771 | |
| 772 |