Fossil SCM

Simple test cases for configuration sync are now working.

drh 2011-04-27 00:49 UTC config-sync
Commit bef34a6940b916316d7d3a73a9383dd02b96e116
+10 -10
--- src/configure.c
+++ src/configure.c
@@ -583,16 +583,16 @@
583583
blob_zero(&rec);
584584
if( groupMask & CONFIGSET_SHUN ){
585585
db_prepare(&q, "SELECT mtime, quote(uuid), quote(scom) FROM shun"
586586
" WHERE mtime>=%lld", iStart);
587587
while( db_step(&q)==SQLITE_ROW ){
588
- blob_appendf(&rec,"%s %s scom %s\n",
588
+ blob_appendf(&rec,"%s %s scom %s",
589589
db_column_text(&q, 0),
590590
db_column_text(&q, 1),
591591
db_column_text(&q, 2)
592592
);
593
- blob_appendf(pOut, "config /shun %d\n%s",
593
+ blob_appendf(pOut, "config /shun %d\n%s\n",
594594
blob_size(&rec), blob_str(&rec));
595595
nCard++;
596596
blob_reset(&rec);
597597
}
598598
db_finalize(&q);
@@ -600,19 +600,19 @@
600600
if( groupMask & CONFIGSET_USER ){
601601
db_prepare(&q, "SELECT mtime, quote(login), quote(pw), quote(cap),"
602602
" quote(info), quote(photo) FROM user"
603603
" WHERE mtime>=%lld", iStart);
604604
while( db_step(&q)==SQLITE_ROW ){
605
- blob_appendf(&rec,"%s %s pw %s cap %s info %s photo %s\n",
605
+ blob_appendf(&rec,"%s %s pw %s cap %s info %s photo %s",
606606
db_column_text(&q, 0),
607607
db_column_text(&q, 1),
608608
db_column_text(&q, 2),
609609
db_column_text(&q, 3),
610610
db_column_text(&q, 4),
611611
db_column_text(&q, 5)
612612
);
613
- blob_appendf(pOut, "config /user %d\n%s",
613
+ blob_appendf(pOut, "config /user %d\n%s\n",
614614
blob_size(&rec), blob_str(&rec));
615615
nCard++;
616616
blob_reset(&rec);
617617
}
618618
db_finalize(&q);
@@ -620,18 +620,18 @@
620620
if( groupMask & CONFIGSET_TKT ){
621621
db_prepare(&q, "SELECT mtime, quote(title), quote(owner), quote(cols),"
622622
" quote(sqlcode) FROM reportfmt"
623623
" WHERE mtime>=%lld", iStart);
624624
while( db_step(&q)==SQLITE_ROW ){
625
- blob_appendf(&rec,"%s %s owner %s cols %s sqlcode %s\n",
625
+ blob_appendf(&rec,"%s %s owner %s cols %s sqlcode %s",
626626
db_column_text(&q, 0),
627627
db_column_text(&q, 1),
628628
db_column_text(&q, 2),
629629
db_column_text(&q, 3),
630630
db_column_text(&q, 4)
631631
);
632
- blob_appendf(pOut, "config /reportfmt %d\n%s",
632
+ blob_appendf(pOut, "config /reportfmt %d\n%s\n",
633633
blob_size(&rec), blob_str(&rec));
634634
nCard++;
635635
blob_reset(&rec);
636636
}
637637
db_finalize(&q);
@@ -638,16 +638,16 @@
638638
}
639639
if( groupMask & CONFIGSET_ADDR ){
640640
db_prepare(&q, "SELECT mtime, quote(hash), quote(content) FROM concealed"
641641
" WHERE mtime>=%lld", iStart);
642642
while( db_step(&q)==SQLITE_ROW ){
643
- blob_appendf(&rec,"%s %s content %s\n",
643
+ blob_appendf(&rec,"%s %s content %s",
644644
db_column_text(&q, 0),
645645
db_column_text(&q, 1),
646646
db_column_text(&q, 2)
647647
);
648
- blob_appendf(pOut, "config /concealed %d\n%s",
648
+ blob_appendf(pOut, "config /concealed %d\n%s\n",
649649
blob_size(&rec), blob_str(&rec));
650650
nCard++;
651651
blob_reset(&rec);
652652
}
653653
db_finalize(&q);
@@ -656,16 +656,16 @@
656656
" WHERE name=:name AND mtime>=%lld", iStart);
657657
for(ii=0; ii<count(aConfig); ii++){
658658
if( (aConfig[ii].groupMask & groupMask)!=0 && aConfig[ii].zName[0]!='@' ){
659659
db_bind_text(&q, ":name", aConfig[ii].zName);
660660
while( db_step(&q)==SQLITE_ROW ){
661
- blob_appendf(&rec,"%s %s value %s\n",
661
+ blob_appendf(&rec,"%s %s value %s",
662662
db_column_text(&q, 0),
663663
db_column_text(&q, 1),
664664
db_column_text(&q, 2)
665665
);
666
- blob_appendf(pOut, "config /config %d\n%s",
666
+ blob_appendf(pOut, "config /config %d\n%s\n",
667667
blob_size(&rec), blob_str(&rec));
668668
nCard++;
669669
blob_reset(&rec);
670670
}
671671
db_reset(&q);
672672
--- src/configure.c
+++ src/configure.c
@@ -583,16 +583,16 @@
583 blob_zero(&rec);
584 if( groupMask & CONFIGSET_SHUN ){
585 db_prepare(&q, "SELECT mtime, quote(uuid), quote(scom) FROM shun"
586 " WHERE mtime>=%lld", iStart);
587 while( db_step(&q)==SQLITE_ROW ){
588 blob_appendf(&rec,"%s %s scom %s\n",
589 db_column_text(&q, 0),
590 db_column_text(&q, 1),
591 db_column_text(&q, 2)
592 );
593 blob_appendf(pOut, "config /shun %d\n%s",
594 blob_size(&rec), blob_str(&rec));
595 nCard++;
596 blob_reset(&rec);
597 }
598 db_finalize(&q);
@@ -600,19 +600,19 @@
600 if( groupMask & CONFIGSET_USER ){
601 db_prepare(&q, "SELECT mtime, quote(login), quote(pw), quote(cap),"
602 " quote(info), quote(photo) FROM user"
603 " WHERE mtime>=%lld", iStart);
604 while( db_step(&q)==SQLITE_ROW ){
605 blob_appendf(&rec,"%s %s pw %s cap %s info %s photo %s\n",
606 db_column_text(&q, 0),
607 db_column_text(&q, 1),
608 db_column_text(&q, 2),
609 db_column_text(&q, 3),
610 db_column_text(&q, 4),
611 db_column_text(&q, 5)
612 );
613 blob_appendf(pOut, "config /user %d\n%s",
614 blob_size(&rec), blob_str(&rec));
615 nCard++;
616 blob_reset(&rec);
617 }
618 db_finalize(&q);
@@ -620,18 +620,18 @@
620 if( groupMask & CONFIGSET_TKT ){
621 db_prepare(&q, "SELECT mtime, quote(title), quote(owner), quote(cols),"
622 " quote(sqlcode) FROM reportfmt"
623 " WHERE mtime>=%lld", iStart);
624 while( db_step(&q)==SQLITE_ROW ){
625 blob_appendf(&rec,"%s %s owner %s cols %s sqlcode %s\n",
626 db_column_text(&q, 0),
627 db_column_text(&q, 1),
628 db_column_text(&q, 2),
629 db_column_text(&q, 3),
630 db_column_text(&q, 4)
631 );
632 blob_appendf(pOut, "config /reportfmt %d\n%s",
633 blob_size(&rec), blob_str(&rec));
634 nCard++;
635 blob_reset(&rec);
636 }
637 db_finalize(&q);
@@ -638,16 +638,16 @@
638 }
639 if( groupMask & CONFIGSET_ADDR ){
640 db_prepare(&q, "SELECT mtime, quote(hash), quote(content) FROM concealed"
641 " WHERE mtime>=%lld", iStart);
642 while( db_step(&q)==SQLITE_ROW ){
643 blob_appendf(&rec,"%s %s content %s\n",
644 db_column_text(&q, 0),
645 db_column_text(&q, 1),
646 db_column_text(&q, 2)
647 );
648 blob_appendf(pOut, "config /concealed %d\n%s",
649 blob_size(&rec), blob_str(&rec));
650 nCard++;
651 blob_reset(&rec);
652 }
653 db_finalize(&q);
@@ -656,16 +656,16 @@
656 " WHERE name=:name AND mtime>=%lld", iStart);
657 for(ii=0; ii<count(aConfig); ii++){
658 if( (aConfig[ii].groupMask & groupMask)!=0 && aConfig[ii].zName[0]!='@' ){
659 db_bind_text(&q, ":name", aConfig[ii].zName);
660 while( db_step(&q)==SQLITE_ROW ){
661 blob_appendf(&rec,"%s %s value %s\n",
662 db_column_text(&q, 0),
663 db_column_text(&q, 1),
664 db_column_text(&q, 2)
665 );
666 blob_appendf(pOut, "config /config %d\n%s",
667 blob_size(&rec), blob_str(&rec));
668 nCard++;
669 blob_reset(&rec);
670 }
671 db_reset(&q);
672
--- src/configure.c
+++ src/configure.c
@@ -583,16 +583,16 @@
583 blob_zero(&rec);
584 if( groupMask & CONFIGSET_SHUN ){
585 db_prepare(&q, "SELECT mtime, quote(uuid), quote(scom) FROM shun"
586 " WHERE mtime>=%lld", iStart);
587 while( db_step(&q)==SQLITE_ROW ){
588 blob_appendf(&rec,"%s %s scom %s",
589 db_column_text(&q, 0),
590 db_column_text(&q, 1),
591 db_column_text(&q, 2)
592 );
593 blob_appendf(pOut, "config /shun %d\n%s\n",
594 blob_size(&rec), blob_str(&rec));
595 nCard++;
596 blob_reset(&rec);
597 }
598 db_finalize(&q);
@@ -600,19 +600,19 @@
600 if( groupMask & CONFIGSET_USER ){
601 db_prepare(&q, "SELECT mtime, quote(login), quote(pw), quote(cap),"
602 " quote(info), quote(photo) FROM user"
603 " WHERE mtime>=%lld", iStart);
604 while( db_step(&q)==SQLITE_ROW ){
605 blob_appendf(&rec,"%s %s pw %s cap %s info %s photo %s",
606 db_column_text(&q, 0),
607 db_column_text(&q, 1),
608 db_column_text(&q, 2),
609 db_column_text(&q, 3),
610 db_column_text(&q, 4),
611 db_column_text(&q, 5)
612 );
613 blob_appendf(pOut, "config /user %d\n%s\n",
614 blob_size(&rec), blob_str(&rec));
615 nCard++;
616 blob_reset(&rec);
617 }
618 db_finalize(&q);
@@ -620,18 +620,18 @@
620 if( groupMask & CONFIGSET_TKT ){
621 db_prepare(&q, "SELECT mtime, quote(title), quote(owner), quote(cols),"
622 " quote(sqlcode) FROM reportfmt"
623 " WHERE mtime>=%lld", iStart);
624 while( db_step(&q)==SQLITE_ROW ){
625 blob_appendf(&rec,"%s %s owner %s cols %s sqlcode %s",
626 db_column_text(&q, 0),
627 db_column_text(&q, 1),
628 db_column_text(&q, 2),
629 db_column_text(&q, 3),
630 db_column_text(&q, 4)
631 );
632 blob_appendf(pOut, "config /reportfmt %d\n%s\n",
633 blob_size(&rec), blob_str(&rec));
634 nCard++;
635 blob_reset(&rec);
636 }
637 db_finalize(&q);
@@ -638,16 +638,16 @@
638 }
639 if( groupMask & CONFIGSET_ADDR ){
640 db_prepare(&q, "SELECT mtime, quote(hash), quote(content) FROM concealed"
641 " WHERE mtime>=%lld", iStart);
642 while( db_step(&q)==SQLITE_ROW ){
643 blob_appendf(&rec,"%s %s content %s",
644 db_column_text(&q, 0),
645 db_column_text(&q, 1),
646 db_column_text(&q, 2)
647 );
648 blob_appendf(pOut, "config /concealed %d\n%s\n",
649 blob_size(&rec), blob_str(&rec));
650 nCard++;
651 blob_reset(&rec);
652 }
653 db_finalize(&q);
@@ -656,16 +656,16 @@
656 " WHERE name=:name AND mtime>=%lld", iStart);
657 for(ii=0; ii<count(aConfig); ii++){
658 if( (aConfig[ii].groupMask & groupMask)!=0 && aConfig[ii].zName[0]!='@' ){
659 db_bind_text(&q, ":name", aConfig[ii].zName);
660 while( db_step(&q)==SQLITE_ROW ){
661 blob_appendf(&rec,"%s %s value %s",
662 db_column_text(&q, 0),
663 db_column_text(&q, 1),
664 db_column_text(&q, 2)
665 );
666 blob_appendf(pOut, "config /config %d\n%s\n",
667 blob_size(&rec), blob_str(&rec));
668 nCard++;
669 blob_reset(&rec);
670 }
671 db_reset(&q);
672
+39 -25
--- src/rebuild.c
+++ src/rebuild.c
@@ -82,66 +82,80 @@
8282
@ );
8383
;
8484
8585
static void rebuild_update_schema(void){
8686
int rc;
87
- sqlite3_stmt *pStmt;
8887
db_multi_exec(zSchemaUpdates1);
8988
db_multi_exec(zSchemaUpdates2);
9089
91
- rc = sqlite3_prepare(g.db, "SELECT mtime FROM user", -1, &pStmt, 0);
92
- sqlite3_finalize(pStmt);
93
- if( rc==SQLITE_ERROR ){
90
+ rc = db_exists("SELECT 1 FROM sqlite_master"
91
+ " WHERE name='user' AND sql GLOB '* mtime *'");
92
+ if( rc==0 ){
9493
db_multi_exec(
95
- "ALTER TABLE user ADD COLUMN mtime INTEGER;"
96
- "UPDATE user SET mtime=(SELECT strftime('%%s','now'));"
94
+ "CREATE TEMP TABLE temp_user AS SELECT * FROM user;"
95
+ "DROP TABLE user;"
96
+ "CREATE TABLE user(\n"
97
+ " uid INTEGER PRIMARY KEY,\n"
98
+ " login TEXT UNIQUE,\n"
99
+ " pw TEXT,\n"
100
+ " cap TEXT,\n"
101
+ " cookie TEXT,\n"
102
+ " ipaddr TEXT,\n"
103
+ " cexpire DATETIME,\n"
104
+ " info TEXT,\n"
105
+ " mtime DATE,\n"
106
+ " photo BLOB\n"
107
+ ");"
108
+ "INSERT OR IGNORE INTO user"
109
+ " SELECT uid, login, pw, cap, cookie,"
110
+ " ipaddr, cexpire, info, now(), photo FROM temp_user;"
111
+ "DROP TABLE temp_user;"
97112
);
98113
}
99114
100
- rc = sqlite3_prepare(g.db, "SELECT mtime FROM config", -1, &pStmt, 0);
101
- sqlite3_finalize(pStmt);
102
- if( rc==SQLITE_ERROR ){
115
+ rc = db_exists("SELECT 1 FROM sqlite_master"
116
+ " WHERE name='config' AND sql GLOB '* mtime *'");
117
+ if( rc==0 ){
103118
db_multi_exec(
104119
"ALTER TABLE config ADD COLUMN mtime INTEGER;"
105
- "UPDATE config SET mtime=(SELECT strftime('%%s','now'));"
120
+ "UPDATE config SET mtime=now();"
106121
);
107122
}
108123
109
- rc = sqlite3_prepare(g.db, "SELECT mtime FROM shun", -1, &pStmt, 0);
110
- sqlite3_finalize(pStmt);
111
- if( rc==SQLITE_ERROR ){
124
+ rc = db_exists("SELECT 1 FROM sqlite_master"
125
+ " WHERE name='shun' AND sql GLOB '* mtime *'");
126
+ if( rc==0 ){
112127
db_multi_exec(
113128
"ALTER TABLE shun ADD COLUMN mtime INTEGER;"
114129
"ALTER TABLE shun ADD COLUMN scom TEXT;"
115
- "UPDATE shun SET mtime=(SELECT strftime('%%s','now'));"
130
+ "UPDATE shun SET mtime=now();"
116131
);
117132
}
118133
119
- rc = sqlite3_prepare(g.db, "SELECT mtime FROM reportfmt", -1, &pStmt, 0);
120
- sqlite3_finalize(pStmt);
121
- if( rc==SQLITE_ERROR ){
134
+ rc = db_exists("SELECT 1 FROM sqlite_master"
135
+ " WHERE name='reportfmt' AND sql GLOB '* mtime *'");
136
+ if( rc==0 ){
122137
db_multi_exec(
123138
"CREATE TEMP TABLE old_fmt AS SELECT * FROM reportfmt;"
124139
"DROP TABLE reportfmt;"
125140
);
126141
db_multi_exec(zSchemaUpdates2);
127142
db_multi_exec(
128143
"INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
129
- " SELECT rn, owner, title, cols, sqlcode,"
130
- " (SELECT strftime('%%s','now')+0) FROM old_fmt;"
144
+ " SELECT rn, owner, title, cols, sqlcode, now() FROM old_fmt;"
131145
"INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
132
- " SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode,"
133
- " (SELECT strftime('%%s','now')+0) FROM old_fmt;"
146
+ " SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode, now()"
147
+ " FROM old_fmt;"
134148
);
135149
}
136150
137
- rc = sqlite3_prepare(g.db, "SELECT mtime FROM concealed", -1, &pStmt, 0);
138
- sqlite3_finalize(pStmt);
139
- if( rc==SQLITE_ERROR ){
151
+ rc = db_exists("SELECT 1 FROM sqlite_master"
152
+ " WHERE name='concealed' AND sql GLOB '* mtime *'");
153
+ if( rc==0 ){
140154
db_multi_exec(
141155
"ALTER TABLE concealed ADD COLUMN mtime INTEGER;"
142
- "UPDATE concealed SET mtime=(SELECT strftime('%%s','now'));"
156
+ "UPDATE concealed SET mtime=now();"
143157
);
144158
}
145159
}
146160
147161
/*
148162
--- src/rebuild.c
+++ src/rebuild.c
@@ -82,66 +82,80 @@
82 @ );
83 ;
84
85 static void rebuild_update_schema(void){
86 int rc;
87 sqlite3_stmt *pStmt;
88 db_multi_exec(zSchemaUpdates1);
89 db_multi_exec(zSchemaUpdates2);
90
91 rc = sqlite3_prepare(g.db, "SELECT mtime FROM user", -1, &pStmt, 0);
92 sqlite3_finalize(pStmt);
93 if( rc==SQLITE_ERROR ){
94 db_multi_exec(
95 "ALTER TABLE user ADD COLUMN mtime INTEGER;"
96 "UPDATE user SET mtime=(SELECT strftime('%%s','now'));"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97 );
98 }
99
100 rc = sqlite3_prepare(g.db, "SELECT mtime FROM config", -1, &pStmt, 0);
101 sqlite3_finalize(pStmt);
102 if( rc==SQLITE_ERROR ){
103 db_multi_exec(
104 "ALTER TABLE config ADD COLUMN mtime INTEGER;"
105 "UPDATE config SET mtime=(SELECT strftime('%%s','now'));"
106 );
107 }
108
109 rc = sqlite3_prepare(g.db, "SELECT mtime FROM shun", -1, &pStmt, 0);
110 sqlite3_finalize(pStmt);
111 if( rc==SQLITE_ERROR ){
112 db_multi_exec(
113 "ALTER TABLE shun ADD COLUMN mtime INTEGER;"
114 "ALTER TABLE shun ADD COLUMN scom TEXT;"
115 "UPDATE shun SET mtime=(SELECT strftime('%%s','now'));"
116 );
117 }
118
119 rc = sqlite3_prepare(g.db, "SELECT mtime FROM reportfmt", -1, &pStmt, 0);
120 sqlite3_finalize(pStmt);
121 if( rc==SQLITE_ERROR ){
122 db_multi_exec(
123 "CREATE TEMP TABLE old_fmt AS SELECT * FROM reportfmt;"
124 "DROP TABLE reportfmt;"
125 );
126 db_multi_exec(zSchemaUpdates2);
127 db_multi_exec(
128 "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
129 " SELECT rn, owner, title, cols, sqlcode,"
130 " (SELECT strftime('%%s','now')+0) FROM old_fmt;"
131 "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
132 " SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode,"
133 " (SELECT strftime('%%s','now')+0) FROM old_fmt;"
134 );
135 }
136
137 rc = sqlite3_prepare(g.db, "SELECT mtime FROM concealed", -1, &pStmt, 0);
138 sqlite3_finalize(pStmt);
139 if( rc==SQLITE_ERROR ){
140 db_multi_exec(
141 "ALTER TABLE concealed ADD COLUMN mtime INTEGER;"
142 "UPDATE concealed SET mtime=(SELECT strftime('%%s','now'));"
143 );
144 }
145 }
146
147 /*
148
--- src/rebuild.c
+++ src/rebuild.c
@@ -82,66 +82,80 @@
82 @ );
83 ;
84
85 static void rebuild_update_schema(void){
86 int rc;
 
87 db_multi_exec(zSchemaUpdates1);
88 db_multi_exec(zSchemaUpdates2);
89
90 rc = db_exists("SELECT 1 FROM sqlite_master"
91 " WHERE name='user' AND sql GLOB '* mtime *'");
92 if( rc==0 ){
93 db_multi_exec(
94 "CREATE TEMP TABLE temp_user AS SELECT * FROM user;"
95 "DROP TABLE user;"
96 "CREATE TABLE user(\n"
97 " uid INTEGER PRIMARY KEY,\n"
98 " login TEXT UNIQUE,\n"
99 " pw TEXT,\n"
100 " cap TEXT,\n"
101 " cookie TEXT,\n"
102 " ipaddr TEXT,\n"
103 " cexpire DATETIME,\n"
104 " info TEXT,\n"
105 " mtime DATE,\n"
106 " photo BLOB\n"
107 ");"
108 "INSERT OR IGNORE INTO user"
109 " SELECT uid, login, pw, cap, cookie,"
110 " ipaddr, cexpire, info, now(), photo FROM temp_user;"
111 "DROP TABLE temp_user;"
112 );
113 }
114
115 rc = db_exists("SELECT 1 FROM sqlite_master"
116 " WHERE name='config' AND sql GLOB '* mtime *'");
117 if( rc==0 ){
118 db_multi_exec(
119 "ALTER TABLE config ADD COLUMN mtime INTEGER;"
120 "UPDATE config SET mtime=now();"
121 );
122 }
123
124 rc = db_exists("SELECT 1 FROM sqlite_master"
125 " WHERE name='shun' AND sql GLOB '* mtime *'");
126 if( rc==0 ){
127 db_multi_exec(
128 "ALTER TABLE shun ADD COLUMN mtime INTEGER;"
129 "ALTER TABLE shun ADD COLUMN scom TEXT;"
130 "UPDATE shun SET mtime=now();"
131 );
132 }
133
134 rc = db_exists("SELECT 1 FROM sqlite_master"
135 " WHERE name='reportfmt' AND sql GLOB '* mtime *'");
136 if( rc==0 ){
137 db_multi_exec(
138 "CREATE TEMP TABLE old_fmt AS SELECT * FROM reportfmt;"
139 "DROP TABLE reportfmt;"
140 );
141 db_multi_exec(zSchemaUpdates2);
142 db_multi_exec(
143 "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
144 " SELECT rn, owner, title, cols, sqlcode, now() FROM old_fmt;"
 
145 "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
146 " SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode, now()"
147 " FROM old_fmt;"
148 );
149 }
150
151 rc = db_exists("SELECT 1 FROM sqlite_master"
152 " WHERE name='concealed' AND sql GLOB '* mtime *'");
153 if( rc==0 ){
154 db_multi_exec(
155 "ALTER TABLE concealed ADD COLUMN mtime INTEGER;"
156 "UPDATE concealed SET mtime=now();"
157 );
158 }
159 }
160
161 /*
162
+1 -1
--- src/schema.c
+++ src/schema.c
@@ -110,11 +110,11 @@
110110
@ -- hash based on the project-code, the user login, and the cleartext
111111
@ -- password.
112112
@ --
113113
@ CREATE TABLE user(
114114
@ uid INTEGER PRIMARY KEY, -- User ID
115
-@ login TEXT, -- login name of the user
115
+@ login TEXT UNIQUE, -- login name of the user
116116
@ pw TEXT, -- password
117117
@ cap TEXT, -- Capabilities of this user
118118
@ cookie TEXT, -- WWW login cookie
119119
@ ipaddr TEXT, -- IP address for which cookie is valid
120120
@ cexpire DATETIME, -- Time when cookie expires
121121
--- src/schema.c
+++ src/schema.c
@@ -110,11 +110,11 @@
110 @ -- hash based on the project-code, the user login, and the cleartext
111 @ -- password.
112 @ --
113 @ CREATE TABLE user(
114 @ uid INTEGER PRIMARY KEY, -- User ID
115 @ login TEXT, -- login name of the user
116 @ pw TEXT, -- password
117 @ cap TEXT, -- Capabilities of this user
118 @ cookie TEXT, -- WWW login cookie
119 @ ipaddr TEXT, -- IP address for which cookie is valid
120 @ cexpire DATETIME, -- Time when cookie expires
121
--- src/schema.c
+++ src/schema.c
@@ -110,11 +110,11 @@
110 @ -- hash based on the project-code, the user login, and the cleartext
111 @ -- password.
112 @ --
113 @ CREATE TABLE user(
114 @ uid INTEGER PRIMARY KEY, -- User ID
115 @ login TEXT UNIQUE, -- login name of the user
116 @ pw TEXT, -- password
117 @ cap TEXT, -- Capabilities of this user
118 @ cookie TEXT, -- WWW login cookie
119 @ ipaddr TEXT, -- IP address for which cookie is valid
120 @ cexpire DATETIME, -- Time when cookie expires
121
+4 -3
--- src/setup.c
+++ src/setup.c
@@ -354,12 +354,12 @@
354354
style_footer();
355355
return;
356356
}
357357
login_verify_csrf_secret();
358358
db_multi_exec(
359
- "REPLACE INTO user(uid,login,info,pw,cap) "
360
- "VALUES(nullif(%d,0),%Q,%Q,%Q,'%s')",
359
+ "REPLACE INTO user(uid,login,info,pw,cap,mtime) "
360
+ "VALUES(nullif(%d,0),%Q,%Q,%Q,'%s',now())",
361361
uid, P("login"), P("info"), zPw, zCap
362362
);
363363
if( atoi(PD("all","0"))>0 ){
364364
Blob sql;
365365
char *zErr = 0;
@@ -375,11 +375,12 @@
375375
blob_appendf(&sql,
376376
"UPDATE user SET login=%Q,"
377377
" pw=coalesce(shared_secret(%Q,%Q,"
378378
"(SELECT value FROM config WHERE name='project-code')),pw),"
379379
" info=%Q,"
380
- " cap=%Q"
380
+ " cap=%Q,"
381
+ " mtime=now()"
381382
" WHERE login=%Q;",
382383
zLogin, P("pw"), zLogin, P("info"), zCap,
383384
zOldLogin
384385
);
385386
login_group_sql(blob_str(&sql), "<li> ", " </li>\n", &zErr);
386387
--- src/setup.c
+++ src/setup.c
@@ -354,12 +354,12 @@
354 style_footer();
355 return;
356 }
357 login_verify_csrf_secret();
358 db_multi_exec(
359 "REPLACE INTO user(uid,login,info,pw,cap) "
360 "VALUES(nullif(%d,0),%Q,%Q,%Q,'%s')",
361 uid, P("login"), P("info"), zPw, zCap
362 );
363 if( atoi(PD("all","0"))>0 ){
364 Blob sql;
365 char *zErr = 0;
@@ -375,11 +375,12 @@
375 blob_appendf(&sql,
376 "UPDATE user SET login=%Q,"
377 " pw=coalesce(shared_secret(%Q,%Q,"
378 "(SELECT value FROM config WHERE name='project-code')),pw),"
379 " info=%Q,"
380 " cap=%Q"
 
381 " WHERE login=%Q;",
382 zLogin, P("pw"), zLogin, P("info"), zCap,
383 zOldLogin
384 );
385 login_group_sql(blob_str(&sql), "<li> ", " </li>\n", &zErr);
386
--- src/setup.c
+++ src/setup.c
@@ -354,12 +354,12 @@
354 style_footer();
355 return;
356 }
357 login_verify_csrf_secret();
358 db_multi_exec(
359 "REPLACE INTO user(uid,login,info,pw,cap,mtime) "
360 "VALUES(nullif(%d,0),%Q,%Q,%Q,'%s',now())",
361 uid, P("login"), P("info"), zPw, zCap
362 );
363 if( atoi(PD("all","0"))>0 ){
364 Blob sql;
365 char *zErr = 0;
@@ -375,11 +375,12 @@
375 blob_appendf(&sql,
376 "UPDATE user SET login=%Q,"
377 " pw=coalesce(shared_secret(%Q,%Q,"
378 "(SELECT value FROM config WHERE name='project-code')),pw),"
379 " info=%Q,"
380 " cap=%Q,"
381 " mtime=now()"
382 " WHERE login=%Q;",
383 zLogin, P("pw"), zLogin, P("info"), zCap,
384 zOldLogin
385 );
386 login_group_sql(blob_str(&sql), "<li> ", " </li>\n", &zErr);
387
+9 -8
--- src/user.c
+++ src/user.c
@@ -204,12 +204,12 @@
204204
}else{
205205
prompt_for_password("password: ", &passwd, 1);
206206
}
207207
zPw = sha1_shared_secret(blob_str(&passwd), blob_str(&login), 0);
208208
db_multi_exec(
209
- "INSERT INTO user(login,pw,cap,info)"
210
- "VALUES(%B,%Q,%B,%B)",
209
+ "INSERT INTO user(login,pw,cap,info,mtime)"
210
+ "VALUES(%B,%Q,%B,%B,now())",
211211
&login, zPw, &caps, &contact
212212
);
213213
free(zPw);
214214
}else if( n>=2 && strncmp(g.argv[2],"default",n)==0 ){
215215
user_select();
@@ -249,11 +249,12 @@
249249
}
250250
if( blob_size(&pw)==0 ){
251251
printf("password unchanged\n");
252252
}else{
253253
char *zSecret = sha1_shared_secret(blob_str(&pw), g.argv[3], 0);
254
- db_multi_exec("UPDATE user SET pw=%Q WHERE uid=%d", zSecret, uid);
254
+ db_multi_exec("UPDATE user SET pw=%Q, mtime=now() WHERE uid=%d",
255
+ zSecret, uid);
255256
free(zSecret);
256257
}
257258
}else if( n>=2 && strncmp(g.argv[2],"capabilities",2)==0 ){
258259
int uid;
259260
if( g.argc!=4 && g.argc!=5 ){
@@ -263,12 +264,12 @@
263264
if( uid==0 ){
264265
fossil_fatal("no such user: %s", g.argv[3]);
265266
}
266267
if( g.argc==5 ){
267268
db_multi_exec(
268
- "UPDATE user SET cap=%Q WHERE uid=%d", g.argv[4],
269
- uid
269
+ "UPDATE user SET cap=%Q, mtime=now() WHERE uid=%d",
270
+ g.argv[4], uid
270271
);
271272
}
272273
printf("%s\n", db_text(0, "SELECT cap FROM user WHERE uid=%d", uid));
273274
}else{
274275
fossil_panic("user subcommand should be one of: "
@@ -340,12 +341,12 @@
340341
db_finalize(&s);
341342
}
342343
343344
if( g.userUid==0 ){
344345
db_multi_exec(
345
- "INSERT INTO user(login, pw, cap, info)"
346
- "VALUES('anonymous', '', 'cfghjkmnoqw', '')"
346
+ "INSERT INTO user(login, pw, cap, info, mtime)"
347
+ "VALUES('anonymous', '', 'cfghjkmnoqw', '', now())"
347348
);
348349
g.userUid = db_last_insert_rowid();
349350
g.zLogin = "anonymous";
350351
}
351352
}
@@ -364,11 +365,11 @@
364365
if( g.argc!=3 ) usage("REPOSITORY");
365366
db_open_repository(g.argv[2]);
366367
sqlite3_create_function(g.db, "shared_secret", 2, SQLITE_UTF8, 0,
367368
sha1_shared_secret_sql_function, 0, 0);
368369
db_multi_exec(
369
- "UPDATE user SET pw=shared_secret(pw,login)"
370
+ "UPDATE user SET pw=shared_secret(pw,login), mtime=now()"
370371
" WHERE length(pw)>0 AND length(pw)!=40"
371372
);
372373
}
373374
374375
/*
375376
--- src/user.c
+++ src/user.c
@@ -204,12 +204,12 @@
204 }else{
205 prompt_for_password("password: ", &passwd, 1);
206 }
207 zPw = sha1_shared_secret(blob_str(&passwd), blob_str(&login), 0);
208 db_multi_exec(
209 "INSERT INTO user(login,pw,cap,info)"
210 "VALUES(%B,%Q,%B,%B)",
211 &login, zPw, &caps, &contact
212 );
213 free(zPw);
214 }else if( n>=2 && strncmp(g.argv[2],"default",n)==0 ){
215 user_select();
@@ -249,11 +249,12 @@
249 }
250 if( blob_size(&pw)==0 ){
251 printf("password unchanged\n");
252 }else{
253 char *zSecret = sha1_shared_secret(blob_str(&pw), g.argv[3], 0);
254 db_multi_exec("UPDATE user SET pw=%Q WHERE uid=%d", zSecret, uid);
 
255 free(zSecret);
256 }
257 }else if( n>=2 && strncmp(g.argv[2],"capabilities",2)==0 ){
258 int uid;
259 if( g.argc!=4 && g.argc!=5 ){
@@ -263,12 +264,12 @@
263 if( uid==0 ){
264 fossil_fatal("no such user: %s", g.argv[3]);
265 }
266 if( g.argc==5 ){
267 db_multi_exec(
268 "UPDATE user SET cap=%Q WHERE uid=%d", g.argv[4],
269 uid
270 );
271 }
272 printf("%s\n", db_text(0, "SELECT cap FROM user WHERE uid=%d", uid));
273 }else{
274 fossil_panic("user subcommand should be one of: "
@@ -340,12 +341,12 @@
340 db_finalize(&s);
341 }
342
343 if( g.userUid==0 ){
344 db_multi_exec(
345 "INSERT INTO user(login, pw, cap, info)"
346 "VALUES('anonymous', '', 'cfghjkmnoqw', '')"
347 );
348 g.userUid = db_last_insert_rowid();
349 g.zLogin = "anonymous";
350 }
351 }
@@ -364,11 +365,11 @@
364 if( g.argc!=3 ) usage("REPOSITORY");
365 db_open_repository(g.argv[2]);
366 sqlite3_create_function(g.db, "shared_secret", 2, SQLITE_UTF8, 0,
367 sha1_shared_secret_sql_function, 0, 0);
368 db_multi_exec(
369 "UPDATE user SET pw=shared_secret(pw,login)"
370 " WHERE length(pw)>0 AND length(pw)!=40"
371 );
372 }
373
374 /*
375
--- src/user.c
+++ src/user.c
@@ -204,12 +204,12 @@
204 }else{
205 prompt_for_password("password: ", &passwd, 1);
206 }
207 zPw = sha1_shared_secret(blob_str(&passwd), blob_str(&login), 0);
208 db_multi_exec(
209 "INSERT INTO user(login,pw,cap,info,mtime)"
210 "VALUES(%B,%Q,%B,%B,now())",
211 &login, zPw, &caps, &contact
212 );
213 free(zPw);
214 }else if( n>=2 && strncmp(g.argv[2],"default",n)==0 ){
215 user_select();
@@ -249,11 +249,12 @@
249 }
250 if( blob_size(&pw)==0 ){
251 printf("password unchanged\n");
252 }else{
253 char *zSecret = sha1_shared_secret(blob_str(&pw), g.argv[3], 0);
254 db_multi_exec("UPDATE user SET pw=%Q, mtime=now() WHERE uid=%d",
255 zSecret, uid);
256 free(zSecret);
257 }
258 }else if( n>=2 && strncmp(g.argv[2],"capabilities",2)==0 ){
259 int uid;
260 if( g.argc!=4 && g.argc!=5 ){
@@ -263,12 +264,12 @@
264 if( uid==0 ){
265 fossil_fatal("no such user: %s", g.argv[3]);
266 }
267 if( g.argc==5 ){
268 db_multi_exec(
269 "UPDATE user SET cap=%Q, mtime=now() WHERE uid=%d",
270 g.argv[4], uid
271 );
272 }
273 printf("%s\n", db_text(0, "SELECT cap FROM user WHERE uid=%d", uid));
274 }else{
275 fossil_panic("user subcommand should be one of: "
@@ -340,12 +341,12 @@
341 db_finalize(&s);
342 }
343
344 if( g.userUid==0 ){
345 db_multi_exec(
346 "INSERT INTO user(login, pw, cap, info, mtime)"
347 "VALUES('anonymous', '', 'cfghjkmnoqw', '', now())"
348 );
349 g.userUid = db_last_insert_rowid();
350 g.zLogin = "anonymous";
351 }
352 }
@@ -364,11 +365,11 @@
365 if( g.argc!=3 ) usage("REPOSITORY");
366 db_open_repository(g.argv[2]);
367 sqlite3_create_function(g.db, "shared_secret", 2, SQLITE_UTF8, 0,
368 sha1_shared_secret_sql_function, 0, 0);
369 db_multi_exec(
370 "UPDATE user SET pw=shared_secret(pw,login), mtime=now()"
371 " WHERE length(pw)>0 AND length(pw)!=40"
372 );
373 }
374
375 /*
376
+3 -3
--- src/xfer.c
+++ src/xfer.c
@@ -1009,11 +1009,11 @@
10091009
*/
10101010
if( blob_eq(&xfer.aToken[0], "login")
10111011
&& xfer.nToken==4
10121012
){
10131013
if( disableLogin ){
1014
- g.okRead = g.okWrite = g.okPrivate = 1;
1014
+ g.okRead = g.okWrite = g.okPrivate = g.okAdmin = 1;
10151015
}else{
10161016
if( check_tail_hash(&xfer.aToken[2], xfer.pIn)
10171017
|| check_login(&xfer.aToken[1], &xfer.aToken[2], &xfer.aToken[3])
10181018
){
10191019
cgi_reset_content();
@@ -1033,11 +1033,11 @@
10331033
){
10341034
if( g.okRead ){
10351035
char *zName = blob_str(&xfer.aToken[1]);
10361036
if( zName[0]=='/' ){
10371037
/* New style configuration transfer */
1038
- int groupMask = configure_name_to_mask(&zName[0], 0);
1038
+ int groupMask = configure_name_to_mask(&zName[1], 0);
10391039
if( !g.okAdmin ) groupMask &= ~CONFIGSET_USER;
10401040
if( !g.okRdAddr ) groupMask &= ~CONFIGSET_ADDR;
10411041
configure_send_group(xfer.pOut, groupMask, 0);
10421042
}else if( configure_is_exportable(zName) ){
10431043
/* Old style configuration transfer */
@@ -1194,14 +1194,14 @@
11941194
** gdb fossil
11951195
** r test-xfer out.txt
11961196
*/
11971197
void cmd_test_xfer(void){
11981198
int notUsed;
1199
+ db_find_and_open_repository(0,0);
11991200
if( g.argc!=2 && g.argc!=3 ){
12001201
usage("?MESSAGEFILE?");
12011202
}
1202
- db_must_be_within_tree();
12031203
blob_zero(&g.cgiIn);
12041204
blob_read_from_file(&g.cgiIn, g.argc==2 ? "-" : g.argv[2]);
12051205
disableLogin = 1;
12061206
page_xfer();
12071207
printf("%s\n", cgi_extract_content(&notUsed));
12081208
--- src/xfer.c
+++ src/xfer.c
@@ -1009,11 +1009,11 @@
1009 */
1010 if( blob_eq(&xfer.aToken[0], "login")
1011 && xfer.nToken==4
1012 ){
1013 if( disableLogin ){
1014 g.okRead = g.okWrite = g.okPrivate = 1;
1015 }else{
1016 if( check_tail_hash(&xfer.aToken[2], xfer.pIn)
1017 || check_login(&xfer.aToken[1], &xfer.aToken[2], &xfer.aToken[3])
1018 ){
1019 cgi_reset_content();
@@ -1033,11 +1033,11 @@
1033 ){
1034 if( g.okRead ){
1035 char *zName = blob_str(&xfer.aToken[1]);
1036 if( zName[0]=='/' ){
1037 /* New style configuration transfer */
1038 int groupMask = configure_name_to_mask(&zName[0], 0);
1039 if( !g.okAdmin ) groupMask &= ~CONFIGSET_USER;
1040 if( !g.okRdAddr ) groupMask &= ~CONFIGSET_ADDR;
1041 configure_send_group(xfer.pOut, groupMask, 0);
1042 }else if( configure_is_exportable(zName) ){
1043 /* Old style configuration transfer */
@@ -1194,14 +1194,14 @@
1194 ** gdb fossil
1195 ** r test-xfer out.txt
1196 */
1197 void cmd_test_xfer(void){
1198 int notUsed;
 
1199 if( g.argc!=2 && g.argc!=3 ){
1200 usage("?MESSAGEFILE?");
1201 }
1202 db_must_be_within_tree();
1203 blob_zero(&g.cgiIn);
1204 blob_read_from_file(&g.cgiIn, g.argc==2 ? "-" : g.argv[2]);
1205 disableLogin = 1;
1206 page_xfer();
1207 printf("%s\n", cgi_extract_content(&notUsed));
1208
--- src/xfer.c
+++ src/xfer.c
@@ -1009,11 +1009,11 @@
1009 */
1010 if( blob_eq(&xfer.aToken[0], "login")
1011 && xfer.nToken==4
1012 ){
1013 if( disableLogin ){
1014 g.okRead = g.okWrite = g.okPrivate = g.okAdmin = 1;
1015 }else{
1016 if( check_tail_hash(&xfer.aToken[2], xfer.pIn)
1017 || check_login(&xfer.aToken[1], &xfer.aToken[2], &xfer.aToken[3])
1018 ){
1019 cgi_reset_content();
@@ -1033,11 +1033,11 @@
1033 ){
1034 if( g.okRead ){
1035 char *zName = blob_str(&xfer.aToken[1]);
1036 if( zName[0]=='/' ){
1037 /* New style configuration transfer */
1038 int groupMask = configure_name_to_mask(&zName[1], 0);
1039 if( !g.okAdmin ) groupMask &= ~CONFIGSET_USER;
1040 if( !g.okRdAddr ) groupMask &= ~CONFIGSET_ADDR;
1041 configure_send_group(xfer.pOut, groupMask, 0);
1042 }else if( configure_is_exportable(zName) ){
1043 /* Old style configuration transfer */
@@ -1194,14 +1194,14 @@
1194 ** gdb fossil
1195 ** r test-xfer out.txt
1196 */
1197 void cmd_test_xfer(void){
1198 int notUsed;
1199 db_find_and_open_repository(0,0);
1200 if( g.argc!=2 && g.argc!=3 ){
1201 usage("?MESSAGEFILE?");
1202 }
 
1203 blob_zero(&g.cgiIn);
1204 blob_read_from_file(&g.cgiIn, g.argc==2 ? "-" : g.argv[2]);
1205 disableLogin = 1;
1206 page_xfer();
1207 printf("%s\n", cgi_extract_content(&notUsed));
1208

Keyboard Shortcuts

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