Fossil SCM

Still more speed improvements to the "rebuild" command.

drh 2009-08-27 18:56 trunk
Commit a9a27f8aaab2a7ab118a6cf92fdb3b5ebd8df7c4
1 file changed +34 -12
+34 -12
--- src/manifest.c
+++ src/manifest.c
@@ -698,10 +698,33 @@
698698
db_must_be_within_tree();
699699
blob_read_from_file(&b, g.argv[2]);
700700
manifest_parse(&m, &b);
701701
manifest_clear(&m);
702702
}
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
+}
703726
704727
/*
705728
** Add a single entry to the mlink table. Also add the filename to
706729
** the filename table if it is not there already.
707730
*/
@@ -711,24 +734,17 @@
711734
const char *zToUuid, /* UUID for the mlink.fid field */
712735
const char *zFilename, /* Filename */
713736
const char *zPrior /* Previous filename. NULL if unchanged */
714737
){
715738
int fnid, pfnid, pid, fid;
739
+ static Stmt s1;
716740
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);
722742
if( zPrior==0 ){
723743
pfnid = 0;
724744
}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);
730746
}
731747
if( zFromUuid==0 ){
732748
pid = 0;
733749
}else{
734750
pid = uuid_to_rid(zFromUuid, 1);
@@ -736,14 +752,20 @@
736752
if( zToUuid==0 ){
737753
fid = 0;
738754
}else{
739755
fid = uuid_to_rid(zToUuid, 1);
740756
}
741
- db_multi_exec(
757
+ db_static_prepare(&s1,
742758
"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)"
744760
);
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);
745767
if( pid && fid ){
746768
content_deltify(pid, fid, 0);
747769
}
748770
}
749771
750772
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button