Fossil SCM

Merge updates from trunk.

mistachkin 2014-10-21 03:40 better-error-msgs merge
Commit a4e0d959db38af95fb465c5101d388460eee4dbe
72 files changed +10 -7 +8 -8 +36 -1 +2 -2 +1 -1 +9 -9 +2 -1 +20 -17 +1 -1 +14 +2 -2 +36 -28 +2 -2 +29 -30 +10 -10 +10 -10 +11 -11 +69 -71 +27 -27 +2 -4 +12 -12 +2 -2 +6 -8 +7 -7 +2 -2 +6 -7 +1 -1 +1 -1 +2 -2 +9 -11 +9 -9 +5 -6 +3 -2 +8 -8 +4 -4 +8 -1 +31 -8 +5 -6 +5 -6 +4 -4 +3 -3 +4 -4 +10 -10 +18 -14 +9 -8 +5 -7 +10 -10 +2 -2 +8 -4 +12 -1 +9 -9 +2 -2 +4 +10 -5 +1 -1 +7 -7 +10 -10 +7 -6 +139 -108 +21 -23 +7 -7 +9 -8 +5 -3 +3 -3 +5 -14 +4 -4 +33 -27 +14 -11 +8 -4 +7 -1 +7 -1 +8 -2
+10 -7
--- src/allrepo.c
+++ src/allrepo.c
@@ -257,19 +257,22 @@
257257
int j;
258258
useCheckouts = find_option("ckout","c",0)!=0;
259259
verify_all_options();
260260
db_begin_transaction();
261261
for(j=3; j<g.argc; j++){
262
- char *zSql = mprintf("DELETE FROM global_config"
263
- " WHERE name GLOB '%s:%q'",
264
- useCheckouts?"ckout":"repo", g.argv[j]);
262
+ Blob sql;
263
+ blob_zero(&sql);
264
+ blob_append_sql(&sql,
265
+ "DELETE FROM global_config WHERE name GLOB '%s:%q'",
266
+ useCheckouts?"ckout":"repo", g.argv[j]
267
+ );
265268
if( dryRunFlag ){
266
- fossil_print("%s\n", zSql);
269
+ fossil_print("%s\n", blob_sql_text(&sql));
267270
}else{
268
- db_multi_exec("%s", zSql);
271
+ db_multi_exec("%s", blob_sql_text(&sql));
269272
}
270
- fossil_free(zSql);
273
+ blob_reset(&sql);
271274
}
272275
db_end_transaction(0);
273276
return;
274277
}else if( strncmp(zCmd, "info", n)==0 ){
275278
zCmd = "info";
@@ -346,9 +349,9 @@
346349
if( nToDel>0 ){
347350
const char *zSql = "DELETE FROM global_config WHERE name IN toDel";
348351
if( dryRunFlag ){
349352
fossil_print("%s\n", zSql);
350353
}else{
351
- db_multi_exec(zSql);
354
+ db_multi_exec("%s", zSql /*safe-for-%s*/ );
352355
}
353356
}
354357
}
355358
--- src/allrepo.c
+++ src/allrepo.c
@@ -257,19 +257,22 @@
257 int j;
258 useCheckouts = find_option("ckout","c",0)!=0;
259 verify_all_options();
260 db_begin_transaction();
261 for(j=3; j<g.argc; j++){
262 char *zSql = mprintf("DELETE FROM global_config"
263 " WHERE name GLOB '%s:%q'",
264 useCheckouts?"ckout":"repo", g.argv[j]);
 
 
 
265 if( dryRunFlag ){
266 fossil_print("%s\n", zSql);
267 }else{
268 db_multi_exec("%s", zSql);
269 }
270 fossil_free(zSql);
271 }
272 db_end_transaction(0);
273 return;
274 }else if( strncmp(zCmd, "info", n)==0 ){
275 zCmd = "info";
@@ -346,9 +349,9 @@
346 if( nToDel>0 ){
347 const char *zSql = "DELETE FROM global_config WHERE name IN toDel";
348 if( dryRunFlag ){
349 fossil_print("%s\n", zSql);
350 }else{
351 db_multi_exec(zSql);
352 }
353 }
354 }
355
--- src/allrepo.c
+++ src/allrepo.c
@@ -257,19 +257,22 @@
257 int j;
258 useCheckouts = find_option("ckout","c",0)!=0;
259 verify_all_options();
260 db_begin_transaction();
261 for(j=3; j<g.argc; j++){
262 Blob sql;
263 blob_zero(&sql);
264 blob_append_sql(&sql,
265 "DELETE FROM global_config WHERE name GLOB '%s:%q'",
266 useCheckouts?"ckout":"repo", g.argv[j]
267 );
268 if( dryRunFlag ){
269 fossil_print("%s\n", blob_sql_text(&sql));
270 }else{
271 db_multi_exec("%s", blob_sql_text(&sql));
272 }
273 blob_reset(&sql);
274 }
275 db_end_transaction(0);
276 return;
277 }else if( strncmp(zCmd, "info", n)==0 ){
278 zCmd = "info";
@@ -346,9 +349,9 @@
349 if( nToDel>0 ){
350 const char *zSql = "DELETE FROM global_config WHERE name IN toDel";
351 if( dryRunFlag ){
352 fossil_print("%s\n", zSql);
353 }else{
354 db_multi_exec("%s", zSql /*safe-for-%s*/ );
355 }
356 }
357 }
358
+8 -8
--- src/attach.c
+++ src/attach.c
@@ -40,31 +40,31 @@
4040
Stmt q;
4141
4242
if( zPage && zTkt ) zTkt = 0;
4343
login_check_credentials();
4444
blob_zero(&sql);
45
- blob_appendf(&sql,
45
+ blob_append_sql(&sql,
4646
"SELECT datetime(mtime%s), src, target, filename,"
4747
" comment, user,"
4848
" (SELECT uuid FROM blob WHERE rid=attachid), attachid"
4949
" FROM attachment",
5050
timeline_utc()
5151
);
5252
if( zPage ){
5353
if( g.perm.RdWiki==0 ) login_needed();
5454
style_header("Attachments To %h", zPage);
55
- blob_appendf(&sql, " WHERE target=%Q", zPage);
55
+ blob_append_sql(&sql, " WHERE target=%Q", zPage);
5656
}else if( zTkt ){
5757
if( g.perm.RdTkt==0 ) login_needed();
5858
style_header("Attachments To Ticket %S", zTkt);
59
- blob_appendf(&sql, " WHERE target GLOB '%q*'", zTkt);
59
+ blob_append_sql(&sql, " WHERE target GLOB '%q*'", zTkt);
6060
}else{
6161
if( g.perm.RdTkt==0 && g.perm.RdWiki==0 ) login_needed();
6262
style_header("All Attachments");
6363
}
64
- blob_appendf(&sql, " ORDER BY mtime DESC");
65
- db_prepare(&q, "%s", blob_str(&sql));
64
+ blob_append_sql(&sql, " ORDER BY mtime DESC");
65
+ db_prepare(&q, "%s", blob_sql_text(&sql));
6666
@ <ol>
6767
while( db_step(&q)==SQLITE_ROW ){
6868
const char *zDate = db_column_text(&q, 0);
6969
const char *zSrc = db_column_text(&q, 1);
7070
const char *zTarget = db_column_text(&q, 2);
@@ -377,11 +377,11 @@
377377
zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
378378
#if 0
379379
/* Shunning here needs to get both the attachment control artifact and
380380
** the object that is attached. */
381381
if( g.perm.Admin ){
382
- if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){
382
+ if( db_exists("SELECT 1 FROM shun WHERE uuid='%q'", zUuid) ){
383383
style_submenu_element("Unshun","Unshun", "%s/shun?uuid=%s&sub=1",
384384
g.zTop, zUuid);
385385
}else{
386386
style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
387387
g.zTop, zUuid);
@@ -390,17 +390,17 @@
390390
#endif
391391
pAttach = manifest_get(rid, CFTYPE_ATTACHMENT, 0);
392392
if( pAttach==0 ) fossil_redirect_home();
393393
zTarget = pAttach->zAttachTarget;
394394
zSrc = pAttach->zAttachSrc;
395
- ridSrc = db_int(0,"SELECT rid FROM blob WHERE uuid='%s'", zSrc);
395
+ ridSrc = db_int(0,"SELECT rid FROM blob WHERE uuid='%q'", zSrc);
396396
zName = pAttach->zAttachName;
397397
zDesc = pAttach->zComment;
398398
zMime = mimetype_from_name(zName);
399399
fShowContent = zMime ? strncmp(zMime,"text/", 5)==0 : 0;
400400
if( validate16(zTarget, strlen(zTarget))
401
- && db_exists("SELECT 1 FROM ticket WHERE tkt_uuid='%s'", zTarget)
401
+ && db_exists("SELECT 1 FROM ticket WHERE tkt_uuid='%q'", zTarget)
402402
){
403403
zTktUuid = zTarget;
404404
if( !g.perm.RdTkt ){ login_needed(); return; }
405405
if( g.perm.WrTkt ){
406406
style_submenu_element("Delete","Delete","%R/ainfo/%s?del", zUuid);
407407
--- src/attach.c
+++ src/attach.c
@@ -40,31 +40,31 @@
40 Stmt q;
41
42 if( zPage && zTkt ) zTkt = 0;
43 login_check_credentials();
44 blob_zero(&sql);
45 blob_appendf(&sql,
46 "SELECT datetime(mtime%s), src, target, filename,"
47 " comment, user,"
48 " (SELECT uuid FROM blob WHERE rid=attachid), attachid"
49 " FROM attachment",
50 timeline_utc()
51 );
52 if( zPage ){
53 if( g.perm.RdWiki==0 ) login_needed();
54 style_header("Attachments To %h", zPage);
55 blob_appendf(&sql, " WHERE target=%Q", zPage);
56 }else if( zTkt ){
57 if( g.perm.RdTkt==0 ) login_needed();
58 style_header("Attachments To Ticket %S", zTkt);
59 blob_appendf(&sql, " WHERE target GLOB '%q*'", zTkt);
60 }else{
61 if( g.perm.RdTkt==0 && g.perm.RdWiki==0 ) login_needed();
62 style_header("All Attachments");
63 }
64 blob_appendf(&sql, " ORDER BY mtime DESC");
65 db_prepare(&q, "%s", blob_str(&sql));
66 @ <ol>
67 while( db_step(&q)==SQLITE_ROW ){
68 const char *zDate = db_column_text(&q, 0);
69 const char *zSrc = db_column_text(&q, 1);
70 const char *zTarget = db_column_text(&q, 2);
@@ -377,11 +377,11 @@
377 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
378 #if 0
379 /* Shunning here needs to get both the attachment control artifact and
380 ** the object that is attached. */
381 if( g.perm.Admin ){
382 if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){
383 style_submenu_element("Unshun","Unshun", "%s/shun?uuid=%s&sub=1",
384 g.zTop, zUuid);
385 }else{
386 style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
387 g.zTop, zUuid);
@@ -390,17 +390,17 @@
390 #endif
391 pAttach = manifest_get(rid, CFTYPE_ATTACHMENT, 0);
392 if( pAttach==0 ) fossil_redirect_home();
393 zTarget = pAttach->zAttachTarget;
394 zSrc = pAttach->zAttachSrc;
395 ridSrc = db_int(0,"SELECT rid FROM blob WHERE uuid='%s'", zSrc);
396 zName = pAttach->zAttachName;
397 zDesc = pAttach->zComment;
398 zMime = mimetype_from_name(zName);
399 fShowContent = zMime ? strncmp(zMime,"text/", 5)==0 : 0;
400 if( validate16(zTarget, strlen(zTarget))
401 && db_exists("SELECT 1 FROM ticket WHERE tkt_uuid='%s'", zTarget)
402 ){
403 zTktUuid = zTarget;
404 if( !g.perm.RdTkt ){ login_needed(); return; }
405 if( g.perm.WrTkt ){
406 style_submenu_element("Delete","Delete","%R/ainfo/%s?del", zUuid);
407
--- src/attach.c
+++ src/attach.c
@@ -40,31 +40,31 @@
40 Stmt q;
41
42 if( zPage && zTkt ) zTkt = 0;
43 login_check_credentials();
44 blob_zero(&sql);
45 blob_append_sql(&sql,
46 "SELECT datetime(mtime%s), src, target, filename,"
47 " comment, user,"
48 " (SELECT uuid FROM blob WHERE rid=attachid), attachid"
49 " FROM attachment",
50 timeline_utc()
51 );
52 if( zPage ){
53 if( g.perm.RdWiki==0 ) login_needed();
54 style_header("Attachments To %h", zPage);
55 blob_append_sql(&sql, " WHERE target=%Q", zPage);
56 }else if( zTkt ){
57 if( g.perm.RdTkt==0 ) login_needed();
58 style_header("Attachments To Ticket %S", zTkt);
59 blob_append_sql(&sql, " WHERE target GLOB '%q*'", zTkt);
60 }else{
61 if( g.perm.RdTkt==0 && g.perm.RdWiki==0 ) login_needed();
62 style_header("All Attachments");
63 }
64 blob_append_sql(&sql, " ORDER BY mtime DESC");
65 db_prepare(&q, "%s", blob_sql_text(&sql));
66 @ <ol>
67 while( db_step(&q)==SQLITE_ROW ){
68 const char *zDate = db_column_text(&q, 0);
69 const char *zSrc = db_column_text(&q, 1);
70 const char *zTarget = db_column_text(&q, 2);
@@ -377,11 +377,11 @@
377 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
378 #if 0
379 /* Shunning here needs to get both the attachment control artifact and
380 ** the object that is attached. */
381 if( g.perm.Admin ){
382 if( db_exists("SELECT 1 FROM shun WHERE uuid='%q'", zUuid) ){
383 style_submenu_element("Unshun","Unshun", "%s/shun?uuid=%s&sub=1",
384 g.zTop, zUuid);
385 }else{
386 style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
387 g.zTop, zUuid);
@@ -390,17 +390,17 @@
390 #endif
391 pAttach = manifest_get(rid, CFTYPE_ATTACHMENT, 0);
392 if( pAttach==0 ) fossil_redirect_home();
393 zTarget = pAttach->zAttachTarget;
394 zSrc = pAttach->zAttachSrc;
395 ridSrc = db_int(0,"SELECT rid FROM blob WHERE uuid='%q'", zSrc);
396 zName = pAttach->zAttachName;
397 zDesc = pAttach->zComment;
398 zMime = mimetype_from_name(zName);
399 fShowContent = zMime ? strncmp(zMime,"text/", 5)==0 : 0;
400 if( validate16(zTarget, strlen(zTarget))
401 && db_exists("SELECT 1 FROM ticket WHERE tkt_uuid='%q'", zTarget)
402 ){
403 zTktUuid = zTarget;
404 if( !g.perm.RdTkt ){ login_needed(); return; }
405 if( g.perm.WrTkt ){
406 style_submenu_element("Delete","Delete","%R/ainfo/%s?del", zUuid);
407
+36 -1
--- src/blob.c
+++ src/blob.c
@@ -34,14 +34,20 @@
3434
*/
3535
struct Blob {
3636
unsigned int nUsed; /* Number of bytes used in aData[] */
3737
unsigned int nAlloc; /* Number of bytes allocated for aData[] */
3838
unsigned int iCursor; /* Next character of input to parse */
39
+ unsigned int blobFlags; /* One or more BLOBFLAG_* bits */
3940
char *aData; /* Where the information is stored */
4041
void (*xRealloc)(Blob*, unsigned int); /* Function to reallocate the buffer */
4142
};
4243
44
+/*
45
+** Allowed values for Blob.blobFlags
46
+*/
47
+#define BLOBFLAG_NotSQL 0x0001 /* Non-SQL text */
48
+
4349
/*
4450
** The current size of a Blob
4551
*/
4652
#define blob_size(X) ((X)->nUsed)
4753
@@ -148,10 +154,11 @@
148154
free(pBlob->aData);
149155
pBlob->aData = 0;
150156
pBlob->nAlloc = 0;
151157
pBlob->nUsed = 0;
152158
pBlob->iCursor = 0;
159
+ pBlob->blobFlags = 0;
153160
}else if( newSize>pBlob->nAlloc || newSize<pBlob->nAlloc-4000 ){
154161
char *pNew = fossil_realloc(pBlob->aData, newSize);
155162
pBlob->aData = pNew;
156163
pBlob->nAlloc = newSize;
157164
if( pBlob->nUsed>pBlob->nAlloc ){
@@ -162,11 +169,11 @@
162169
163170
/*
164171
** An initializer for Blobs
165172
*/
166173
#if INTERFACE
167
-#define BLOB_INITIALIZER {0,0,0,0,blobReallocMalloc}
174
+#define BLOB_INITIALIZER {0,0,0,0,0,blobReallocMalloc}
168175
#endif
169176
const Blob empty_blob = BLOB_INITIALIZER;
170177
171178
/*
172179
** A reallocation function for when the initial string is in unmanaged
@@ -217,10 +224,11 @@
217224
}else{
218225
if( size<=0 ) size = strlen(zData);
219226
pBlob->nUsed = pBlob->nAlloc = size;
220227
pBlob->aData = (char*)zData;
221228
pBlob->iCursor = 0;
229
+ pBlob->blobFlags = 0;
222230
pBlob->xRealloc = blobReallocStatic;
223231
}
224232
}
225233
226234
/*
@@ -248,10 +256,11 @@
248256
assert_blob_is_reset(pBlob);
249257
pBlob->nUsed = 0;
250258
pBlob->nAlloc = 1;
251259
pBlob->aData = (char*)zEmpty;
252260
pBlob->iCursor = 0;
261
+ pBlob->blobFlags = 0;
253262
pBlob->xRealloc = blobReallocStatic;
254263
}
255264
256265
/*
257266
** Append text or data to the end of a blob.
@@ -292,10 +301,24 @@
292301
if( p->aData[p->nUsed]!=0 ){
293302
blob_materialize(p);
294303
}
295304
return p->aData;
296305
}
306
+
307
+/*
308
+** Return a pointer to a null-terminated string for a blob that has
309
+** been created using blob_append_sql() and not blob_appendf(). If
310
+** text was ever added using blob_appendf() then throw an error.
311
+*/
312
+char *blob_sql_text(Blob *p){
313
+ blob_is_init(p);
314
+ if( (p->blobFlags & BLOBFLAG_NotSQL) ){
315
+ fossil_fatal("Internal error: Use of blob_appendf() to construct SQL text");
316
+ }
317
+ return blob_str(p);
318
+}
319
+
297320
298321
/*
299322
** Return a pointer to a null-terminated string for a blob.
300323
**
301324
** WARNING: If the blob is ephemeral, it might cause a '\000'
@@ -671,13 +694,25 @@
671694
return i;
672695
}
673696
674697
/*
675698
** Do printf-style string rendering and append the results to a blob.
699
+**
700
+** The blob_appendf() version sets the BLOBFLAG_NotSQL bit in Blob.blobFlags
701
+** whereas blob_append_sql() does not.
676702
*/
677703
void blob_appendf(Blob *pBlob, const char *zFormat, ...){
678704
if( pBlob ){
705
+ va_list ap;
706
+ va_start(ap, zFormat);
707
+ vxprintf(pBlob, zFormat, ap);
708
+ va_end(ap);
709
+ pBlob->blobFlags |= BLOBFLAG_NotSQL;
710
+ }
711
+}
712
+void blob_append_sql(Blob *pBlob, const char *zFormat, ...){
713
+ if( pBlob ){
679714
va_list ap;
680715
va_start(ap, zFormat);
681716
vxprintf(pBlob, zFormat, ap);
682717
va_end(ap);
683718
}
684719
--- src/blob.c
+++ src/blob.c
@@ -34,14 +34,20 @@
34 */
35 struct Blob {
36 unsigned int nUsed; /* Number of bytes used in aData[] */
37 unsigned int nAlloc; /* Number of bytes allocated for aData[] */
38 unsigned int iCursor; /* Next character of input to parse */
 
39 char *aData; /* Where the information is stored */
40 void (*xRealloc)(Blob*, unsigned int); /* Function to reallocate the buffer */
41 };
42
 
 
 
 
 
43 /*
44 ** The current size of a Blob
45 */
46 #define blob_size(X) ((X)->nUsed)
47
@@ -148,10 +154,11 @@
148 free(pBlob->aData);
149 pBlob->aData = 0;
150 pBlob->nAlloc = 0;
151 pBlob->nUsed = 0;
152 pBlob->iCursor = 0;
 
153 }else if( newSize>pBlob->nAlloc || newSize<pBlob->nAlloc-4000 ){
154 char *pNew = fossil_realloc(pBlob->aData, newSize);
155 pBlob->aData = pNew;
156 pBlob->nAlloc = newSize;
157 if( pBlob->nUsed>pBlob->nAlloc ){
@@ -162,11 +169,11 @@
162
163 /*
164 ** An initializer for Blobs
165 */
166 #if INTERFACE
167 #define BLOB_INITIALIZER {0,0,0,0,blobReallocMalloc}
168 #endif
169 const Blob empty_blob = BLOB_INITIALIZER;
170
171 /*
172 ** A reallocation function for when the initial string is in unmanaged
@@ -217,10 +224,11 @@
217 }else{
218 if( size<=0 ) size = strlen(zData);
219 pBlob->nUsed = pBlob->nAlloc = size;
220 pBlob->aData = (char*)zData;
221 pBlob->iCursor = 0;
 
222 pBlob->xRealloc = blobReallocStatic;
223 }
224 }
225
226 /*
@@ -248,10 +256,11 @@
248 assert_blob_is_reset(pBlob);
249 pBlob->nUsed = 0;
250 pBlob->nAlloc = 1;
251 pBlob->aData = (char*)zEmpty;
252 pBlob->iCursor = 0;
 
253 pBlob->xRealloc = blobReallocStatic;
254 }
255
256 /*
257 ** Append text or data to the end of a blob.
@@ -292,10 +301,24 @@
292 if( p->aData[p->nUsed]!=0 ){
293 blob_materialize(p);
294 }
295 return p->aData;
296 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
298 /*
299 ** Return a pointer to a null-terminated string for a blob.
300 **
301 ** WARNING: If the blob is ephemeral, it might cause a '\000'
@@ -671,13 +694,25 @@
671 return i;
672 }
673
674 /*
675 ** Do printf-style string rendering and append the results to a blob.
 
 
 
676 */
677 void blob_appendf(Blob *pBlob, const char *zFormat, ...){
678 if( pBlob ){
 
 
 
 
 
 
 
 
 
679 va_list ap;
680 va_start(ap, zFormat);
681 vxprintf(pBlob, zFormat, ap);
682 va_end(ap);
683 }
684
--- src/blob.c
+++ src/blob.c
@@ -34,14 +34,20 @@
34 */
35 struct Blob {
36 unsigned int nUsed; /* Number of bytes used in aData[] */
37 unsigned int nAlloc; /* Number of bytes allocated for aData[] */
38 unsigned int iCursor; /* Next character of input to parse */
39 unsigned int blobFlags; /* One or more BLOBFLAG_* bits */
40 char *aData; /* Where the information is stored */
41 void (*xRealloc)(Blob*, unsigned int); /* Function to reallocate the buffer */
42 };
43
44 /*
45 ** Allowed values for Blob.blobFlags
46 */
47 #define BLOBFLAG_NotSQL 0x0001 /* Non-SQL text */
48
49 /*
50 ** The current size of a Blob
51 */
52 #define blob_size(X) ((X)->nUsed)
53
@@ -148,10 +154,11 @@
154 free(pBlob->aData);
155 pBlob->aData = 0;
156 pBlob->nAlloc = 0;
157 pBlob->nUsed = 0;
158 pBlob->iCursor = 0;
159 pBlob->blobFlags = 0;
160 }else if( newSize>pBlob->nAlloc || newSize<pBlob->nAlloc-4000 ){
161 char *pNew = fossil_realloc(pBlob->aData, newSize);
162 pBlob->aData = pNew;
163 pBlob->nAlloc = newSize;
164 if( pBlob->nUsed>pBlob->nAlloc ){
@@ -162,11 +169,11 @@
169
170 /*
171 ** An initializer for Blobs
172 */
173 #if INTERFACE
174 #define BLOB_INITIALIZER {0,0,0,0,0,blobReallocMalloc}
175 #endif
176 const Blob empty_blob = BLOB_INITIALIZER;
177
178 /*
179 ** A reallocation function for when the initial string is in unmanaged
@@ -217,10 +224,11 @@
224 }else{
225 if( size<=0 ) size = strlen(zData);
226 pBlob->nUsed = pBlob->nAlloc = size;
227 pBlob->aData = (char*)zData;
228 pBlob->iCursor = 0;
229 pBlob->blobFlags = 0;
230 pBlob->xRealloc = blobReallocStatic;
231 }
232 }
233
234 /*
@@ -248,10 +256,11 @@
256 assert_blob_is_reset(pBlob);
257 pBlob->nUsed = 0;
258 pBlob->nAlloc = 1;
259 pBlob->aData = (char*)zEmpty;
260 pBlob->iCursor = 0;
261 pBlob->blobFlags = 0;
262 pBlob->xRealloc = blobReallocStatic;
263 }
264
265 /*
266 ** Append text or data to the end of a blob.
@@ -292,10 +301,24 @@
301 if( p->aData[p->nUsed]!=0 ){
302 blob_materialize(p);
303 }
304 return p->aData;
305 }
306
307 /*
308 ** Return a pointer to a null-terminated string for a blob that has
309 ** been created using blob_append_sql() and not blob_appendf(). If
310 ** text was ever added using blob_appendf() then throw an error.
311 */
312 char *blob_sql_text(Blob *p){
313 blob_is_init(p);
314 if( (p->blobFlags & BLOBFLAG_NotSQL) ){
315 fossil_fatal("Internal error: Use of blob_appendf() to construct SQL text");
316 }
317 return blob_str(p);
318 }
319
320
321 /*
322 ** Return a pointer to a null-terminated string for a blob.
323 **
324 ** WARNING: If the blob is ephemeral, it might cause a '\000'
@@ -671,13 +694,25 @@
694 return i;
695 }
696
697 /*
698 ** Do printf-style string rendering and append the results to a blob.
699 **
700 ** The blob_appendf() version sets the BLOBFLAG_NotSQL bit in Blob.blobFlags
701 ** whereas blob_append_sql() does not.
702 */
703 void blob_appendf(Blob *pBlob, const char *zFormat, ...){
704 if( pBlob ){
705 va_list ap;
706 va_start(ap, zFormat);
707 vxprintf(pBlob, zFormat, ap);
708 va_end(ap);
709 pBlob->blobFlags |= BLOBFLAG_NotSQL;
710 }
711 }
712 void blob_append_sql(Blob *pBlob, const char *zFormat, ...){
713 if( pBlob ){
714 va_list ap;
715 va_start(ap, zFormat);
716 vxprintf(pBlob, zFormat, ap);
717 va_end(ap);
718 }
719
+2 -2
--- src/branch.c
+++ src/branch.c
@@ -300,12 +300,12 @@
300300
if( colorTest ){
301301
showClosed = 0;
302302
showAll = 1;
303303
}
304304
305
- style_header(showClosed ? "Closed Branches" :
306
- showAll ? "All Branches" : "Open Branches");
305
+ style_header("%s", showClosed ? "Closed Branches" :
306
+ showAll ? "All Branches" : "Open Branches");
307307
style_submenu_element("Timeline", "Timeline", "brtimeline");
308308
if( showClosed ){
309309
style_submenu_element("All", "All", "brlist?all");
310310
style_submenu_element("Open","Open","brlist");
311311
}else if( showAll ){
312312
--- src/branch.c
+++ src/branch.c
@@ -300,12 +300,12 @@
300 if( colorTest ){
301 showClosed = 0;
302 showAll = 1;
303 }
304
305 style_header(showClosed ? "Closed Branches" :
306 showAll ? "All Branches" : "Open Branches");
307 style_submenu_element("Timeline", "Timeline", "brtimeline");
308 if( showClosed ){
309 style_submenu_element("All", "All", "brlist?all");
310 style_submenu_element("Open","Open","brlist");
311 }else if( showAll ){
312
--- src/branch.c
+++ src/branch.c
@@ -300,12 +300,12 @@
300 if( colorTest ){
301 showClosed = 0;
302 showAll = 1;
303 }
304
305 style_header("%s", showClosed ? "Closed Branches" :
306 showAll ? "All Branches" : "Open Branches");
307 style_submenu_element("Timeline", "Timeline", "brtimeline");
308 if( showClosed ){
309 style_submenu_element("All", "All", "brlist?all");
310 style_submenu_element("Open","Open","brlist");
311 }else if( showAll ){
312
+1 -1
--- src/browse.c
+++ src/browse.c
@@ -828,11 +828,11 @@
828828
rid = symbolic_name_to_rid(zName, "ci");
829829
if( rid==0 ){
830830
fossil_fatal("not a valid check-in: %s", zName);
831831
}
832832
style_submenu_element("Tree-View", "Tree-View", "%R/tree?ci=%T", zName);
833
- style_header("File Ages", zName);
833
+ style_header("File Ages");
834834
zGlob = P("glob");
835835
compute_fileage(rid,zGlob);
836836
baseTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid);
837837
zBaseTime = db_text("","SELECT datetime(%.20g%s)", baseTime, timeline_utc());
838838
@ <h2>File Ages For Check-in
839839
--- src/browse.c
+++ src/browse.c
@@ -828,11 +828,11 @@
828 rid = symbolic_name_to_rid(zName, "ci");
829 if( rid==0 ){
830 fossil_fatal("not a valid check-in: %s", zName);
831 }
832 style_submenu_element("Tree-View", "Tree-View", "%R/tree?ci=%T", zName);
833 style_header("File Ages", zName);
834 zGlob = P("glob");
835 compute_fileage(rid,zGlob);
836 baseTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid);
837 zBaseTime = db_text("","SELECT datetime(%.20g%s)", baseTime, timeline_utc());
838 @ <h2>File Ages For Check-in
839
--- src/browse.c
+++ src/browse.c
@@ -828,11 +828,11 @@
828 rid = symbolic_name_to_rid(zName, "ci");
829 if( rid==0 ){
830 fossil_fatal("not a valid check-in: %s", zName);
831 }
832 style_submenu_element("Tree-View", "Tree-View", "%R/tree?ci=%T", zName);
833 style_header("File Ages");
834 zGlob = P("glob");
835 compute_fileage(rid,zGlob);
836 baseTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid);
837 zBaseTime = db_text("","SELECT datetime(%.20g%s)", baseTime, timeline_utc());
838 @ <h2>File Ages For Check-in
839
+9 -9
--- src/cache.c
+++ src/cache.c
@@ -61,11 +61,11 @@
6161
fossil_free(zDbName);
6262
if( rc ){
6363
sqlite3_close(db);
6464
return 0;
6565
}
66
- rc = sqlite3_exec(db,
66
+ rc = sqlite3_exec(db,
6767
"PRAGMA page_size=8192;"
6868
"CREATE TABLE IF NOT EXISTS blob(id INTEGER PRIMARY KEY, data BLOB);"
6969
"CREATE TABLE IF NOT EXISTS cache("
7070
"key TEXT PRIMARY KEY," /* Key used to access the cache */
7171
"id INT REFERENCES blob," /* The cache content */
@@ -94,11 +94,11 @@
9494
rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
9595
if( rc ){
9696
sqlite3_finalize(pStmt);
9797
pStmt = 0;
9898
}
99
- return pStmt;
99
+ return pStmt;
100100
}
101101
102102
/*
103103
** This routine implements an SQL function that renders a large integer
104104
** compactly: ex: 12.3MB
@@ -153,11 +153,11 @@
153153
if( pStmt==0 ) goto cache_write_end;
154154
sqlite3_bind_blob(pStmt, 1, blob_buffer(pContent), blob_size(pContent),
155155
SQLITE_STATIC);
156156
if( sqlite3_step(pStmt)!=SQLITE_DONE ) goto cache_write_end;
157157
sqlite3_finalize(pStmt);
158
- pStmt = cacheStmt(db,
158
+ pStmt = cacheStmt(db,
159159
"INSERT OR IGNORE INTO cache(key,sz,tm,nref,id)"
160160
"VALUES(?1,?2,strftime('%s','now'),1,?3)"
161161
);
162162
if( pStmt==0 ) goto cache_write_end;
163163
sqlite3_bind_text(pStmt, 1, zKey, -1, SQLITE_STATIC);
@@ -202,27 +202,27 @@
202202
203203
db = cacheOpen(0);
204204
if( db==0 ) return 0;
205205
sqlite3_busy_timeout(db, 10000);
206206
sqlite3_exec(db, "BEGIN IMMEDIATE", 0, 0, 0);
207
- pStmt = cacheStmt(db,
207
+ pStmt = cacheStmt(db,
208208
"SELECT blob.data FROM cache, blob"
209209
" WHERE cache.key=?1 AND cache.id=blob.id");
210210
if( pStmt==0 ) goto cache_read_done;
211211
sqlite3_bind_text(pStmt, 1, zKey, -1, SQLITE_STATIC);
212212
if( sqlite3_step(pStmt)==SQLITE_ROW ){
213213
blob_append(pContent, sqlite3_column_blob(pStmt, 0),
214214
sqlite3_column_bytes(pStmt, 0));
215215
rc = 1;
216216
sqlite3_reset(pStmt);
217
- pStmt = cacheStmt(db,
217
+ pStmt = cacheStmt(db,
218218
"UPDATE cache SET nref=nref+1, tm=strftime('%s','now')"
219219
" WHERE key=?1");
220220
if( pStmt ){
221221
sqlite3_bind_text(pStmt, 1, zKey, -1, SQLITE_STATIC);
222222
sqlite3_step(pStmt);
223
- }
223
+ }
224224
}
225225
sqlite3_finalize(pStmt);
226226
cache_read_done:
227227
sqlite3_exec(db, "COMMIT", 0, 0, 0);
228228
sqlite3_close(db);
@@ -256,11 +256,11 @@
256256
sqlite3_stmt *pStmt;
257257
258258
db_find_and_open_repository(0,0);
259259
zCmd = g.argc>=3 ? g.argv[2] : "";
260260
nCmd = (int)strlen(zCmd);
261
- if( nCmd<=1 ){
261
+ if( nCmd<=1 ){
262262
fossil_fatal("Usage: %s cache SUBCOMMAND", g.argv[0]);
263263
}
264264
if( strncmp(zCmd, "init", nCmd)==0 ){
265265
db = cacheOpen(0);
266266
sqlite3_close(db);
@@ -290,11 +290,11 @@
290290
fossil_print("cache does not exist\n");
291291
}else{
292292
int nEntry = 0;
293293
char *zDbName = cacheName();
294294
cache_register_sizename(db);
295
- pStmt = cacheStmt(db,
295
+ pStmt = cacheStmt(db,
296296
"SELECT key, sizename(sz), nRef, datetime(tm,'unixepoch')"
297297
" FROM cache"
298298
" ORDER BY tm DESC"
299299
);
300300
if( pStmt ){
@@ -338,11 +338,11 @@
338338
if( db==0 ){
339339
@ The web-page cache is disabled for this repository
340340
}else{
341341
char *zDbName = cacheName();
342342
cache_register_sizename(db);
343
- pStmt = cacheStmt(db,
343
+ pStmt = cacheStmt(db,
344344
"SELECT key, sizename(sz), nRef, datetime(tm,'unixepoch')"
345345
" FROM cache"
346346
" ORDER BY tm DESC"
347347
);
348348
if( pStmt ){
349349
--- src/cache.c
+++ src/cache.c
@@ -61,11 +61,11 @@
61 fossil_free(zDbName);
62 if( rc ){
63 sqlite3_close(db);
64 return 0;
65 }
66 rc = sqlite3_exec(db,
67 "PRAGMA page_size=8192;"
68 "CREATE TABLE IF NOT EXISTS blob(id INTEGER PRIMARY KEY, data BLOB);"
69 "CREATE TABLE IF NOT EXISTS cache("
70 "key TEXT PRIMARY KEY," /* Key used to access the cache */
71 "id INT REFERENCES blob," /* The cache content */
@@ -94,11 +94,11 @@
94 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
95 if( rc ){
96 sqlite3_finalize(pStmt);
97 pStmt = 0;
98 }
99 return pStmt;
100 }
101
102 /*
103 ** This routine implements an SQL function that renders a large integer
104 ** compactly: ex: 12.3MB
@@ -153,11 +153,11 @@
153 if( pStmt==0 ) goto cache_write_end;
154 sqlite3_bind_blob(pStmt, 1, blob_buffer(pContent), blob_size(pContent),
155 SQLITE_STATIC);
156 if( sqlite3_step(pStmt)!=SQLITE_DONE ) goto cache_write_end;
157 sqlite3_finalize(pStmt);
158 pStmt = cacheStmt(db,
159 "INSERT OR IGNORE INTO cache(key,sz,tm,nref,id)"
160 "VALUES(?1,?2,strftime('%s','now'),1,?3)"
161 );
162 if( pStmt==0 ) goto cache_write_end;
163 sqlite3_bind_text(pStmt, 1, zKey, -1, SQLITE_STATIC);
@@ -202,27 +202,27 @@
202
203 db = cacheOpen(0);
204 if( db==0 ) return 0;
205 sqlite3_busy_timeout(db, 10000);
206 sqlite3_exec(db, "BEGIN IMMEDIATE", 0, 0, 0);
207 pStmt = cacheStmt(db,
208 "SELECT blob.data FROM cache, blob"
209 " WHERE cache.key=?1 AND cache.id=blob.id");
210 if( pStmt==0 ) goto cache_read_done;
211 sqlite3_bind_text(pStmt, 1, zKey, -1, SQLITE_STATIC);
212 if( sqlite3_step(pStmt)==SQLITE_ROW ){
213 blob_append(pContent, sqlite3_column_blob(pStmt, 0),
214 sqlite3_column_bytes(pStmt, 0));
215 rc = 1;
216 sqlite3_reset(pStmt);
217 pStmt = cacheStmt(db,
218 "UPDATE cache SET nref=nref+1, tm=strftime('%s','now')"
219 " WHERE key=?1");
220 if( pStmt ){
221 sqlite3_bind_text(pStmt, 1, zKey, -1, SQLITE_STATIC);
222 sqlite3_step(pStmt);
223 }
224 }
225 sqlite3_finalize(pStmt);
226 cache_read_done:
227 sqlite3_exec(db, "COMMIT", 0, 0, 0);
228 sqlite3_close(db);
@@ -256,11 +256,11 @@
256 sqlite3_stmt *pStmt;
257
258 db_find_and_open_repository(0,0);
259 zCmd = g.argc>=3 ? g.argv[2] : "";
260 nCmd = (int)strlen(zCmd);
261 if( nCmd<=1 ){
262 fossil_fatal("Usage: %s cache SUBCOMMAND", g.argv[0]);
263 }
264 if( strncmp(zCmd, "init", nCmd)==0 ){
265 db = cacheOpen(0);
266 sqlite3_close(db);
@@ -290,11 +290,11 @@
290 fossil_print("cache does not exist\n");
291 }else{
292 int nEntry = 0;
293 char *zDbName = cacheName();
294 cache_register_sizename(db);
295 pStmt = cacheStmt(db,
296 "SELECT key, sizename(sz), nRef, datetime(tm,'unixepoch')"
297 " FROM cache"
298 " ORDER BY tm DESC"
299 );
300 if( pStmt ){
@@ -338,11 +338,11 @@
338 if( db==0 ){
339 @ The web-page cache is disabled for this repository
340 }else{
341 char *zDbName = cacheName();
342 cache_register_sizename(db);
343 pStmt = cacheStmt(db,
344 "SELECT key, sizename(sz), nRef, datetime(tm,'unixepoch')"
345 " FROM cache"
346 " ORDER BY tm DESC"
347 );
348 if( pStmt ){
349
--- src/cache.c
+++ src/cache.c
@@ -61,11 +61,11 @@
61 fossil_free(zDbName);
62 if( rc ){
63 sqlite3_close(db);
64 return 0;
65 }
66 rc = sqlite3_exec(db,
67 "PRAGMA page_size=8192;"
68 "CREATE TABLE IF NOT EXISTS blob(id INTEGER PRIMARY KEY, data BLOB);"
69 "CREATE TABLE IF NOT EXISTS cache("
70 "key TEXT PRIMARY KEY," /* Key used to access the cache */
71 "id INT REFERENCES blob," /* The cache content */
@@ -94,11 +94,11 @@
94 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
95 if( rc ){
96 sqlite3_finalize(pStmt);
97 pStmt = 0;
98 }
99 return pStmt;
100 }
101
102 /*
103 ** This routine implements an SQL function that renders a large integer
104 ** compactly: ex: 12.3MB
@@ -153,11 +153,11 @@
153 if( pStmt==0 ) goto cache_write_end;
154 sqlite3_bind_blob(pStmt, 1, blob_buffer(pContent), blob_size(pContent),
155 SQLITE_STATIC);
156 if( sqlite3_step(pStmt)!=SQLITE_DONE ) goto cache_write_end;
157 sqlite3_finalize(pStmt);
158 pStmt = cacheStmt(db,
159 "INSERT OR IGNORE INTO cache(key,sz,tm,nref,id)"
160 "VALUES(?1,?2,strftime('%s','now'),1,?3)"
161 );
162 if( pStmt==0 ) goto cache_write_end;
163 sqlite3_bind_text(pStmt, 1, zKey, -1, SQLITE_STATIC);
@@ -202,27 +202,27 @@
202
203 db = cacheOpen(0);
204 if( db==0 ) return 0;
205 sqlite3_busy_timeout(db, 10000);
206 sqlite3_exec(db, "BEGIN IMMEDIATE", 0, 0, 0);
207 pStmt = cacheStmt(db,
208 "SELECT blob.data FROM cache, blob"
209 " WHERE cache.key=?1 AND cache.id=blob.id");
210 if( pStmt==0 ) goto cache_read_done;
211 sqlite3_bind_text(pStmt, 1, zKey, -1, SQLITE_STATIC);
212 if( sqlite3_step(pStmt)==SQLITE_ROW ){
213 blob_append(pContent, sqlite3_column_blob(pStmt, 0),
214 sqlite3_column_bytes(pStmt, 0));
215 rc = 1;
216 sqlite3_reset(pStmt);
217 pStmt = cacheStmt(db,
218 "UPDATE cache SET nref=nref+1, tm=strftime('%s','now')"
219 " WHERE key=?1");
220 if( pStmt ){
221 sqlite3_bind_text(pStmt, 1, zKey, -1, SQLITE_STATIC);
222 sqlite3_step(pStmt);
223 }
224 }
225 sqlite3_finalize(pStmt);
226 cache_read_done:
227 sqlite3_exec(db, "COMMIT", 0, 0, 0);
228 sqlite3_close(db);
@@ -256,11 +256,11 @@
256 sqlite3_stmt *pStmt;
257
258 db_find_and_open_repository(0,0);
259 zCmd = g.argc>=3 ? g.argv[2] : "";
260 nCmd = (int)strlen(zCmd);
261 if( nCmd<=1 ){
262 fossil_fatal("Usage: %s cache SUBCOMMAND", g.argv[0]);
263 }
264 if( strncmp(zCmd, "init", nCmd)==0 ){
265 db = cacheOpen(0);
266 sqlite3_close(db);
@@ -290,11 +290,11 @@
290 fossil_print("cache does not exist\n");
291 }else{
292 int nEntry = 0;
293 char *zDbName = cacheName();
294 cache_register_sizename(db);
295 pStmt = cacheStmt(db,
296 "SELECT key, sizename(sz), nRef, datetime(tm,'unixepoch')"
297 " FROM cache"
298 " ORDER BY tm DESC"
299 );
300 if( pStmt ){
@@ -338,11 +338,11 @@
338 if( db==0 ){
339 @ The web-page cache is disabled for this repository
340 }else{
341 char *zDbName = cacheName();
342 cache_register_sizename(db);
343 pStmt = cacheStmt(db,
344 "SELECT key, sizename(sz), nRef, datetime(tm,'unixepoch')"
345 " FROM cache"
346 " ORDER BY tm DESC"
347 );
348 if( pStmt ){
349
+2 -1
--- src/cgi.c
+++ src/cgi.c
@@ -1712,11 +1712,12 @@
17121712
listen(listener,10);
17131713
fossil_print("Listening for %s requests on TCP port %d\n",
17141714
(flags & HTTP_SERVER_SCGI)!=0?"SCGI":"HTTP", iPort);
17151715
fflush(stdout);
17161716
if( zBrowser ){
1717
- zBrowser = mprintf(zBrowser, iPort);
1717
+ assert( strstr(zBrowser,"%d")!=0 );
1718
+ zBrowser = mprintf(zBrowser /*works-like:"%d"*/, iPort);
17181719
#if defined(__CYGWIN__)
17191720
/* On Cygwin, we can do better than "echo" */
17201721
if( strncmp(zBrowser, "echo ", 5)==0 ){
17211722
wchar_t *wUrl = fossil_utf8_to_unicode(zBrowser+5);
17221723
wUrl[wcslen(wUrl)-2] = 0; /* Strip terminating " &" */
17231724
--- src/cgi.c
+++ src/cgi.c
@@ -1712,11 +1712,12 @@
1712 listen(listener,10);
1713 fossil_print("Listening for %s requests on TCP port %d\n",
1714 (flags & HTTP_SERVER_SCGI)!=0?"SCGI":"HTTP", iPort);
1715 fflush(stdout);
1716 if( zBrowser ){
1717 zBrowser = mprintf(zBrowser, iPort);
 
1718 #if defined(__CYGWIN__)
1719 /* On Cygwin, we can do better than "echo" */
1720 if( strncmp(zBrowser, "echo ", 5)==0 ){
1721 wchar_t *wUrl = fossil_utf8_to_unicode(zBrowser+5);
1722 wUrl[wcslen(wUrl)-2] = 0; /* Strip terminating " &" */
1723
--- src/cgi.c
+++ src/cgi.c
@@ -1712,11 +1712,12 @@
1712 listen(listener,10);
1713 fossil_print("Listening for %s requests on TCP port %d\n",
1714 (flags & HTTP_SERVER_SCGI)!=0?"SCGI":"HTTP", iPort);
1715 fflush(stdout);
1716 if( zBrowser ){
1717 assert( strstr(zBrowser,"%d")!=0 );
1718 zBrowser = mprintf(zBrowser /*works-like:"%d"*/, iPort);
1719 #if defined(__CYGWIN__)
1720 /* On Cygwin, we can do better than "echo" */
1721 if( strncmp(zBrowser, "echo ", 5)==0 ){
1722 wchar_t *wUrl = fossil_utf8_to_unicode(zBrowser+5);
1723 wUrl[wcslen(wUrl)-2] = 0; /* Strip terminating " &" */
1724
+20 -17
--- src/checkin.c
+++ src/checkin.c
@@ -52,23 +52,25 @@
5252
zName = blob_str(&fname);
5353
if( fossil_strcmp(zName, ".")==0 ) {
5454
blob_reset(&where);
5555
break;
5656
}
57
- blob_appendf(&where, " %s (pathname=%Q %s) "
58
- "OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
59
- (blob_size(&where)>0) ? "OR" : "AND", zName,
60
- filename_collation(), zName, filename_collation(),
61
- zName, filename_collation());
57
+ blob_append_sql(&where,
58
+ " %s (pathname=%Q %s) "
59
+ "OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
60
+ (blob_size(&where)>0) ? "OR" : "AND", zName,
61
+ filename_collation(), zName, filename_collation(),
62
+ zName, filename_collation()
63
+ );
6264
}
6365
6466
db_prepare(&q,
6567
"SELECT pathname, deleted, chnged, rid, coalesce(origname!=pathname,0)"
6668
" FROM vfile "
6769
" WHERE is_selected(id) %s"
6870
" AND (chnged OR deleted OR rid=0 OR pathname!=origname) ORDER BY 1",
69
- blob_str(&where)
71
+ blob_sql_text(&where)
7072
);
7173
blob_zero(&rewrittenPathname);
7274
while( db_step(&q)==SQLITE_ROW ){
7375
const char *zPathname = db_column_text(&q,0);
7476
const char *zDisplayName = zPathname;
@@ -313,29 +315,32 @@
313315
zName = blob_str(&fname);
314316
if( fossil_strcmp(zName, ".")==0 ) {
315317
blob_reset(&where);
316318
break;
317319
}
318
- blob_appendf(&where, " %s (pathname=%Q %s) "
319
- "OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
320
- (blob_size(&where)>0) ? "OR" : "WHERE", zName,
321
- filename_collation(), zName, filename_collation(),
322
- zName, filename_collation());
320
+ blob_append_sql(&where,
321
+ " %s (pathname=%Q %s) "
322
+ "OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
323
+ (blob_size(&where)>0) ? "OR" : "WHERE", zName,
324
+ filename_collation(), zName, filename_collation(),
325
+ zName, filename_collation()
326
+ );
323327
}
324328
vfile_check_signature(vid, 0);
325329
if( showAge ){
326330
db_prepare(&q,
327331
"SELECT pathname, deleted, rid, chnged, coalesce(origname!=pathname,0),"
328332
" datetime(checkin_mtime(%d,rid),'unixepoch'%s)"
329333
" FROM vfile %s"
330
- " ORDER BY %s", vid, timeline_utc(), blob_str(&where), zOrderBy
334
+ " ORDER BY %s",
335
+ vid, timeline_utc(), blob_sql_text(&where), zOrderBy /*safe-for-%s*/
331336
);
332337
}else{
333338
db_prepare(&q,
334339
"SELECT pathname, deleted, rid, chnged, coalesce(origname!=pathname,0)"
335340
" FROM vfile %s"
336
- " ORDER BY %s", blob_str(&where), zOrderBy
341
+ " ORDER BY %s", blob_sql_text(&where), zOrderBy /*safe-for-%s*/
337342
);
338343
}
339344
blob_reset(&where);
340345
while( db_step(&q)==SQLITE_ROW ){
341346
const char *zPathname = db_column_text(&q,0);
@@ -908,14 +913,12 @@
908913
assert( g.aCommitFile==0 );
909914
if( g.argc>2 ){
910915
int ii, jj=0;
911916
Blob fname;
912917
Stmt q;
913
- const char *zCollate;
914918
Bag toCommit;
915919
916
- zCollate = filename_collation();
917920
blob_zero(&fname);
918921
bag_init(&toCommit);
919922
for(ii=2; ii<g.argc; ii++){
920923
int cnt = 0;
921924
file_tree_name(g.argv[ii], &fname, 1);
@@ -924,12 +927,12 @@
924927
return result;
925928
}
926929
db_prepare(&q,
927930
"SELECT id FROM vfile WHERE pathname=%Q %s"
928931
" OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
929
- blob_str(&fname), zCollate, blob_str(&fname),
930
- zCollate, blob_str(&fname), zCollate);
932
+ blob_str(&fname), filename_collation(), blob_str(&fname),
933
+ filename_collation(), blob_str(&fname), filename_collation());
931934
while( db_step(&q)==SQLITE_ROW ){
932935
cnt++;
933936
bag_insert(&toCommit, db_column_int(&q, 0));
934937
}
935938
db_finalize(&q);
936939
--- src/checkin.c
+++ src/checkin.c
@@ -52,23 +52,25 @@
52 zName = blob_str(&fname);
53 if( fossil_strcmp(zName, ".")==0 ) {
54 blob_reset(&where);
55 break;
56 }
57 blob_appendf(&where, " %s (pathname=%Q %s) "
58 "OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
59 (blob_size(&where)>0) ? "OR" : "AND", zName,
60 filename_collation(), zName, filename_collation(),
61 zName, filename_collation());
 
 
62 }
63
64 db_prepare(&q,
65 "SELECT pathname, deleted, chnged, rid, coalesce(origname!=pathname,0)"
66 " FROM vfile "
67 " WHERE is_selected(id) %s"
68 " AND (chnged OR deleted OR rid=0 OR pathname!=origname) ORDER BY 1",
69 blob_str(&where)
70 );
71 blob_zero(&rewrittenPathname);
72 while( db_step(&q)==SQLITE_ROW ){
73 const char *zPathname = db_column_text(&q,0);
74 const char *zDisplayName = zPathname;
@@ -313,29 +315,32 @@
313 zName = blob_str(&fname);
314 if( fossil_strcmp(zName, ".")==0 ) {
315 blob_reset(&where);
316 break;
317 }
318 blob_appendf(&where, " %s (pathname=%Q %s) "
319 "OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
320 (blob_size(&where)>0) ? "OR" : "WHERE", zName,
321 filename_collation(), zName, filename_collation(),
322 zName, filename_collation());
 
 
323 }
324 vfile_check_signature(vid, 0);
325 if( showAge ){
326 db_prepare(&q,
327 "SELECT pathname, deleted, rid, chnged, coalesce(origname!=pathname,0),"
328 " datetime(checkin_mtime(%d,rid),'unixepoch'%s)"
329 " FROM vfile %s"
330 " ORDER BY %s", vid, timeline_utc(), blob_str(&where), zOrderBy
 
331 );
332 }else{
333 db_prepare(&q,
334 "SELECT pathname, deleted, rid, chnged, coalesce(origname!=pathname,0)"
335 " FROM vfile %s"
336 " ORDER BY %s", blob_str(&where), zOrderBy
337 );
338 }
339 blob_reset(&where);
340 while( db_step(&q)==SQLITE_ROW ){
341 const char *zPathname = db_column_text(&q,0);
@@ -908,14 +913,12 @@
908 assert( g.aCommitFile==0 );
909 if( g.argc>2 ){
910 int ii, jj=0;
911 Blob fname;
912 Stmt q;
913 const char *zCollate;
914 Bag toCommit;
915
916 zCollate = filename_collation();
917 blob_zero(&fname);
918 bag_init(&toCommit);
919 for(ii=2; ii<g.argc; ii++){
920 int cnt = 0;
921 file_tree_name(g.argv[ii], &fname, 1);
@@ -924,12 +927,12 @@
924 return result;
925 }
926 db_prepare(&q,
927 "SELECT id FROM vfile WHERE pathname=%Q %s"
928 " OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
929 blob_str(&fname), zCollate, blob_str(&fname),
930 zCollate, blob_str(&fname), zCollate);
931 while( db_step(&q)==SQLITE_ROW ){
932 cnt++;
933 bag_insert(&toCommit, db_column_int(&q, 0));
934 }
935 db_finalize(&q);
936
--- src/checkin.c
+++ src/checkin.c
@@ -52,23 +52,25 @@
52 zName = blob_str(&fname);
53 if( fossil_strcmp(zName, ".")==0 ) {
54 blob_reset(&where);
55 break;
56 }
57 blob_append_sql(&where,
58 " %s (pathname=%Q %s) "
59 "OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
60 (blob_size(&where)>0) ? "OR" : "AND", zName,
61 filename_collation(), zName, filename_collation(),
62 zName, filename_collation()
63 );
64 }
65
66 db_prepare(&q,
67 "SELECT pathname, deleted, chnged, rid, coalesce(origname!=pathname,0)"
68 " FROM vfile "
69 " WHERE is_selected(id) %s"
70 " AND (chnged OR deleted OR rid=0 OR pathname!=origname) ORDER BY 1",
71 blob_sql_text(&where)
72 );
73 blob_zero(&rewrittenPathname);
74 while( db_step(&q)==SQLITE_ROW ){
75 const char *zPathname = db_column_text(&q,0);
76 const char *zDisplayName = zPathname;
@@ -313,29 +315,32 @@
315 zName = blob_str(&fname);
316 if( fossil_strcmp(zName, ".")==0 ) {
317 blob_reset(&where);
318 break;
319 }
320 blob_append_sql(&where,
321 " %s (pathname=%Q %s) "
322 "OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
323 (blob_size(&where)>0) ? "OR" : "WHERE", zName,
324 filename_collation(), zName, filename_collation(),
325 zName, filename_collation()
326 );
327 }
328 vfile_check_signature(vid, 0);
329 if( showAge ){
330 db_prepare(&q,
331 "SELECT pathname, deleted, rid, chnged, coalesce(origname!=pathname,0),"
332 " datetime(checkin_mtime(%d,rid),'unixepoch'%s)"
333 " FROM vfile %s"
334 " ORDER BY %s",
335 vid, timeline_utc(), blob_sql_text(&where), zOrderBy /*safe-for-%s*/
336 );
337 }else{
338 db_prepare(&q,
339 "SELECT pathname, deleted, rid, chnged, coalesce(origname!=pathname,0)"
340 " FROM vfile %s"
341 " ORDER BY %s", blob_sql_text(&where), zOrderBy /*safe-for-%s*/
342 );
343 }
344 blob_reset(&where);
345 while( db_step(&q)==SQLITE_ROW ){
346 const char *zPathname = db_column_text(&q,0);
@@ -908,14 +913,12 @@
913 assert( g.aCommitFile==0 );
914 if( g.argc>2 ){
915 int ii, jj=0;
916 Blob fname;
917 Stmt q;
 
918 Bag toCommit;
919
 
920 blob_zero(&fname);
921 bag_init(&toCommit);
922 for(ii=2; ii<g.argc; ii++){
923 int cnt = 0;
924 file_tree_name(g.argv[ii], &fname, 1);
@@ -924,12 +927,12 @@
927 return result;
928 }
929 db_prepare(&q,
930 "SELECT id FROM vfile WHERE pathname=%Q %s"
931 " OR (pathname>'%q/' %s AND pathname<'%q0' %s)",
932 blob_str(&fname), filename_collation(), blob_str(&fname),
933 filename_collation(), blob_str(&fname), filename_collation());
934 while( db_step(&q)==SQLITE_ROW ){
935 cnt++;
936 bag_insert(&toCommit, db_column_int(&q, 0));
937 }
938 db_finalize(&q);
939
+1 -1
--- src/checkout.c
+++ src/checkout.c
@@ -60,11 +60,11 @@
6060
Blob uuid;
6161
int vid;
6262
6363
blob_init(&uuid, zName, -1);
6464
if( name_to_uuid(&uuid, 1, "ci") ){
65
- fossil_fatal(g.zErrMsg);
65
+ fossil_fatal("%s", g.zErrMsg);
6666
}
6767
vid = db_int(0, "SELECT rid FROM blob WHERE uuid=%B", &uuid);
6868
if( vid==0 ){
6969
fossil_fatal("no such check-in: %s", g.argv[2]);
7070
}
7171
7272
ADDED src/codecheck1.c
--- src/checkout.c
+++ src/checkout.c
@@ -60,11 +60,11 @@
60 Blob uuid;
61 int vid;
62
63 blob_init(&uuid, zName, -1);
64 if( name_to_uuid(&uuid, 1, "ci") ){
65 fossil_fatal(g.zErrMsg);
66 }
67 vid = db_int(0, "SELECT rid FROM blob WHERE uuid=%B", &uuid);
68 if( vid==0 ){
69 fossil_fatal("no such check-in: %s", g.argv[2]);
70 }
71
72 DDED src/codecheck1.c
--- src/checkout.c
+++ src/checkout.c
@@ -60,11 +60,11 @@
60 Blob uuid;
61 int vid;
62
63 blob_init(&uuid, zName, -1);
64 if( name_to_uuid(&uuid, 1, "ci") ){
65 fossil_fatal("%s", g.zErrMsg);
66 }
67 vid = db_int(0, "SELECT rid FROM blob WHERE uuid=%B", &uuid);
68 if( vid==0 ){
69 fossil_fatal("no such check-in: %s", g.argv[2]);
70 }
71
72 DDED src/codecheck1.c
--- a/src/codecheck1.c
+++ b/src/codecheck1.c
@@ -0,0 +1,14 @@
1
+/*
2
+** Copyright (c) 2014 D. Richard Hipp
3
+**
4
+** This program is free software; you can redistribute it and/or
5
+** modify it under the terms of the Simplified BSD License (also
6
+** known as the "2-Clause Licensetimeline_utc ** Copyright (c) 2014 D. Richard Hipp
7
+**
8
+** This program is free software; you can redistribute it and/or
9
+** modify it under the terms of the Simplified BSD License (also
10
+** known as the "2-Clause Licensetimeline_utc(c) 2014 D. Richard Hipp
11
+**
12
+** This program is free software; you can redistribute it and/or
13
+** modify it under the terms of the Simplified BSD License (also
14
+** known as the "2-Clause Licensetimeline_utchar const **az
--- a/src/codecheck1.c
+++ b/src/codecheck1.c
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/codecheck1.c
+++ b/src/codecheck1.c
@@ -0,0 +1,14 @@
1 /*
2 ** Copyright (c) 2014 D. Richard Hipp
3 **
4 ** This program is free software; you can redistribute it and/or
5 ** modify it under the terms of the Simplified BSD License (also
6 ** known as the "2-Clause Licensetimeline_utc ** Copyright (c) 2014 D. Richard Hipp
7 **
8 ** This program is free software; you can redistribute it and/or
9 ** modify it under the terms of the Simplified BSD License (also
10 ** known as the "2-Clause Licensetimeline_utc(c) 2014 D. Richard Hipp
11 **
12 ** This program is free software; you can redistribute it and/or
13 ** modify it under the terms of the Simplified BSD License (also
14 ** known as the "2-Clause Licensetimeline_utchar const **az
+2 -2
--- src/comformat.c
+++ src/comformat.c
@@ -497,14 +497,14 @@
497497
zOrigText = mprintf("%s", blob_str(&fileData));
498498
blob_reset(&fileData);
499499
}
500500
}
501501
if( decode ){
502
- zText = mprintf(fromFile ? "%z" : "%s", zText);
502
+ zText = mprintf(fromFile?"%z":"%s" /*works-like:"%s"*/, zText);
503503
defossilize(zText);
504504
if( zOrigText ){
505
- zOrigText = mprintf(fromFile ? "%z" : "%s", zOrigText);
505
+ zOrigText = mprintf(fromFile?"%z":"%s" /*works-like:"%s"*/, zOrigText);
506506
defossilize(zOrigText);
507507
}
508508
}
509509
if( indent<0 ){
510510
indent = strlen(zPrefix);
511511
--- src/comformat.c
+++ src/comformat.c
@@ -497,14 +497,14 @@
497 zOrigText = mprintf("%s", blob_str(&fileData));
498 blob_reset(&fileData);
499 }
500 }
501 if( decode ){
502 zText = mprintf(fromFile ? "%z" : "%s", zText);
503 defossilize(zText);
504 if( zOrigText ){
505 zOrigText = mprintf(fromFile ? "%z" : "%s", zOrigText);
506 defossilize(zOrigText);
507 }
508 }
509 if( indent<0 ){
510 indent = strlen(zPrefix);
511
--- src/comformat.c
+++ src/comformat.c
@@ -497,14 +497,14 @@
497 zOrigText = mprintf("%s", blob_str(&fileData));
498 blob_reset(&fileData);
499 }
500 }
501 if( decode ){
502 zText = mprintf(fromFile?"%z":"%s" /*works-like:"%s"*/, zText);
503 defossilize(zText);
504 if( zOrigText ){
505 zOrigText = mprintf(fromFile?"%z":"%s" /*works-like:"%s"*/, zOrigText);
506 defossilize(zOrigText);
507 }
508 }
509 if( indent<0 ){
510 indent = strlen(zPrefix);
511
+36 -28
--- src/configure.c
+++ src/configure.c
@@ -194,19 +194,19 @@
194194
Blob x;
195195
int i;
196196
const char *zSep = "";
197197
198198
blob_zero(&x);
199
- blob_append(&x, "(", 1);
199
+ blob_append_sql(&x, "(");
200200
for(i=0; i<count(aConfig); i++){
201201
if( (aConfig[i].groupMask & iMask)==0 ) continue;
202202
if( aConfig[i].zName[0]=='@' ) continue;
203
- blob_appendf(&x, "%s'%s'", zSep, aConfig[i].zName);
203
+ blob_append_sql(&x, "%s'%q'", zSep/*safe-for-%s*/, aConfig[i].zName);
204204
zSep = ",";
205205
}
206
- blob_append(&x, ")", 1);
207
- return blob_str(&x);
206
+ blob_append_sql(&x, ")");
207
+ return blob_sql_text(&x);
208208
}
209209
210210
/*
211211
** Return the mask for the named configuration parameter if it can be
212212
** safely exported. Return 0 if the parameter is not safe to export.
@@ -361,11 +361,12 @@
361361
@ INSERT INTO _xfer_reportfmt
362362
@ SELECT rn,owner,title,cols,sqlcode FROM reportfmt;
363363
@ INSERT INTO _xfer_user
364364
@ SELECT uid,login,pw,cap,cookie,ipaddr,cexpire,info,photo FROM user;
365365
;
366
- db_multi_exec(zSQL1);
366
+ assert( strchr(zSQL1,'%')==0 );
367
+ db_multi_exec(zSQL1 /*works-like:""*/);
367368
368369
/* When the replace flag is set, add triggers that run the first time
369370
** that new data is seen. The triggers run only once and delete all the
370371
** existing data.
371372
*/
@@ -390,11 +391,12 @@
390391
sqlite3_create_function(g.db, "config_is_reset", 1, SQLITE_UTF8, 0,
391392
config_is_reset_function, 0, 0);
392393
sqlite3_create_function(g.db, "config_reset", 1, SQLITE_UTF8, 0,
393394
config_reset_function, 0, 0);
394395
configHasBeenReset = 0;
395
- db_multi_exec(zSQL2);
396
+ assert( strchr(zSQL2,'%')==0 );
397
+ db_multi_exec(zSQL2 /*works-like:""*/);
396398
}
397399
}
398400
399401
/*
400402
** After receiving configuration data, call this routine to transfer
@@ -407,11 +409,12 @@
407409
@ DELETE FROM reportfmt;
408410
@ INSERT INTO reportfmt SELECT * FROM _xfer_reportfmt;
409411
@ DROP TABLE _xfer_user;
410412
@ DROP TABLE _xfer_reportfmt;
411413
;
412
- db_multi_exec(zSQL);
414
+ assert( strchr(zSQL,'%')==0 );
415
+ db_multi_exec(zSQL /*works-like:""*/);
413416
}
414417
415418
/*
416419
** Mask of modified configuration sets
417420
*/
@@ -563,35 +566,39 @@
563566
if( (thisMask & groupMask)==0 ) return;
564567
565568
blob_zero(&sql);
566569
if( groupMask & CONFIGSET_OVERWRITE ){
567570
if( (thisMask & configHasBeenReset)==0 && aType[ii].zName[0]!='/' ){
568
- db_multi_exec("DELETE FROM %s", &aType[ii].zName[1]);
571
+ db_multi_exec("DELETE FROM \"%w\"", &aType[ii].zName[1]);
569572
configHasBeenReset |= thisMask;
570573
}
571
- blob_append(&sql, "REPLACE INTO ", -1);
572
- }else{
573
- blob_append(&sql, "INSERT OR IGNORE INTO ", -1);
574
- }
575
- blob_appendf(&sql, "%s(%s, mtime", &zName[1], aType[ii].zPrimKey);
576
- for(jj=2; jj<nToken; jj+=2){
577
- blob_appendf(&sql, ",%s", azToken[jj]);
578
- }
579
- blob_appendf(&sql,") VALUES(%s,%s", azToken[1], azToken[0]);
580
- for(jj=2; jj<nToken; jj+=2){
581
- blob_appendf(&sql, ",%s", azToken[jj+1]);
582
- }
583
- db_multi_exec("%s)", blob_str(&sql));
574
+ blob_append_sql(&sql, "REPLACE INTO ");
575
+ }else{
576
+ blob_append_sql(&sql, "INSERT OR IGNORE INTO ");
577
+ }
578
+ blob_append_sql(&sql, "\"%w\"(\"%w\", mtime", &zName[1], aType[ii].zPrimKey);
579
+ for(jj=2; jj<nToken; jj+=2){
580
+ blob_append_sql(&sql, ",\"%w\"", azToken[jj]);
581
+ }
582
+ blob_append_sql(&sql,") VALUES(%s,%s",
583
+ azToken[1] /*safe-for-%s*/, azToken[0] /*safe-for-%s*/);
584
+ for(jj=2; jj<nToken; jj+=2){
585
+ blob_append_sql(&sql, ",%s", azToken[jj+1] /*safe-for-%s*/);
586
+ }
587
+ db_multi_exec("%s)", blob_sql_text(&sql));
584588
if( db_changes()==0 ){
585589
blob_reset(&sql);
586
- blob_appendf(&sql, "UPDATE %s SET mtime=%s", &zName[1], azToken[0]);
590
+ blob_append_sql(&sql, "UPDATE \"%w\" SET mtime=%s",
591
+ &zName[1], azToken[0]/*safe-for-%s*/);
587592
for(jj=2; jj<nToken; jj+=2){
588
- blob_appendf(&sql, ", %s=%s", azToken[jj], azToken[jj+1]);
593
+ blob_append_sql(&sql, ", \"%w\"=%s",
594
+ azToken[jj], azToken[jj+1]/*safe-for-%s*/);
589595
}
590
- blob_appendf(&sql, " WHERE %s=%s AND mtime<%s",
591
- aType[ii].zPrimKey, azToken[1], azToken[0]);
592
- db_multi_exec("%s", blob_str(&sql));
596
+ blob_append_sql(&sql, " WHERE \"%w\"=%s AND mtime<%s",
597
+ aType[ii].zPrimKey, azToken[1]/*safe-for-%s*/,
598
+ azToken[0]/*safe-for-%s*/);
599
+ db_multi_exec("%s", blob_sql_text(&sql));
593600
}
594601
blob_reset(&sql);
595602
rebuildMask |= thisMask;
596603
}else{
597604
/* Otherwise, the old format */
@@ -609,11 +616,11 @@
609616
/* Notice that we are evaluating arbitrary SQL received from the
610617
** client. But this can only happen if the client has authenticated
611618
** as an administrator, so presumably we trust the client at this
612619
** point.
613620
*/
614
- db_multi_exec("%s", blob_str(pContent));
621
+ db_multi_exec("%s", blob_str(pContent) /*safe-for-%s*/);
615622
}else{
616623
db_multi_exec(
617624
"REPLACE INTO config(name,value,mtime) VALUES(%Q,%Q,now())",
618625
zName, blob_str(pContent)
619626
);
@@ -966,11 +973,12 @@
966973
db_multi_exec("DELETE FROM concealed");
967974
}else if( fossil_strcmp(zName,"@shun")==0 ){
968975
db_multi_exec("DELETE FROM shun");
969976
}else if( fossil_strcmp(zName,"@reportfmt")==0 ){
970977
db_multi_exec("DELETE FROM reportfmt");
971
- db_multi_exec(zRepositorySchemaDefaultReports);
978
+ assert( strchr(zRepositorySchemaDefaultReports,'%')==0 );
979
+ db_multi_exec(zRepositorySchemaDefaultReports /*works-like:""*/);
972980
}
973981
}
974982
db_end_transaction(0);
975983
fossil_print("Configuration reset to factory defaults.\n");
976984
fossil_print("To recover, use: %s %s import %s\n",
977985
--- src/configure.c
+++ src/configure.c
@@ -194,19 +194,19 @@
194 Blob x;
195 int i;
196 const char *zSep = "";
197
198 blob_zero(&x);
199 blob_append(&x, "(", 1);
200 for(i=0; i<count(aConfig); i++){
201 if( (aConfig[i].groupMask & iMask)==0 ) continue;
202 if( aConfig[i].zName[0]=='@' ) continue;
203 blob_appendf(&x, "%s'%s'", zSep, aConfig[i].zName);
204 zSep = ",";
205 }
206 blob_append(&x, ")", 1);
207 return blob_str(&x);
208 }
209
210 /*
211 ** Return the mask for the named configuration parameter if it can be
212 ** safely exported. Return 0 if the parameter is not safe to export.
@@ -361,11 +361,12 @@
361 @ INSERT INTO _xfer_reportfmt
362 @ SELECT rn,owner,title,cols,sqlcode FROM reportfmt;
363 @ INSERT INTO _xfer_user
364 @ SELECT uid,login,pw,cap,cookie,ipaddr,cexpire,info,photo FROM user;
365 ;
366 db_multi_exec(zSQL1);
 
367
368 /* When the replace flag is set, add triggers that run the first time
369 ** that new data is seen. The triggers run only once and delete all the
370 ** existing data.
371 */
@@ -390,11 +391,12 @@
390 sqlite3_create_function(g.db, "config_is_reset", 1, SQLITE_UTF8, 0,
391 config_is_reset_function, 0, 0);
392 sqlite3_create_function(g.db, "config_reset", 1, SQLITE_UTF8, 0,
393 config_reset_function, 0, 0);
394 configHasBeenReset = 0;
395 db_multi_exec(zSQL2);
 
396 }
397 }
398
399 /*
400 ** After receiving configuration data, call this routine to transfer
@@ -407,11 +409,12 @@
407 @ DELETE FROM reportfmt;
408 @ INSERT INTO reportfmt SELECT * FROM _xfer_reportfmt;
409 @ DROP TABLE _xfer_user;
410 @ DROP TABLE _xfer_reportfmt;
411 ;
412 db_multi_exec(zSQL);
 
413 }
414
415 /*
416 ** Mask of modified configuration sets
417 */
@@ -563,35 +566,39 @@
563 if( (thisMask & groupMask)==0 ) return;
564
565 blob_zero(&sql);
566 if( groupMask & CONFIGSET_OVERWRITE ){
567 if( (thisMask & configHasBeenReset)==0 && aType[ii].zName[0]!='/' ){
568 db_multi_exec("DELETE FROM %s", &aType[ii].zName[1]);
569 configHasBeenReset |= thisMask;
570 }
571 blob_append(&sql, "REPLACE INTO ", -1);
572 }else{
573 blob_append(&sql, "INSERT OR IGNORE INTO ", -1);
574 }
575 blob_appendf(&sql, "%s(%s, mtime", &zName[1], aType[ii].zPrimKey);
576 for(jj=2; jj<nToken; jj+=2){
577 blob_appendf(&sql, ",%s", azToken[jj]);
578 }
579 blob_appendf(&sql,") VALUES(%s,%s", azToken[1], azToken[0]);
580 for(jj=2; jj<nToken; jj+=2){
581 blob_appendf(&sql, ",%s", azToken[jj+1]);
582 }
583 db_multi_exec("%s)", blob_str(&sql));
 
584 if( db_changes()==0 ){
585 blob_reset(&sql);
586 blob_appendf(&sql, "UPDATE %s SET mtime=%s", &zName[1], azToken[0]);
 
587 for(jj=2; jj<nToken; jj+=2){
588 blob_appendf(&sql, ", %s=%s", azToken[jj], azToken[jj+1]);
 
589 }
590 blob_appendf(&sql, " WHERE %s=%s AND mtime<%s",
591 aType[ii].zPrimKey, azToken[1], azToken[0]);
592 db_multi_exec("%s", blob_str(&sql));
 
593 }
594 blob_reset(&sql);
595 rebuildMask |= thisMask;
596 }else{
597 /* Otherwise, the old format */
@@ -609,11 +616,11 @@
609 /* Notice that we are evaluating arbitrary SQL received from the
610 ** client. But this can only happen if the client has authenticated
611 ** as an administrator, so presumably we trust the client at this
612 ** point.
613 */
614 db_multi_exec("%s", blob_str(pContent));
615 }else{
616 db_multi_exec(
617 "REPLACE INTO config(name,value,mtime) VALUES(%Q,%Q,now())",
618 zName, blob_str(pContent)
619 );
@@ -966,11 +973,12 @@
966 db_multi_exec("DELETE FROM concealed");
967 }else if( fossil_strcmp(zName,"@shun")==0 ){
968 db_multi_exec("DELETE FROM shun");
969 }else if( fossil_strcmp(zName,"@reportfmt")==0 ){
970 db_multi_exec("DELETE FROM reportfmt");
971 db_multi_exec(zRepositorySchemaDefaultReports);
 
972 }
973 }
974 db_end_transaction(0);
975 fossil_print("Configuration reset to factory defaults.\n");
976 fossil_print("To recover, use: %s %s import %s\n",
977
--- src/configure.c
+++ src/configure.c
@@ -194,19 +194,19 @@
194 Blob x;
195 int i;
196 const char *zSep = "";
197
198 blob_zero(&x);
199 blob_append_sql(&x, "(");
200 for(i=0; i<count(aConfig); i++){
201 if( (aConfig[i].groupMask & iMask)==0 ) continue;
202 if( aConfig[i].zName[0]=='@' ) continue;
203 blob_append_sql(&x, "%s'%q'", zSep/*safe-for-%s*/, aConfig[i].zName);
204 zSep = ",";
205 }
206 blob_append_sql(&x, ")");
207 return blob_sql_text(&x);
208 }
209
210 /*
211 ** Return the mask for the named configuration parameter if it can be
212 ** safely exported. Return 0 if the parameter is not safe to export.
@@ -361,11 +361,12 @@
361 @ INSERT INTO _xfer_reportfmt
362 @ SELECT rn,owner,title,cols,sqlcode FROM reportfmt;
363 @ INSERT INTO _xfer_user
364 @ SELECT uid,login,pw,cap,cookie,ipaddr,cexpire,info,photo FROM user;
365 ;
366 assert( strchr(zSQL1,'%')==0 );
367 db_multi_exec(zSQL1 /*works-like:""*/);
368
369 /* When the replace flag is set, add triggers that run the first time
370 ** that new data is seen. The triggers run only once and delete all the
371 ** existing data.
372 */
@@ -390,11 +391,12 @@
391 sqlite3_create_function(g.db, "config_is_reset", 1, SQLITE_UTF8, 0,
392 config_is_reset_function, 0, 0);
393 sqlite3_create_function(g.db, "config_reset", 1, SQLITE_UTF8, 0,
394 config_reset_function, 0, 0);
395 configHasBeenReset = 0;
396 assert( strchr(zSQL2,'%')==0 );
397 db_multi_exec(zSQL2 /*works-like:""*/);
398 }
399 }
400
401 /*
402 ** After receiving configuration data, call this routine to transfer
@@ -407,11 +409,12 @@
409 @ DELETE FROM reportfmt;
410 @ INSERT INTO reportfmt SELECT * FROM _xfer_reportfmt;
411 @ DROP TABLE _xfer_user;
412 @ DROP TABLE _xfer_reportfmt;
413 ;
414 assert( strchr(zSQL,'%')==0 );
415 db_multi_exec(zSQL /*works-like:""*/);
416 }
417
418 /*
419 ** Mask of modified configuration sets
420 */
@@ -563,35 +566,39 @@
566 if( (thisMask & groupMask)==0 ) return;
567
568 blob_zero(&sql);
569 if( groupMask & CONFIGSET_OVERWRITE ){
570 if( (thisMask & configHasBeenReset)==0 && aType[ii].zName[0]!='/' ){
571 db_multi_exec("DELETE FROM \"%w\"", &aType[ii].zName[1]);
572 configHasBeenReset |= thisMask;
573 }
574 blob_append_sql(&sql, "REPLACE INTO ");
575 }else{
576 blob_append_sql(&sql, "INSERT OR IGNORE INTO ");
577 }
578 blob_append_sql(&sql, "\"%w\"(\"%w\", mtime", &zName[1], aType[ii].zPrimKey);
579 for(jj=2; jj<nToken; jj+=2){
580 blob_append_sql(&sql, ",\"%w\"", azToken[jj]);
581 }
582 blob_append_sql(&sql,") VALUES(%s,%s",
583 azToken[1] /*safe-for-%s*/, azToken[0] /*safe-for-%s*/);
584 for(jj=2; jj<nToken; jj+=2){
585 blob_append_sql(&sql, ",%s", azToken[jj+1] /*safe-for-%s*/);
586 }
587 db_multi_exec("%s)", blob_sql_text(&sql));
588 if( db_changes()==0 ){
589 blob_reset(&sql);
590 blob_append_sql(&sql, "UPDATE \"%w\" SET mtime=%s",
591 &zName[1], azToken[0]/*safe-for-%s*/);
592 for(jj=2; jj<nToken; jj+=2){
593 blob_append_sql(&sql, ", \"%w\"=%s",
594 azToken[jj], azToken[jj+1]/*safe-for-%s*/);
595 }
596 blob_append_sql(&sql, " WHERE \"%w\"=%s AND mtime<%s",
597 aType[ii].zPrimKey, azToken[1]/*safe-for-%s*/,
598 azToken[0]/*safe-for-%s*/);
599 db_multi_exec("%s", blob_sql_text(&sql));
600 }
601 blob_reset(&sql);
602 rebuildMask |= thisMask;
603 }else{
604 /* Otherwise, the old format */
@@ -609,11 +616,11 @@
616 /* Notice that we are evaluating arbitrary SQL received from the
617 ** client. But this can only happen if the client has authenticated
618 ** as an administrator, so presumably we trust the client at this
619 ** point.
620 */
621 db_multi_exec("%s", blob_str(pContent) /*safe-for-%s*/);
622 }else{
623 db_multi_exec(
624 "REPLACE INTO config(name,value,mtime) VALUES(%Q,%Q,now())",
625 zName, blob_str(pContent)
626 );
@@ -966,11 +973,12 @@
973 db_multi_exec("DELETE FROM concealed");
974 }else if( fossil_strcmp(zName,"@shun")==0 ){
975 db_multi_exec("DELETE FROM shun");
976 }else if( fossil_strcmp(zName,"@reportfmt")==0 ){
977 db_multi_exec("DELETE FROM reportfmt");
978 assert( strchr(zRepositorySchemaDefaultReports,'%')==0 );
979 db_multi_exec(zRepositorySchemaDefaultReports /*works-like:""*/);
980 }
981 }
982 db_end_transaction(0);
983 fossil_print("Configuration reset to factory defaults.\n");
984 fossil_print("To recover, use: %s %s import %s\n",
985
+2 -2
--- src/content.c
+++ src/content.c
@@ -558,12 +558,12 @@
558558
}
559559
}else{
560560
/* We are creating a new entry */
561561
db_prepare(&s1,
562562
"INSERT INTO blob(rcvid,size,uuid,content)"
563
- "VALUES(%d,%d,'%b',:data)",
564
- g.rcvid, size, &hash
563
+ "VALUES(%d,%d,'%q',:data)",
564
+ g.rcvid, size, blob_str(&hash)
565565
);
566566
db_bind_blob(&s1, ":data", &cmpr);
567567
db_exec(&s1);
568568
rid = db_last_insert_rowid();
569569
if( !pBlob ){
570570
--- src/content.c
+++ src/content.c
@@ -558,12 +558,12 @@
558 }
559 }else{
560 /* We are creating a new entry */
561 db_prepare(&s1,
562 "INSERT INTO blob(rcvid,size,uuid,content)"
563 "VALUES(%d,%d,'%b',:data)",
564 g.rcvid, size, &hash
565 );
566 db_bind_blob(&s1, ":data", &cmpr);
567 db_exec(&s1);
568 rid = db_last_insert_rowid();
569 if( !pBlob ){
570
--- src/content.c
+++ src/content.c
@@ -558,12 +558,12 @@
558 }
559 }else{
560 /* We are creating a new entry */
561 db_prepare(&s1,
562 "INSERT INTO blob(rcvid,size,uuid,content)"
563 "VALUES(%d,%d,'%q',:data)",
564 g.rcvid, size, blob_str(&hash)
565 );
566 db_bind_blob(&s1, ":data", &cmpr);
567 db_exec(&s1);
568 rid = db_last_insert_rowid();
569 if( !pBlob ){
570
+29 -30
--- src/db.c
+++ src/db.c
@@ -177,11 +177,11 @@
177177
db.doRollback |= db.aHook[i].xHook();
178178
}
179179
while( db.pAllStmt ){
180180
db_finalize(db.pAllStmt);
181181
}
182
- db_multi_exec(db.doRollback ? "ROLLBACK" : "COMMIT");
182
+ db_multi_exec("%s", db.doRollback ? "ROLLBACK" : "COMMIT");
183183
db.doRollback = 0;
184184
}
185185
}
186186
187187
/*
@@ -664,17 +664,17 @@
664664
665665
db = db_open(zFileName);
666666
sqlite3_exec(db, "BEGIN EXCLUSIVE", 0, 0, 0);
667667
rc = sqlite3_exec(db, zSchema, 0, 0, 0);
668668
if( rc!=SQLITE_OK ){
669
- db_err(sqlite3_errmsg(db));
669
+ db_err("%s", sqlite3_errmsg(db));
670670
}
671671
va_start(ap, zSchema);
672672
while( (zSql = va_arg(ap, const char*))!=0 ){
673673
rc = sqlite3_exec(db, zSql, 0, 0, 0);
674674
if( rc!=SQLITE_OK ){
675
- db_err(sqlite3_errmsg(db));
675
+ db_err("%s", sqlite3_errmsg(db));
676676
}
677677
}
678678
va_end(ap);
679679
sqlite3_exec(db, "COMMIT", 0, 0, 0);
680680
sqlite3_close(db);
@@ -750,19 +750,19 @@
750750
751751
/*
752752
** Detaches the zLabel database.
753753
*/
754754
void db_detach(const char *zLabel){
755
- db_multi_exec("DETACH DATABASE %s", zLabel);
755
+ db_multi_exec("DETACH DATABASE %Q", zLabel);
756756
}
757757
758758
/*
759759
** zDbName is the name of a database file. Attach zDbName using
760760
** the name zLabel.
761761
*/
762762
void db_attach(const char *zDbName, const char *zLabel){
763
- db_multi_exec("ATTACH DATABASE %Q AS %s", zDbName, zLabel);
763
+ db_multi_exec("ATTACH DATABASE %Q AS %Q", zDbName, zLabel);
764764
}
765765
766766
/*
767767
** zDbName is the name of a database file. If no other database
768768
** file is open, then open this one. If another database file is
@@ -887,11 +887,11 @@
887887
static int db_local_table_exists_but_lacks_column(
888888
const char *zTable,
889889
const char *zColumn
890890
){
891891
char *zDef = db_text(0, "SELECT sql FROM %s.sqlite_master"
892
- " WHERE name=='%s' /*scan*/",
892
+ " WHERE name==%Q /*scan*/",
893893
db_name("localdb"), zTable);
894894
int rc = 0;
895895
if( zDef ){
896896
char *zPattern = mprintf("* %s *", zColumn);
897897
rc = sqlite3_strglob(zPattern, zDef)!=0;
@@ -1119,11 +1119,11 @@
11191119
** Return TRUE if the schema is out-of-date
11201120
*/
11211121
int db_schema_is_outofdate(void){
11221122
return db_exists("SELECT 1 FROM config"
11231123
" WHERE name='aux-schema'"
1124
- " AND value<>'%s'", AUX_SCHEMA);
1124
+ " AND value<>%Q", AUX_SCHEMA);
11251125
}
11261126
11271127
/*
11281128
** Return true if the database is writeable
11291129
*/
@@ -1355,17 +1355,17 @@
13551355
Blob x;
13561356
int i;
13571357
const char *zSep = "";
13581358
13591359
blob_zero(&x);
1360
- blob_append(&x, "(", 1);
1360
+ blob_append_sql(&x, "(");
13611361
for(i=0; ctrlSettings[i].name; i++){
1362
- blob_appendf(&x, "%s'%s'", zSep, ctrlSettings[i].name);
1362
+ blob_append_sql(&x, "%s%Q", zSep/*safe-for-%s*/, ctrlSettings[i].name);
13631363
zSep = ",";
13641364
}
1365
- blob_append(&x, ")", 1);
1366
- return blob_str(&x);
1365
+ blob_append_sql(&x, ")");
1366
+ return blob_sql_text(&x);
13671367
}
13681368
13691369
/*
13701370
** Fill an empty repository database with the basic information for a
13711371
** repository. This function is shared between 'create_repository_cmd'
@@ -2003,53 +2003,52 @@
20032003
** ckout:%s
20042004
**
20052005
** Where %s is the checkout root. The value is the repository file.
20062006
*/
20072007
void db_record_repository_filename(const char *zName){
2008
- const char *zCollation;
20092008
char *zRepoSetting;
20102009
char *zCkoutSetting;
20112010
Blob full;
20122011
if( zName==0 ){
20132012
if( !g.localOpen ) return;
20142013
zName = db_repository_filename();
20152014
}
20162015
file_canonical_name(zName, &full, 0);
2017
- zCollation = filename_collation();
2016
+ (void)filename_collation(); /* Initialize before connection swap */
20182017
db_swap_connections();
20192018
zRepoSetting = mprintf("repo:%q", blob_str(&full));
20202019
db_multi_exec(
2021
- "DELETE FROM global_config WHERE name %s = '%s';",
2022
- zCollation, zRepoSetting
2020
+ "DELETE FROM global_config WHERE name %s = %Q;",
2021
+ filename_collation(), zRepoSetting
20232022
);
20242023
db_multi_exec(
20252024
"INSERT OR IGNORE INTO global_config(name,value)"
2026
- "VALUES('%s',1);",
2025
+ "VALUES(%Q,1);",
20272026
zRepoSetting
20282027
);
20292028
fossil_free(zRepoSetting);
20302029
if( g.localOpen && g.zLocalRoot && g.zLocalRoot[0] ){
20312030
Blob localRoot;
20322031
file_canonical_name(g.zLocalRoot, &localRoot, 1);
20332032
zCkoutSetting = mprintf("ckout:%q", blob_str(&localRoot));
20342033
db_multi_exec(
2035
- "DELETE FROM global_config WHERE name %s = '%s';",
2036
- zCollation, zCkoutSetting
2034
+ "DELETE FROM global_config WHERE name %s = %Q;",
2035
+ filename_collation(), zCkoutSetting
20372036
);
20382037
db_multi_exec(
20392038
"REPLACE INTO global_config(name, value)"
2040
- "VALUES('%s','%q');",
2039
+ "VALUES(%Q,%Q);",
20412040
zCkoutSetting, blob_str(&full)
20422041
);
20432042
db_swap_connections();
20442043
db_optional_sql("repository",
2045
- "DELETE FROM config WHERE name %s = '%s';",
2046
- zCollation, zCkoutSetting
2044
+ "DELETE FROM config WHERE name %s = %Q;",
2045
+ filename_collation(), zCkoutSetting
20472046
);
20482047
db_optional_sql("repository",
20492048
"REPLACE INTO config(name,value,mtime)"
2050
- "VALUES('%s',1,now());",
2049
+ "VALUES(%Q,1,now());",
20512050
zCkoutSetting
20522051
);
20532052
fossil_free(zCkoutSetting);
20542053
blob_reset(&localRoot);
20552054
}else{
@@ -2654,28 +2653,28 @@
26542653
zOrigSql += j+6;
26552654
j = -1;
26562655
}
26572656
}
26582657
blob_append(&newSql, zOrigSql, -1);
2659
- blob_appendf(&allSql,
2660
- "ALTER TABLE %s RENAME TO x_%s;\n"
2658
+ blob_append_sql(&allSql,
2659
+ "ALTER TABLE \"%w\" RENAME TO \"x_%w\";\n"
26612660
"%s WITHOUT ROWID;\n"
2662
- "INSERT INTO %s SELECT * FROM x_%s;\n"
2663
- "DROP TABLE x_%s;\n",
2664
- zTName, zTName, blob_str(&newSql), zTName, zTName, zTName
2661
+ "INSERT INTO \"%w\" SELECT * FROM \"x_%w\";\n"
2662
+ "DROP TABLE \"x_%w\";\n",
2663
+ zTName, zTName, blob_sql_text(&newSql), zTName, zTName, zTName
26652664
);
26662665
fossil_print("Converting table %s of %s to WITHOUT ROWID.\n", zTName, g.argv[i]);
26672666
blob_reset(&newSql);
26682667
}
2669
- blob_appendf(&allSql, "COMMIT;\n");
2668
+ blob_append_sql(&allSql, "COMMIT;\n");
26702669
db_finalize(&q);
26712670
if( dryRun ){
26722671
fossil_print("SQL that would have been evaluated:\n");
26732672
fossil_print("-------------------------------------------------------------\n");
2674
- fossil_print("%s", blob_str(&allSql));
2673
+ fossil_print("%s", blob_sql_text(&allSql));
26752674
}else{
2676
- db_multi_exec("%s", blob_str(&allSql));
2675
+ db_multi_exec("%s", blob_sql_text(&allSql));
26772676
}
26782677
blob_reset(&allSql);
26792678
db_close(1);
26802679
}
26812680
}
26822681
--- src/db.c
+++ src/db.c
@@ -177,11 +177,11 @@
177 db.doRollback |= db.aHook[i].xHook();
178 }
179 while( db.pAllStmt ){
180 db_finalize(db.pAllStmt);
181 }
182 db_multi_exec(db.doRollback ? "ROLLBACK" : "COMMIT");
183 db.doRollback = 0;
184 }
185 }
186
187 /*
@@ -664,17 +664,17 @@
664
665 db = db_open(zFileName);
666 sqlite3_exec(db, "BEGIN EXCLUSIVE", 0, 0, 0);
667 rc = sqlite3_exec(db, zSchema, 0, 0, 0);
668 if( rc!=SQLITE_OK ){
669 db_err(sqlite3_errmsg(db));
670 }
671 va_start(ap, zSchema);
672 while( (zSql = va_arg(ap, const char*))!=0 ){
673 rc = sqlite3_exec(db, zSql, 0, 0, 0);
674 if( rc!=SQLITE_OK ){
675 db_err(sqlite3_errmsg(db));
676 }
677 }
678 va_end(ap);
679 sqlite3_exec(db, "COMMIT", 0, 0, 0);
680 sqlite3_close(db);
@@ -750,19 +750,19 @@
750
751 /*
752 ** Detaches the zLabel database.
753 */
754 void db_detach(const char *zLabel){
755 db_multi_exec("DETACH DATABASE %s", zLabel);
756 }
757
758 /*
759 ** zDbName is the name of a database file. Attach zDbName using
760 ** the name zLabel.
761 */
762 void db_attach(const char *zDbName, const char *zLabel){
763 db_multi_exec("ATTACH DATABASE %Q AS %s", zDbName, zLabel);
764 }
765
766 /*
767 ** zDbName is the name of a database file. If no other database
768 ** file is open, then open this one. If another database file is
@@ -887,11 +887,11 @@
887 static int db_local_table_exists_but_lacks_column(
888 const char *zTable,
889 const char *zColumn
890 ){
891 char *zDef = db_text(0, "SELECT sql FROM %s.sqlite_master"
892 " WHERE name=='%s' /*scan*/",
893 db_name("localdb"), zTable);
894 int rc = 0;
895 if( zDef ){
896 char *zPattern = mprintf("* %s *", zColumn);
897 rc = sqlite3_strglob(zPattern, zDef)!=0;
@@ -1119,11 +1119,11 @@
1119 ** Return TRUE if the schema is out-of-date
1120 */
1121 int db_schema_is_outofdate(void){
1122 return db_exists("SELECT 1 FROM config"
1123 " WHERE name='aux-schema'"
1124 " AND value<>'%s'", AUX_SCHEMA);
1125 }
1126
1127 /*
1128 ** Return true if the database is writeable
1129 */
@@ -1355,17 +1355,17 @@
1355 Blob x;
1356 int i;
1357 const char *zSep = "";
1358
1359 blob_zero(&x);
1360 blob_append(&x, "(", 1);
1361 for(i=0; ctrlSettings[i].name; i++){
1362 blob_appendf(&x, "%s'%s'", zSep, ctrlSettings[i].name);
1363 zSep = ",";
1364 }
1365 blob_append(&x, ")", 1);
1366 return blob_str(&x);
1367 }
1368
1369 /*
1370 ** Fill an empty repository database with the basic information for a
1371 ** repository. This function is shared between 'create_repository_cmd'
@@ -2003,53 +2003,52 @@
2003 ** ckout:%s
2004 **
2005 ** Where %s is the checkout root. The value is the repository file.
2006 */
2007 void db_record_repository_filename(const char *zName){
2008 const char *zCollation;
2009 char *zRepoSetting;
2010 char *zCkoutSetting;
2011 Blob full;
2012 if( zName==0 ){
2013 if( !g.localOpen ) return;
2014 zName = db_repository_filename();
2015 }
2016 file_canonical_name(zName, &full, 0);
2017 zCollation = filename_collation();
2018 db_swap_connections();
2019 zRepoSetting = mprintf("repo:%q", blob_str(&full));
2020 db_multi_exec(
2021 "DELETE FROM global_config WHERE name %s = '%s';",
2022 zCollation, zRepoSetting
2023 );
2024 db_multi_exec(
2025 "INSERT OR IGNORE INTO global_config(name,value)"
2026 "VALUES('%s',1);",
2027 zRepoSetting
2028 );
2029 fossil_free(zRepoSetting);
2030 if( g.localOpen && g.zLocalRoot && g.zLocalRoot[0] ){
2031 Blob localRoot;
2032 file_canonical_name(g.zLocalRoot, &localRoot, 1);
2033 zCkoutSetting = mprintf("ckout:%q", blob_str(&localRoot));
2034 db_multi_exec(
2035 "DELETE FROM global_config WHERE name %s = '%s';",
2036 zCollation, zCkoutSetting
2037 );
2038 db_multi_exec(
2039 "REPLACE INTO global_config(name, value)"
2040 "VALUES('%s','%q');",
2041 zCkoutSetting, blob_str(&full)
2042 );
2043 db_swap_connections();
2044 db_optional_sql("repository",
2045 "DELETE FROM config WHERE name %s = '%s';",
2046 zCollation, zCkoutSetting
2047 );
2048 db_optional_sql("repository",
2049 "REPLACE INTO config(name,value,mtime)"
2050 "VALUES('%s',1,now());",
2051 zCkoutSetting
2052 );
2053 fossil_free(zCkoutSetting);
2054 blob_reset(&localRoot);
2055 }else{
@@ -2654,28 +2653,28 @@
2654 zOrigSql += j+6;
2655 j = -1;
2656 }
2657 }
2658 blob_append(&newSql, zOrigSql, -1);
2659 blob_appendf(&allSql,
2660 "ALTER TABLE %s RENAME TO x_%s;\n"
2661 "%s WITHOUT ROWID;\n"
2662 "INSERT INTO %s SELECT * FROM x_%s;\n"
2663 "DROP TABLE x_%s;\n",
2664 zTName, zTName, blob_str(&newSql), zTName, zTName, zTName
2665 );
2666 fossil_print("Converting table %s of %s to WITHOUT ROWID.\n", zTName, g.argv[i]);
2667 blob_reset(&newSql);
2668 }
2669 blob_appendf(&allSql, "COMMIT;\n");
2670 db_finalize(&q);
2671 if( dryRun ){
2672 fossil_print("SQL that would have been evaluated:\n");
2673 fossil_print("-------------------------------------------------------------\n");
2674 fossil_print("%s", blob_str(&allSql));
2675 }else{
2676 db_multi_exec("%s", blob_str(&allSql));
2677 }
2678 blob_reset(&allSql);
2679 db_close(1);
2680 }
2681 }
2682
--- src/db.c
+++ src/db.c
@@ -177,11 +177,11 @@
177 db.doRollback |= db.aHook[i].xHook();
178 }
179 while( db.pAllStmt ){
180 db_finalize(db.pAllStmt);
181 }
182 db_multi_exec("%s", db.doRollback ? "ROLLBACK" : "COMMIT");
183 db.doRollback = 0;
184 }
185 }
186
187 /*
@@ -664,17 +664,17 @@
664
665 db = db_open(zFileName);
666 sqlite3_exec(db, "BEGIN EXCLUSIVE", 0, 0, 0);
667 rc = sqlite3_exec(db, zSchema, 0, 0, 0);
668 if( rc!=SQLITE_OK ){
669 db_err("%s", sqlite3_errmsg(db));
670 }
671 va_start(ap, zSchema);
672 while( (zSql = va_arg(ap, const char*))!=0 ){
673 rc = sqlite3_exec(db, zSql, 0, 0, 0);
674 if( rc!=SQLITE_OK ){
675 db_err("%s", sqlite3_errmsg(db));
676 }
677 }
678 va_end(ap);
679 sqlite3_exec(db, "COMMIT", 0, 0, 0);
680 sqlite3_close(db);
@@ -750,19 +750,19 @@
750
751 /*
752 ** Detaches the zLabel database.
753 */
754 void db_detach(const char *zLabel){
755 db_multi_exec("DETACH DATABASE %Q", zLabel);
756 }
757
758 /*
759 ** zDbName is the name of a database file. Attach zDbName using
760 ** the name zLabel.
761 */
762 void db_attach(const char *zDbName, const char *zLabel){
763 db_multi_exec("ATTACH DATABASE %Q AS %Q", zDbName, zLabel);
764 }
765
766 /*
767 ** zDbName is the name of a database file. If no other database
768 ** file is open, then open this one. If another database file is
@@ -887,11 +887,11 @@
887 static int db_local_table_exists_but_lacks_column(
888 const char *zTable,
889 const char *zColumn
890 ){
891 char *zDef = db_text(0, "SELECT sql FROM %s.sqlite_master"
892 " WHERE name==%Q /*scan*/",
893 db_name("localdb"), zTable);
894 int rc = 0;
895 if( zDef ){
896 char *zPattern = mprintf("* %s *", zColumn);
897 rc = sqlite3_strglob(zPattern, zDef)!=0;
@@ -1119,11 +1119,11 @@
1119 ** Return TRUE if the schema is out-of-date
1120 */
1121 int db_schema_is_outofdate(void){
1122 return db_exists("SELECT 1 FROM config"
1123 " WHERE name='aux-schema'"
1124 " AND value<>%Q", AUX_SCHEMA);
1125 }
1126
1127 /*
1128 ** Return true if the database is writeable
1129 */
@@ -1355,17 +1355,17 @@
1355 Blob x;
1356 int i;
1357 const char *zSep = "";
1358
1359 blob_zero(&x);
1360 blob_append_sql(&x, "(");
1361 for(i=0; ctrlSettings[i].name; i++){
1362 blob_append_sql(&x, "%s%Q", zSep/*safe-for-%s*/, ctrlSettings[i].name);
1363 zSep = ",";
1364 }
1365 blob_append_sql(&x, ")");
1366 return blob_sql_text(&x);
1367 }
1368
1369 /*
1370 ** Fill an empty repository database with the basic information for a
1371 ** repository. This function is shared between 'create_repository_cmd'
@@ -2003,53 +2003,52 @@
2003 ** ckout:%s
2004 **
2005 ** Where %s is the checkout root. The value is the repository file.
2006 */
2007 void db_record_repository_filename(const char *zName){
 
2008 char *zRepoSetting;
2009 char *zCkoutSetting;
2010 Blob full;
2011 if( zName==0 ){
2012 if( !g.localOpen ) return;
2013 zName = db_repository_filename();
2014 }
2015 file_canonical_name(zName, &full, 0);
2016 (void)filename_collation(); /* Initialize before connection swap */
2017 db_swap_connections();
2018 zRepoSetting = mprintf("repo:%q", blob_str(&full));
2019 db_multi_exec(
2020 "DELETE FROM global_config WHERE name %s = %Q;",
2021 filename_collation(), zRepoSetting
2022 );
2023 db_multi_exec(
2024 "INSERT OR IGNORE INTO global_config(name,value)"
2025 "VALUES(%Q,1);",
2026 zRepoSetting
2027 );
2028 fossil_free(zRepoSetting);
2029 if( g.localOpen && g.zLocalRoot && g.zLocalRoot[0] ){
2030 Blob localRoot;
2031 file_canonical_name(g.zLocalRoot, &localRoot, 1);
2032 zCkoutSetting = mprintf("ckout:%q", blob_str(&localRoot));
2033 db_multi_exec(
2034 "DELETE FROM global_config WHERE name %s = %Q;",
2035 filename_collation(), zCkoutSetting
2036 );
2037 db_multi_exec(
2038 "REPLACE INTO global_config(name, value)"
2039 "VALUES(%Q,%Q);",
2040 zCkoutSetting, blob_str(&full)
2041 );
2042 db_swap_connections();
2043 db_optional_sql("repository",
2044 "DELETE FROM config WHERE name %s = %Q;",
2045 filename_collation(), zCkoutSetting
2046 );
2047 db_optional_sql("repository",
2048 "REPLACE INTO config(name,value,mtime)"
2049 "VALUES(%Q,1,now());",
2050 zCkoutSetting
2051 );
2052 fossil_free(zCkoutSetting);
2053 blob_reset(&localRoot);
2054 }else{
@@ -2654,28 +2653,28 @@
2653 zOrigSql += j+6;
2654 j = -1;
2655 }
2656 }
2657 blob_append(&newSql, zOrigSql, -1);
2658 blob_append_sql(&allSql,
2659 "ALTER TABLE \"%w\" RENAME TO \"x_%w\";\n"
2660 "%s WITHOUT ROWID;\n"
2661 "INSERT INTO \"%w\" SELECT * FROM \"x_%w\";\n"
2662 "DROP TABLE \"x_%w\";\n",
2663 zTName, zTName, blob_sql_text(&newSql), zTName, zTName, zTName
2664 );
2665 fossil_print("Converting table %s of %s to WITHOUT ROWID.\n", zTName, g.argv[i]);
2666 blob_reset(&newSql);
2667 }
2668 blob_append_sql(&allSql, "COMMIT;\n");
2669 db_finalize(&q);
2670 if( dryRun ){
2671 fossil_print("SQL that would have been evaluated:\n");
2672 fossil_print("-------------------------------------------------------------\n");
2673 fossil_print("%s", blob_sql_text(&allSql));
2674 }else{
2675 db_multi_exec("%s", blob_sql_text(&allSql));
2676 }
2677 blob_reset(&allSql);
2678 db_close(1);
2679 }
2680 }
2681
+10 -10
--- src/delta.c
+++ src/delta.c
@@ -65,11 +65,11 @@
6565
** The "u32" type must be an unsigned 32-bit integer. Adjust this
6666
*/
6767
typedef unsigned int u32;
6868
6969
/*
70
-** Must be a 16-bit value
70
+** Must be a 16-bit value
7171
*/
7272
typedef short int s16;
7373
typedef unsigned short int u16;
7474
7575
#endif /* INTERFACE */
@@ -82,11 +82,11 @@
8282
8383
/*
8484
** The current state of the rolling hash.
8585
**
8686
** z[] holds the values that have been hashed. z[] is a circular buffer.
87
-** z[i] is the first entry and z[(i+NHASH-1)%NHASH] is the last entry of
87
+** z[i] is the first entry and z[(i+NHASH-1)%NHASH] is the last entry of
8888
** the window.
8989
**
9090
** Hash.a is the sum of all elements of hash.z[]. Hash.b is a weighted
9191
** sum. Hash.b is z[i]*NHASH + z[i+1]*(NHASH-1) + ... + z[i+NHASH-1]*1.
9292
** (Each index for z[] should be module NHASH, of course. The %NHASH operator
@@ -135,11 +135,11 @@
135135
136136
/*
137137
** Write an base-64 integer into the given buffer.
138138
*/
139139
static void putInt(unsigned int v, char **pz){
140
- static const char zDigits[] =
140
+ static const char zDigits[] =
141141
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
142142
/* 123456789 123456789 123456789 123456789 123456789 123456789 123 */
143143
int i, j;
144144
char zBuf[20];
145145
if( v==0 ){
@@ -229,11 +229,11 @@
229229
}
230230
231231
/*
232232
** Create a new delta.
233233
**
234
-** The delta is written into a preallocated buffer, zDelta, which
234
+** The delta is written into a preallocated buffer, zDelta, which
235235
** should be at least 60 bytes longer than the target file, zOut.
236236
** The delta string will be NUL-terminated, but it might also contain
237237
** embedded NUL characters if either the zSrc or zOut files are
238238
** binary. This function returns the length of the delta string
239239
** in bytes, excluding the final NUL terminator character.
@@ -245,11 +245,11 @@
245245
** delta file z, a program can compute the size of the output file
246246
** simply by reading the first line and decoding the base-64 number
247247
** found there. The delta_output_size() routine does exactly this.
248248
**
249249
** After the initial size number, the delta consists of a series of
250
-** literal text segments and commands to copy from the SOURCE file.
250
+** literal text segments and commands to copy from the SOURCE file.
251251
** A copy command looks like this:
252252
**
253253
** NNN@MMM,
254254
**
255255
** where NNN is the number of bytes to be copied and MMM is the offset
@@ -283,11 +283,11 @@
283283
** search for a matching section in the source file. When a match
284284
** is found, a copy command is added to the delta. An effort is
285285
** made to extend the matching section to regions that come before
286286
** and after the 16-byte hash window. A copy command is only issued
287287
** if the result would use less space that just quoting the text
288
-** literally. Literal text is added to the delta for sections that
288
+** literally. Literal text is added to the delta for sections that
289289
** do not match or which can not be encoded efficiently using copy
290290
** commands.
291291
*/
292292
int delta_create(
293293
const char *zSrc, /* The source or pattern file */
@@ -356,13 +356,13 @@
356356
hv = hash_32bit(&h) % nHash;
357357
DEBUG2( printf("LOOKING: %4d [%s]\n", base+i, print16(&zOut[base+i])); )
358358
iBlock = landmark[hv];
359359
while( iBlock>=0 && (limit--)>0 ){
360360
/*
361
- ** The hash window has identified a potential match against
361
+ ** The hash window has identified a potential match against
362362
** landmark block iBlock. But we need to investigate further.
363
- **
363
+ **
364364
** Look for a region in zOut that matches zSrc. Anchor the search
365365
** at zSrc[iSrc] and zOut[base+i]. Do not include anything prior to
366366
** zOut[base] or after zOut[outLen] nor anything after zSrc[srcLen].
367367
**
368368
** Set cnt equal to the length of the match and set ofst so that
@@ -468,16 +468,16 @@
468468
}
469469
/* Output the final checksum record. */
470470
putInt(checksum(zOut, lenOut), &zDelta);
471471
*(zDelta++) = ';';
472472
fossil_free(collide);
473
- return zDelta - zOrigDelta;
473
+ return zDelta - zOrigDelta;
474474
}
475475
476476
/*
477477
** Return the size (in bytes) of the output from applying
478
-** a delta.
478
+** a delta.
479479
**
480480
** This routine is provided so that an procedure that is able
481481
** to call delta_apply() can learn how much space is required
482482
** for the output and hence allocate nor more space that is really
483483
** needed.
484484
--- src/delta.c
+++ src/delta.c
@@ -65,11 +65,11 @@
65 ** The "u32" type must be an unsigned 32-bit integer. Adjust this
66 */
67 typedef unsigned int u32;
68
69 /*
70 ** Must be a 16-bit value
71 */
72 typedef short int s16;
73 typedef unsigned short int u16;
74
75 #endif /* INTERFACE */
@@ -82,11 +82,11 @@
82
83 /*
84 ** The current state of the rolling hash.
85 **
86 ** z[] holds the values that have been hashed. z[] is a circular buffer.
87 ** z[i] is the first entry and z[(i+NHASH-1)%NHASH] is the last entry of
88 ** the window.
89 **
90 ** Hash.a is the sum of all elements of hash.z[]. Hash.b is a weighted
91 ** sum. Hash.b is z[i]*NHASH + z[i+1]*(NHASH-1) + ... + z[i+NHASH-1]*1.
92 ** (Each index for z[] should be module NHASH, of course. The %NHASH operator
@@ -135,11 +135,11 @@
135
136 /*
137 ** Write an base-64 integer into the given buffer.
138 */
139 static void putInt(unsigned int v, char **pz){
140 static const char zDigits[] =
141 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
142 /* 123456789 123456789 123456789 123456789 123456789 123456789 123 */
143 int i, j;
144 char zBuf[20];
145 if( v==0 ){
@@ -229,11 +229,11 @@
229 }
230
231 /*
232 ** Create a new delta.
233 **
234 ** The delta is written into a preallocated buffer, zDelta, which
235 ** should be at least 60 bytes longer than the target file, zOut.
236 ** The delta string will be NUL-terminated, but it might also contain
237 ** embedded NUL characters if either the zSrc or zOut files are
238 ** binary. This function returns the length of the delta string
239 ** in bytes, excluding the final NUL terminator character.
@@ -245,11 +245,11 @@
245 ** delta file z, a program can compute the size of the output file
246 ** simply by reading the first line and decoding the base-64 number
247 ** found there. The delta_output_size() routine does exactly this.
248 **
249 ** After the initial size number, the delta consists of a series of
250 ** literal text segments and commands to copy from the SOURCE file.
251 ** A copy command looks like this:
252 **
253 ** NNN@MMM,
254 **
255 ** where NNN is the number of bytes to be copied and MMM is the offset
@@ -283,11 +283,11 @@
283 ** search for a matching section in the source file. When a match
284 ** is found, a copy command is added to the delta. An effort is
285 ** made to extend the matching section to regions that come before
286 ** and after the 16-byte hash window. A copy command is only issued
287 ** if the result would use less space that just quoting the text
288 ** literally. Literal text is added to the delta for sections that
289 ** do not match or which can not be encoded efficiently using copy
290 ** commands.
291 */
292 int delta_create(
293 const char *zSrc, /* The source or pattern file */
@@ -356,13 +356,13 @@
356 hv = hash_32bit(&h) % nHash;
357 DEBUG2( printf("LOOKING: %4d [%s]\n", base+i, print16(&zOut[base+i])); )
358 iBlock = landmark[hv];
359 while( iBlock>=0 && (limit--)>0 ){
360 /*
361 ** The hash window has identified a potential match against
362 ** landmark block iBlock. But we need to investigate further.
363 **
364 ** Look for a region in zOut that matches zSrc. Anchor the search
365 ** at zSrc[iSrc] and zOut[base+i]. Do not include anything prior to
366 ** zOut[base] or after zOut[outLen] nor anything after zSrc[srcLen].
367 **
368 ** Set cnt equal to the length of the match and set ofst so that
@@ -468,16 +468,16 @@
468 }
469 /* Output the final checksum record. */
470 putInt(checksum(zOut, lenOut), &zDelta);
471 *(zDelta++) = ';';
472 fossil_free(collide);
473 return zDelta - zOrigDelta;
474 }
475
476 /*
477 ** Return the size (in bytes) of the output from applying
478 ** a delta.
479 **
480 ** This routine is provided so that an procedure that is able
481 ** to call delta_apply() can learn how much space is required
482 ** for the output and hence allocate nor more space that is really
483 ** needed.
484
--- src/delta.c
+++ src/delta.c
@@ -65,11 +65,11 @@
65 ** The "u32" type must be an unsigned 32-bit integer. Adjust this
66 */
67 typedef unsigned int u32;
68
69 /*
70 ** Must be a 16-bit value
71 */
72 typedef short int s16;
73 typedef unsigned short int u16;
74
75 #endif /* INTERFACE */
@@ -82,11 +82,11 @@
82
83 /*
84 ** The current state of the rolling hash.
85 **
86 ** z[] holds the values that have been hashed. z[] is a circular buffer.
87 ** z[i] is the first entry and z[(i+NHASH-1)%NHASH] is the last entry of
88 ** the window.
89 **
90 ** Hash.a is the sum of all elements of hash.z[]. Hash.b is a weighted
91 ** sum. Hash.b is z[i]*NHASH + z[i+1]*(NHASH-1) + ... + z[i+NHASH-1]*1.
92 ** (Each index for z[] should be module NHASH, of course. The %NHASH operator
@@ -135,11 +135,11 @@
135
136 /*
137 ** Write an base-64 integer into the given buffer.
138 */
139 static void putInt(unsigned int v, char **pz){
140 static const char zDigits[] =
141 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
142 /* 123456789 123456789 123456789 123456789 123456789 123456789 123 */
143 int i, j;
144 char zBuf[20];
145 if( v==0 ){
@@ -229,11 +229,11 @@
229 }
230
231 /*
232 ** Create a new delta.
233 **
234 ** The delta is written into a preallocated buffer, zDelta, which
235 ** should be at least 60 bytes longer than the target file, zOut.
236 ** The delta string will be NUL-terminated, but it might also contain
237 ** embedded NUL characters if either the zSrc or zOut files are
238 ** binary. This function returns the length of the delta string
239 ** in bytes, excluding the final NUL terminator character.
@@ -245,11 +245,11 @@
245 ** delta file z, a program can compute the size of the output file
246 ** simply by reading the first line and decoding the base-64 number
247 ** found there. The delta_output_size() routine does exactly this.
248 **
249 ** After the initial size number, the delta consists of a series of
250 ** literal text segments and commands to copy from the SOURCE file.
251 ** A copy command looks like this:
252 **
253 ** NNN@MMM,
254 **
255 ** where NNN is the number of bytes to be copied and MMM is the offset
@@ -283,11 +283,11 @@
283 ** search for a matching section in the source file. When a match
284 ** is found, a copy command is added to the delta. An effort is
285 ** made to extend the matching section to regions that come before
286 ** and after the 16-byte hash window. A copy command is only issued
287 ** if the result would use less space that just quoting the text
288 ** literally. Literal text is added to the delta for sections that
289 ** do not match or which can not be encoded efficiently using copy
290 ** commands.
291 */
292 int delta_create(
293 const char *zSrc, /* The source or pattern file */
@@ -356,13 +356,13 @@
356 hv = hash_32bit(&h) % nHash;
357 DEBUG2( printf("LOOKING: %4d [%s]\n", base+i, print16(&zOut[base+i])); )
358 iBlock = landmark[hv];
359 while( iBlock>=0 && (limit--)>0 ){
360 /*
361 ** The hash window has identified a potential match against
362 ** landmark block iBlock. But we need to investigate further.
363 **
364 ** Look for a region in zOut that matches zSrc. Anchor the search
365 ** at zSrc[iSrc] and zOut[base+i]. Do not include anything prior to
366 ** zOut[base] or after zOut[outLen] nor anything after zSrc[srcLen].
367 **
368 ** Set cnt equal to the length of the match and set ofst so that
@@ -468,16 +468,16 @@
468 }
469 /* Output the final checksum record. */
470 putInt(checksum(zOut, lenOut), &zDelta);
471 *(zDelta++) = ';';
472 fossil_free(collide);
473 return zDelta - zOrigDelta;
474 }
475
476 /*
477 ** Return the size (in bytes) of the output from applying
478 ** a delta.
479 **
480 ** This routine is provided so that an procedure that is able
481 ** to call delta_apply() can learn how much space is required
482 ** for the output and hence allocate nor more space that is really
483 ** needed.
484
+10 -10
--- src/descendants.c
+++ src/descendants.c
@@ -389,22 +389,22 @@
389389
verify_all_options();
390390
391391
if( recomputeFlag ) leaf_rebuild();
392392
blob_zero(&sql);
393393
blob_append(&sql, timeline_query_for_tty(), -1);
394
- blob_appendf(&sql, " AND blob.rid IN leaf");
394
+ blob_append_sql(&sql, " AND blob.rid IN leaf");
395395
if( showClosed ){
396
- blob_appendf(&sql," AND %z", leaf_is_closed_sql("blob.rid"));
396
+ blob_append_sql(&sql," AND %z", leaf_is_closed_sql("blob.rid"));
397397
}else if( !showAll ){
398
- blob_appendf(&sql," AND NOT %z", leaf_is_closed_sql("blob.rid"));
398
+ blob_append_sql(&sql," AND NOT %z", leaf_is_closed_sql("blob.rid"));
399399
}
400400
if( byBranch ){
401401
db_prepare(&q, "%s ORDER BY nullif(branch,'trunk') COLLATE nocase,"
402402
" event.mtime DESC",
403
- blob_str(&sql));
403
+ blob_sql_text(&sql));
404404
}else{
405
- db_prepare(&q, "%s ORDER BY event.mtime DESC", blob_str(&sql));
405
+ db_prepare(&q, "%s ORDER BY event.mtime DESC", blob_sql_text(&sql));
406406
}
407407
blob_reset(&sql);
408408
n = 0;
409409
while( db_step(&q)==SQLITE_ROW ){
410410
const char *zId = db_column_text(&q, 1);
@@ -474,17 +474,17 @@
474474
}else{
475475
@ <h1>Open leaves:</h1>
476476
}
477477
blob_zero(&sql);
478478
blob_append(&sql, timeline_query_for_www(), -1);
479
- blob_appendf(&sql, " AND blob.rid IN leaf");
479
+ blob_append_sql(&sql, " AND blob.rid IN leaf");
480480
if( showClosed ){
481
- blob_appendf(&sql," AND %z", leaf_is_closed_sql("blob.rid"));
481
+ blob_append_sql(&sql," AND %z", leaf_is_closed_sql("blob.rid"));
482482
}else if( !showAll ){
483
- blob_appendf(&sql," AND NOT %z", leaf_is_closed_sql("blob.rid"));
483
+ blob_append_sql(&sql," AND NOT %z", leaf_is_closed_sql("blob.rid"));
484484
}
485
- db_prepare(&q, "%s ORDER BY event.mtime DESC", blob_str(&sql));
485
+ db_prepare(&q, "%s ORDER BY event.mtime DESC", blob_sql_text(&sql));
486486
blob_reset(&sql);
487487
www_print_timeline(&q, TIMELINE_LEAFONLY, 0, 0, 0);
488488
db_finalize(&q);
489489
@ <br />
490490
style_footer();
@@ -508,11 +508,11 @@
508508
Stmt q;
509509
int rid;
510510
511511
bag_init(&seen);
512512
bag_init(&pending);
513
- db_prepare(&ins, "INSERT OR IGNORE INTO \"%s\" VALUES(:rid)", zTab);
513
+ db_prepare(&ins, "INSERT OR IGNORE INTO \"%w\" VALUES(:rid)", zTab);
514514
db_prepare(&q, "SELECT mid FROM mlink WHERE fid=%d", fid);
515515
while( db_step(&q)==SQLITE_ROW ){
516516
int mid = db_column_int(&q, 0);
517517
bag_insert(&pending, mid);
518518
bag_insert(&seen, mid);
519519
--- src/descendants.c
+++ src/descendants.c
@@ -389,22 +389,22 @@
389 verify_all_options();
390
391 if( recomputeFlag ) leaf_rebuild();
392 blob_zero(&sql);
393 blob_append(&sql, timeline_query_for_tty(), -1);
394 blob_appendf(&sql, " AND blob.rid IN leaf");
395 if( showClosed ){
396 blob_appendf(&sql," AND %z", leaf_is_closed_sql("blob.rid"));
397 }else if( !showAll ){
398 blob_appendf(&sql," AND NOT %z", leaf_is_closed_sql("blob.rid"));
399 }
400 if( byBranch ){
401 db_prepare(&q, "%s ORDER BY nullif(branch,'trunk') COLLATE nocase,"
402 " event.mtime DESC",
403 blob_str(&sql));
404 }else{
405 db_prepare(&q, "%s ORDER BY event.mtime DESC", blob_str(&sql));
406 }
407 blob_reset(&sql);
408 n = 0;
409 while( db_step(&q)==SQLITE_ROW ){
410 const char *zId = db_column_text(&q, 1);
@@ -474,17 +474,17 @@
474 }else{
475 @ <h1>Open leaves:</h1>
476 }
477 blob_zero(&sql);
478 blob_append(&sql, timeline_query_for_www(), -1);
479 blob_appendf(&sql, " AND blob.rid IN leaf");
480 if( showClosed ){
481 blob_appendf(&sql," AND %z", leaf_is_closed_sql("blob.rid"));
482 }else if( !showAll ){
483 blob_appendf(&sql," AND NOT %z", leaf_is_closed_sql("blob.rid"));
484 }
485 db_prepare(&q, "%s ORDER BY event.mtime DESC", blob_str(&sql));
486 blob_reset(&sql);
487 www_print_timeline(&q, TIMELINE_LEAFONLY, 0, 0, 0);
488 db_finalize(&q);
489 @ <br />
490 style_footer();
@@ -508,11 +508,11 @@
508 Stmt q;
509 int rid;
510
511 bag_init(&seen);
512 bag_init(&pending);
513 db_prepare(&ins, "INSERT OR IGNORE INTO \"%s\" VALUES(:rid)", zTab);
514 db_prepare(&q, "SELECT mid FROM mlink WHERE fid=%d", fid);
515 while( db_step(&q)==SQLITE_ROW ){
516 int mid = db_column_int(&q, 0);
517 bag_insert(&pending, mid);
518 bag_insert(&seen, mid);
519
--- src/descendants.c
+++ src/descendants.c
@@ -389,22 +389,22 @@
389 verify_all_options();
390
391 if( recomputeFlag ) leaf_rebuild();
392 blob_zero(&sql);
393 blob_append(&sql, timeline_query_for_tty(), -1);
394 blob_append_sql(&sql, " AND blob.rid IN leaf");
395 if( showClosed ){
396 blob_append_sql(&sql," AND %z", leaf_is_closed_sql("blob.rid"));
397 }else if( !showAll ){
398 blob_append_sql(&sql," AND NOT %z", leaf_is_closed_sql("blob.rid"));
399 }
400 if( byBranch ){
401 db_prepare(&q, "%s ORDER BY nullif(branch,'trunk') COLLATE nocase,"
402 " event.mtime DESC",
403 blob_sql_text(&sql));
404 }else{
405 db_prepare(&q, "%s ORDER BY event.mtime DESC", blob_sql_text(&sql));
406 }
407 blob_reset(&sql);
408 n = 0;
409 while( db_step(&q)==SQLITE_ROW ){
410 const char *zId = db_column_text(&q, 1);
@@ -474,17 +474,17 @@
474 }else{
475 @ <h1>Open leaves:</h1>
476 }
477 blob_zero(&sql);
478 blob_append(&sql, timeline_query_for_www(), -1);
479 blob_append_sql(&sql, " AND blob.rid IN leaf");
480 if( showClosed ){
481 blob_append_sql(&sql," AND %z", leaf_is_closed_sql("blob.rid"));
482 }else if( !showAll ){
483 blob_append_sql(&sql," AND NOT %z", leaf_is_closed_sql("blob.rid"));
484 }
485 db_prepare(&q, "%s ORDER BY event.mtime DESC", blob_sql_text(&sql));
486 blob_reset(&sql);
487 www_print_timeline(&q, TIMELINE_LEAFONLY, 0, 0, 0);
488 db_finalize(&q);
489 @ <br />
490 style_footer();
@@ -508,11 +508,11 @@
508 Stmt q;
509 int rid;
510
511 bag_init(&seen);
512 bag_init(&pending);
513 db_prepare(&ins, "INSERT OR IGNORE INTO \"%w\" VALUES(:rid)", zTab);
514 db_prepare(&q, "SELECT mid FROM mlink WHERE fid=%d", fid);
515 while( db_step(&q)==SQLITE_ROW ){
516 int mid = db_column_int(&q, 0);
517 bag_insert(&pending, mid);
518 bag_insert(&seen, mid);
519
+11 -11
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -142,17 +142,17 @@
142142
Blob cmd; /* Text of command to run */
143143
144144
if( !fIncludeBinary ){
145145
Blob file2;
146146
if( isBin1 ){
147
- fossil_print(DIFF_CANNOT_COMPUTE_BINARY);
147
+ fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
148148
return;
149149
}
150150
if( zBinGlob ){
151151
Glob *pBinary = glob_create(zBinGlob);
152152
if( glob_match(pBinary, zName) ){
153
- fossil_print(DIFF_CANNOT_COMPUTE_BINARY);
153
+ fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
154154
glob_free(pBinary);
155155
return;
156156
}
157157
glob_free(pBinary);
158158
}
@@ -163,11 +163,11 @@
163163
}else{
164164
blob_read_from_file(&file2, zFile2);
165165
}
166166
}
167167
if( looks_like_binary(&file2) ){
168
- fossil_print(DIFF_CANNOT_COMPUTE_BINARY);
168
+ fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
169169
blob_reset(&file2);
170170
return;
171171
}
172172
blob_reset(&file2);
173173
}
@@ -238,17 +238,17 @@
238238
char zTemp1[300];
239239
char zTemp2[300];
240240
241241
if( !fIncludeBinary ){
242242
if( isBin1 || isBin2 ){
243
- fossil_print(DIFF_CANNOT_COMPUTE_BINARY);
243
+ fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
244244
return;
245245
}
246246
if( zBinGlob ){
247247
Glob *pBinary = glob_create(zBinGlob);
248248
if( glob_match(pBinary, zName) ){
249
- fossil_print(DIFF_CANNOT_COMPUTE_BINARY);
249
+ fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
250250
glob_free(pBinary);
251251
return;
252252
}
253253
glob_free(pBinary);
254254
}
@@ -302,11 +302,11 @@
302302
int isBin;
303303
file_tree_name(zFileTreeName, &fname, 1);
304304
historical_version_of_file(zFrom, blob_str(&fname), &content, &isLink, 0,
305305
fIncludeBinary ? 0 : &isBin, 0);
306306
if( !isLink != !file_wd_islink(zFrom) ){
307
- fossil_print(DIFF_CANNOT_COMPUTE_SYMLINK);
307
+ fossil_print("%s",DIFF_CANNOT_COMPUTE_SYMLINK);
308308
}else{
309309
diff_file(&content, isBin, zFileTreeName, zFileTreeName,
310310
zDiffCmd, zBinGlob, fIncludeBinary, diffFlags);
311311
}
312312
blob_reset(&content);
@@ -346,11 +346,11 @@
346346
int rid = name_to_typed_rid(zFrom, "ci");
347347
if( !is_a_version(rid) ){
348348
fossil_fatal("no such check-in: %s", zFrom);
349349
}
350350
load_vfile_from_rid(rid);
351
- blob_appendf(&sql,
351
+ blob_append_sql(&sql,
352352
"SELECT v2.pathname, v2.deleted, v2.chnged, v2.rid==0, v1.rid, v1.islink"
353353
" FROM vfile v1, vfile v2 "
354354
" WHERE v1.pathname=v2.pathname AND v1.vid=%d AND v2.vid=%d"
355355
" AND (v2.deleted OR v2.chnged OR v1.mrid!=v2.rid)"
356356
"UNION "
@@ -367,20 +367,20 @@
367367
" WHERE v1.vid=%d AND v1.pathname=v2.pathname)"
368368
" ORDER BY 1",
369369
rid, vid, rid, vid, vid, rid
370370
);
371371
}else{
372
- blob_appendf(&sql,
372
+ blob_append_sql(&sql,
373373
"SELECT pathname, deleted, chnged , rid==0, rid, islink"
374374
" FROM vfile"
375375
" WHERE vid=%d"
376376
" AND (deleted OR chnged OR rid==0)"
377377
" ORDER BY pathname",
378378
vid
379379
);
380380
}
381
- db_prepare(&q, blob_str(&sql));
381
+ db_prepare(&q, "%s", blob_sql_text(&sql));
382382
while( db_step(&q)==SQLITE_ROW ){
383383
const char *zPathname = db_column_text(&q,0);
384384
int isDeleted = db_column_int(&q, 1);
385385
int isChnged = db_column_int(&q,2);
386386
int isNew = db_column_int(&q,3);
@@ -408,11 +408,11 @@
408408
Blob content;
409409
int isBin;
410410
if( !isLink != !file_wd_islink(zFullName) ){
411411
diff_print_index(zPathname, diffFlags);
412412
diff_print_filenames(zPathname, zPathname, diffFlags);
413
- fossil_print(DIFF_CANNOT_COMPUTE_SYMLINK);
413
+ fossil_print("%s",DIFF_CANNOT_COMPUTE_SYMLINK);
414414
continue;
415415
}
416416
if( srcid>0 ){
417417
content_get(srcid, &content);
418418
}else{
@@ -462,11 +462,11 @@
462462
fIncludeBinary ? 0 : &isBin1, 0);
463463
historical_version_of_file(zTo, zName, &v2, &isLink2, 0,
464464
fIncludeBinary ? 0 : &isBin2, 0);
465465
if( isLink1 != isLink2 ){
466466
diff_print_filenames(zName, zName, diffFlags);
467
- fossil_print(DIFF_CANNOT_COMPUTE_SYMLINK);
467
+ fossil_print("%s",DIFF_CANNOT_COMPUTE_SYMLINK);
468468
}else{
469469
diff_file_mem(&v1, &v2, isBin1, isBin2, zName, zDiffCmd,
470470
zBinGlob, fIncludeBinary, diffFlags);
471471
}
472472
blob_reset(&v1);
473473
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -142,17 +142,17 @@
142 Blob cmd; /* Text of command to run */
143
144 if( !fIncludeBinary ){
145 Blob file2;
146 if( isBin1 ){
147 fossil_print(DIFF_CANNOT_COMPUTE_BINARY);
148 return;
149 }
150 if( zBinGlob ){
151 Glob *pBinary = glob_create(zBinGlob);
152 if( glob_match(pBinary, zName) ){
153 fossil_print(DIFF_CANNOT_COMPUTE_BINARY);
154 glob_free(pBinary);
155 return;
156 }
157 glob_free(pBinary);
158 }
@@ -163,11 +163,11 @@
163 }else{
164 blob_read_from_file(&file2, zFile2);
165 }
166 }
167 if( looks_like_binary(&file2) ){
168 fossil_print(DIFF_CANNOT_COMPUTE_BINARY);
169 blob_reset(&file2);
170 return;
171 }
172 blob_reset(&file2);
173 }
@@ -238,17 +238,17 @@
238 char zTemp1[300];
239 char zTemp2[300];
240
241 if( !fIncludeBinary ){
242 if( isBin1 || isBin2 ){
243 fossil_print(DIFF_CANNOT_COMPUTE_BINARY);
244 return;
245 }
246 if( zBinGlob ){
247 Glob *pBinary = glob_create(zBinGlob);
248 if( glob_match(pBinary, zName) ){
249 fossil_print(DIFF_CANNOT_COMPUTE_BINARY);
250 glob_free(pBinary);
251 return;
252 }
253 glob_free(pBinary);
254 }
@@ -302,11 +302,11 @@
302 int isBin;
303 file_tree_name(zFileTreeName, &fname, 1);
304 historical_version_of_file(zFrom, blob_str(&fname), &content, &isLink, 0,
305 fIncludeBinary ? 0 : &isBin, 0);
306 if( !isLink != !file_wd_islink(zFrom) ){
307 fossil_print(DIFF_CANNOT_COMPUTE_SYMLINK);
308 }else{
309 diff_file(&content, isBin, zFileTreeName, zFileTreeName,
310 zDiffCmd, zBinGlob, fIncludeBinary, diffFlags);
311 }
312 blob_reset(&content);
@@ -346,11 +346,11 @@
346 int rid = name_to_typed_rid(zFrom, "ci");
347 if( !is_a_version(rid) ){
348 fossil_fatal("no such check-in: %s", zFrom);
349 }
350 load_vfile_from_rid(rid);
351 blob_appendf(&sql,
352 "SELECT v2.pathname, v2.deleted, v2.chnged, v2.rid==0, v1.rid, v1.islink"
353 " FROM vfile v1, vfile v2 "
354 " WHERE v1.pathname=v2.pathname AND v1.vid=%d AND v2.vid=%d"
355 " AND (v2.deleted OR v2.chnged OR v1.mrid!=v2.rid)"
356 "UNION "
@@ -367,20 +367,20 @@
367 " WHERE v1.vid=%d AND v1.pathname=v2.pathname)"
368 " ORDER BY 1",
369 rid, vid, rid, vid, vid, rid
370 );
371 }else{
372 blob_appendf(&sql,
373 "SELECT pathname, deleted, chnged , rid==0, rid, islink"
374 " FROM vfile"
375 " WHERE vid=%d"
376 " AND (deleted OR chnged OR rid==0)"
377 " ORDER BY pathname",
378 vid
379 );
380 }
381 db_prepare(&q, blob_str(&sql));
382 while( db_step(&q)==SQLITE_ROW ){
383 const char *zPathname = db_column_text(&q,0);
384 int isDeleted = db_column_int(&q, 1);
385 int isChnged = db_column_int(&q,2);
386 int isNew = db_column_int(&q,3);
@@ -408,11 +408,11 @@
408 Blob content;
409 int isBin;
410 if( !isLink != !file_wd_islink(zFullName) ){
411 diff_print_index(zPathname, diffFlags);
412 diff_print_filenames(zPathname, zPathname, diffFlags);
413 fossil_print(DIFF_CANNOT_COMPUTE_SYMLINK);
414 continue;
415 }
416 if( srcid>0 ){
417 content_get(srcid, &content);
418 }else{
@@ -462,11 +462,11 @@
462 fIncludeBinary ? 0 : &isBin1, 0);
463 historical_version_of_file(zTo, zName, &v2, &isLink2, 0,
464 fIncludeBinary ? 0 : &isBin2, 0);
465 if( isLink1 != isLink2 ){
466 diff_print_filenames(zName, zName, diffFlags);
467 fossil_print(DIFF_CANNOT_COMPUTE_SYMLINK);
468 }else{
469 diff_file_mem(&v1, &v2, isBin1, isBin2, zName, zDiffCmd,
470 zBinGlob, fIncludeBinary, diffFlags);
471 }
472 blob_reset(&v1);
473
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -142,17 +142,17 @@
142 Blob cmd; /* Text of command to run */
143
144 if( !fIncludeBinary ){
145 Blob file2;
146 if( isBin1 ){
147 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
148 return;
149 }
150 if( zBinGlob ){
151 Glob *pBinary = glob_create(zBinGlob);
152 if( glob_match(pBinary, zName) ){
153 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
154 glob_free(pBinary);
155 return;
156 }
157 glob_free(pBinary);
158 }
@@ -163,11 +163,11 @@
163 }else{
164 blob_read_from_file(&file2, zFile2);
165 }
166 }
167 if( looks_like_binary(&file2) ){
168 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
169 blob_reset(&file2);
170 return;
171 }
172 blob_reset(&file2);
173 }
@@ -238,17 +238,17 @@
238 char zTemp1[300];
239 char zTemp2[300];
240
241 if( !fIncludeBinary ){
242 if( isBin1 || isBin2 ){
243 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
244 return;
245 }
246 if( zBinGlob ){
247 Glob *pBinary = glob_create(zBinGlob);
248 if( glob_match(pBinary, zName) ){
249 fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
250 glob_free(pBinary);
251 return;
252 }
253 glob_free(pBinary);
254 }
@@ -302,11 +302,11 @@
302 int isBin;
303 file_tree_name(zFileTreeName, &fname, 1);
304 historical_version_of_file(zFrom, blob_str(&fname), &content, &isLink, 0,
305 fIncludeBinary ? 0 : &isBin, 0);
306 if( !isLink != !file_wd_islink(zFrom) ){
307 fossil_print("%s",DIFF_CANNOT_COMPUTE_SYMLINK);
308 }else{
309 diff_file(&content, isBin, zFileTreeName, zFileTreeName,
310 zDiffCmd, zBinGlob, fIncludeBinary, diffFlags);
311 }
312 blob_reset(&content);
@@ -346,11 +346,11 @@
346 int rid = name_to_typed_rid(zFrom, "ci");
347 if( !is_a_version(rid) ){
348 fossil_fatal("no such check-in: %s", zFrom);
349 }
350 load_vfile_from_rid(rid);
351 blob_append_sql(&sql,
352 "SELECT v2.pathname, v2.deleted, v2.chnged, v2.rid==0, v1.rid, v1.islink"
353 " FROM vfile v1, vfile v2 "
354 " WHERE v1.pathname=v2.pathname AND v1.vid=%d AND v2.vid=%d"
355 " AND (v2.deleted OR v2.chnged OR v1.mrid!=v2.rid)"
356 "UNION "
@@ -367,20 +367,20 @@
367 " WHERE v1.vid=%d AND v1.pathname=v2.pathname)"
368 " ORDER BY 1",
369 rid, vid, rid, vid, vid, rid
370 );
371 }else{
372 blob_append_sql(&sql,
373 "SELECT pathname, deleted, chnged , rid==0, rid, islink"
374 " FROM vfile"
375 " WHERE vid=%d"
376 " AND (deleted OR chnged OR rid==0)"
377 " ORDER BY pathname",
378 vid
379 );
380 }
381 db_prepare(&q, "%s", blob_sql_text(&sql));
382 while( db_step(&q)==SQLITE_ROW ){
383 const char *zPathname = db_column_text(&q,0);
384 int isDeleted = db_column_int(&q, 1);
385 int isChnged = db_column_int(&q,2);
386 int isNew = db_column_int(&q,3);
@@ -408,11 +408,11 @@
408 Blob content;
409 int isBin;
410 if( !isLink != !file_wd_islink(zFullName) ){
411 diff_print_index(zPathname, diffFlags);
412 diff_print_filenames(zPathname, zPathname, diffFlags);
413 fossil_print("%s",DIFF_CANNOT_COMPUTE_SYMLINK);
414 continue;
415 }
416 if( srcid>0 ){
417 content_get(srcid, &content);
418 }else{
@@ -462,11 +462,11 @@
462 fIncludeBinary ? 0 : &isBin1, 0);
463 historical_version_of_file(zTo, zName, &v2, &isLink2, 0,
464 fIncludeBinary ? 0 : &isBin2, 0);
465 if( isLink1 != isLink2 ){
466 diff_print_filenames(zName, zName, diffFlags);
467 fossil_print("%s",DIFF_CANNOT_COMPUTE_SYMLINK);
468 }else{
469 diff_file_mem(&v1, &v2, isBin1, isBin2, zName, zDiffCmd,
470 zBinGlob, fIncludeBinary, diffFlags);
471 }
472 blob_reset(&v1);
473
+69 -71
--- src/doc.c
+++ src/doc.c
@@ -26,11 +26,11 @@
2626
** Try to guess the mimetype from content.
2727
**
2828
** If the content is pure text, return NULL.
2929
**
3030
** For image types, attempt to return an appropriate mimetype
31
-** name like "image/gif" or "image/jpeg".
31
+** name like "image/gif" or "image/jpeg".
3232
**
3333
** For any other binary type, return "unknown/unknown".
3434
*/
3535
const char *mimetype_from_content(Blob *pBlob){
3636
int i;
@@ -83,11 +83,11 @@
8383
int i;
8484
int first, last;
8585
int len;
8686
char zSuffix[20];
8787
88
- /* A table of mimetypes based on file suffixes.
88
+ /* A table of mimetypes based on file suffixes.
8989
** Suffixes must be in sorted order so that we can do a binary
9090
** search to find the mime-type
9191
*/
9292
static const struct {
9393
const char *zSuffix; /* The file suffix */
@@ -487,11 +487,11 @@
487487
db_end_transaction(0);
488488
}
489489
blob_to_utf8_no_bom(&filebody, 0);
490490
491491
/* The file is now contained in the filebody blob. Deliver the
492
- ** file to the user
492
+ ** file to the user
493493
*/
494494
zMime = P("mimetype");
495495
if( zMime==0 ){
496496
zMime = mimetype_from_name(zName);
497497
}
@@ -501,11 +501,11 @@
501501
Th_Store("doc_date", db_text(0, "SELECT datetime(mtime) FROM event"
502502
" WHERE objid=%d AND type='ci'", vid));
503503
if( fossil_strcmp(zMime, "text/x-fossil-wiki")==0 ){
504504
Blob title, tail;
505505
if( wiki_find_title(&filebody, &title, &tail) ){
506
- style_header(blob_str(&title));
506
+ style_header("%s", blob_str(&title));
507507
wiki_convert(&tail, 0, WIKI_BUTTONS);
508508
}else{
509509
style_header("Documentation");
510510
wiki_convert(&filebody, 0, WIKI_BUTTONS);
511511
}
@@ -513,11 +513,11 @@
513513
}else if( fossil_strcmp(zMime, "text/x-markdown")==0 ){
514514
Blob title = BLOB_INITIALIZER;
515515
Blob tail = BLOB_INITIALIZER;
516516
markdown_to_html(&filebody, &title, &tail);
517517
if( blob_size(&title)>0 ){
518
- style_header(blob_str(&title));
518
+ style_header("%s", blob_str(&title));
519519
}else{
520520
style_header("Documentation");
521521
}
522522
blob_append(cgi_output_blob(), blob_buffer(&tail), blob_size(&tail));
523523
style_footer();
@@ -528,15 +528,13 @@
528528
@ </pre></blockquote>
529529
style_footer();
530530
#ifdef FOSSIL_ENABLE_TH1_DOCS
531531
}else if( db_get_boolean("th1-docs", 0) &&
532532
fossil_strcmp(zMime, "application/x-th1")==0 ){
533
- char *zHtml = htmlize(zName, -1);
534
- style_header(zHtml);
533
+ style_header("%h", zName);
535534
Th_Render(blob_str(&filebody));
536535
style_footer();
537
- fossil_free(zHtml);
538536
#endif
539537
}else{
540538
cgi_set_content_type(zMime);
541539
cgi_set_content(&filebody);
542540
}
@@ -546,79 +544,79 @@
546544
/* Jump here when unable to locate the document */
547545
db_end_transaction(0);
548546
style_header("Document Not Found");
549547
@ <p>No such document: %h(zName)</p>
550548
style_footer();
551
- return;
549
+ return;
552550
}
553551
554552
/*
555553
** The default logo.
556554
*/
557555
static const unsigned char aLogo[] = {
558
- 71, 73, 70, 56, 55, 97, 62, 0, 71, 0, 244, 0, 0, 85,
559
- 129, 149, 95, 136, 155, 99, 139, 157, 106, 144, 162, 113, 150, 166,
560
- 116, 152, 168, 127, 160, 175, 138, 168, 182, 148, 176, 188, 159, 184,
561
- 195, 170, 192, 202, 180, 199, 208, 184, 202, 210, 191, 207, 215, 201,
562
- 215, 221, 212, 223, 228, 223, 231, 235, 226, 227, 226, 226, 234, 237,
563
- 233, 239, 241, 240, 244, 246, 244, 247, 248, 255, 255, 255, 0, 0,
564
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
565
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0,
566
- 0, 0, 62, 0, 71, 0, 0, 5, 255, 96, 100, 141, 100, 105,
567
- 158, 168, 37, 41, 132, 192, 164, 112, 44, 207, 102, 99, 0, 56,
568
- 16, 84, 116, 239, 199, 141, 65, 110, 232, 248, 25, 141, 193, 161,
569
- 82, 113, 108, 202, 32, 55, 229, 210, 73, 61, 41, 164, 88, 102,
570
- 181, 10, 41, 96, 179, 91, 106, 35, 240, 5, 135, 143, 137, 242,
571
- 87, 123, 246, 33, 190, 81, 108, 163, 237, 198, 14, 30, 113, 233,
572
- 131, 78, 115, 72, 11, 115, 87, 101, 19, 124, 51, 66, 74, 8,
573
- 19, 16, 67, 100, 74, 133, 50, 15, 101, 135, 56, 11, 74, 6,
574
- 143, 49, 126, 106, 56, 8, 145, 67, 9, 152, 48, 139, 155, 5,
575
- 22, 13, 74, 115, 161, 41, 147, 101, 13, 130, 57, 132, 170, 40,
576
- 167, 155, 0, 94, 57, 3, 178, 48, 183, 181, 57, 160, 186, 40,
577
- 19, 141, 189, 0, 69, 192, 40, 16, 195, 155, 185, 199, 41, 201,
578
- 189, 191, 205, 193, 188, 131, 210, 49, 175, 88, 209, 214, 38, 19,
579
- 3, 11, 19, 111, 127, 60, 219, 39, 55, 204, 19, 11, 6, 100,
580
- 5, 10, 227, 228, 37, 163, 0, 239, 117, 56, 238, 243, 49, 195,
581
- 177, 247, 48, 158, 56, 251, 50, 216, 254, 197, 56, 128, 107, 158,
582
- 2, 125, 171, 114, 92, 218, 246, 96, 66, 3, 4, 50, 134, 176,
583
- 145, 6, 97, 64, 144, 24, 19, 136, 108, 91, 177, 160, 0, 194,
584
- 19, 253, 0, 216, 107, 214, 224, 192, 129, 5, 16, 83, 255, 244,
585
- 43, 213, 195, 24, 159, 27, 169, 64, 230, 88, 208, 227, 129, 182,
586
- 54, 4, 89, 158, 24, 181, 163, 199, 1, 155, 52, 233, 8, 130,
587
- 176, 83, 24, 128, 137, 50, 18, 32, 48, 48, 114, 11, 173, 137,
588
- 19, 110, 4, 64, 105, 1, 194, 30, 140, 68, 15, 24, 24, 224,
589
- 50, 76, 70, 0, 11, 171, 54, 26, 160, 181, 194, 149, 148, 40,
590
- 174, 148, 122, 64, 180, 208, 161, 17, 207, 112, 164, 1, 128, 96,
591
- 148, 78, 18, 21, 194, 33, 229, 51, 247, 65, 133, 97, 5, 250,
592
- 69, 229, 100, 34, 220, 128, 166, 116, 190, 62, 8, 167, 195, 170,
593
- 47, 163, 0, 130, 90, 152, 11, 160, 173, 170, 27, 154, 26, 91,
594
- 232, 151, 171, 18, 14, 162, 253, 98, 170, 18, 70, 171, 64, 219,
595
- 10, 67, 136, 134, 187, 116, 75, 180, 46, 179, 174, 135, 4, 189,
596
- 229, 231, 78, 40, 10, 62, 226, 164, 172, 64, 240, 167, 170, 10,
597
- 18, 124, 188, 10, 107, 65, 193, 94, 11, 93, 171, 28, 248, 17,
598
- 239, 46, 140, 78, 97, 34, 25, 153, 36, 99, 65, 130, 7, 203,
599
- 183, 168, 51, 34, 136, 25, 140, 10, 6, 16, 28, 255, 145, 241,
600
- 230, 140, 10, 66, 178, 167, 112, 48, 192, 128, 129, 9, 31, 141,
601
- 84, 138, 63, 163, 162, 2, 203, 206, 240, 56, 55, 98, 192, 188,
602
- 15, 185, 50, 160, 6, 0, 125, 62, 33, 214, 195, 33, 5, 24,
603
- 184, 25, 231, 14, 201, 245, 144, 23, 126, 104, 228, 0, 145, 2,
604
- 13, 140, 244, 212, 17, 21, 20, 176, 159, 17, 95, 225, 160, 128,
605
- 16, 1, 32, 224, 142, 32, 227, 125, 87, 64, 0, 16, 54, 129,
606
- 205, 2, 141, 76, 53, 130, 103, 37, 166, 64, 144, 107, 78, 196,
607
- 5, 192, 0, 54, 50, 229, 9, 141, 49, 84, 194, 35, 12, 196,
608
- 153, 48, 192, 137, 57, 84, 24, 7, 87, 159, 249, 240, 215, 143,
609
- 105, 241, 118, 149, 9, 139, 4, 64, 203, 141, 35, 140, 129, 131,
610
- 16, 222, 125, 231, 128, 2, 238, 17, 152, 66, 3, 5, 56, 224,
611
- 159, 103, 16, 76, 25, 75, 5, 11, 164, 215, 96, 9, 14, 16,
612
- 36, 225, 15, 11, 40, 144, 192, 156, 41, 10, 178, 199, 3, 66,
613
- 64, 80, 193, 3, 124, 90, 48, 129, 129, 102, 177, 18, 192, 154,
614
- 49, 84, 240, 208, 92, 22, 149, 96, 39, 9, 31, 74, 17, 94,
615
- 3, 8, 177, 199, 72, 59, 85, 76, 25, 216, 8, 139, 194, 197,
616
- 138, 163, 69, 96, 115, 0, 147, 72, 72, 84, 28, 14, 79, 86,
617
- 233, 230, 23, 113, 26, 160, 128, 3, 10, 58, 129, 103, 14, 159,
618
- 214, 163, 146, 117, 238, 213, 154, 128, 151, 109, 84, 64, 217, 13,
619
- 27, 10, 228, 39, 2, 235, 164, 168, 74, 8, 0, 59,
556
+ 71, 73, 70, 56, 55, 97, 62, 0, 71, 0, 244, 0, 0, 85,
557
+ 129, 149, 95, 136, 155, 99, 139, 157, 106, 144, 162, 113, 150, 166,
558
+ 116, 152, 168, 127, 160, 175, 138, 168, 182, 148, 176, 188, 159, 184,
559
+ 195, 170, 192, 202, 180, 199, 208, 184, 202, 210, 191, 207, 215, 201,
560
+ 215, 221, 212, 223, 228, 223, 231, 235, 226, 227, 226, 226, 234, 237,
561
+ 233, 239, 241, 240, 244, 246, 244, 247, 248, 255, 255, 255, 0, 0,
562
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
563
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0,
564
+ 0, 0, 62, 0, 71, 0, 0, 5, 255, 96, 100, 141, 100, 105,
565
+ 158, 168, 37, 41, 132, 192, 164, 112, 44, 207, 102, 99, 0, 56,
566
+ 16, 84, 116, 239, 199, 141, 65, 110, 232, 248, 25, 141, 193, 161,
567
+ 82, 113, 108, 202, 32, 55, 229, 210, 73, 61, 41, 164, 88, 102,
568
+ 181, 10, 41, 96, 179, 91, 106, 35, 240, 5, 135, 143, 137, 242,
569
+ 87, 123, 246, 33, 190, 81, 108, 163, 237, 198, 14, 30, 113, 233,
570
+ 131, 78, 115, 72, 11, 115, 87, 101, 19, 124, 51, 66, 74, 8,
571
+ 19, 16, 67, 100, 74, 133, 50, 15, 101, 135, 56, 11, 74, 6,
572
+ 143, 49, 126, 106, 56, 8, 145, 67, 9, 152, 48, 139, 155, 5,
573
+ 22, 13, 74, 115, 161, 41, 147, 101, 13, 130, 57, 132, 170, 40,
574
+ 167, 155, 0, 94, 57, 3, 178, 48, 183, 181, 57, 160, 186, 40,
575
+ 19, 141, 189, 0, 69, 192, 40, 16, 195, 155, 185, 199, 41, 201,
576
+ 189, 191, 205, 193, 188, 131, 210, 49, 175, 88, 209, 214, 38, 19,
577
+ 3, 11, 19, 111, 127, 60, 219, 39, 55, 204, 19, 11, 6, 100,
578
+ 5, 10, 227, 228, 37, 163, 0, 239, 117, 56, 238, 243, 49, 195,
579
+ 177, 247, 48, 158, 56, 251, 50, 216, 254, 197, 56, 128, 107, 158,
580
+ 2, 125, 171, 114, 92, 218, 246, 96, 66, 3, 4, 50, 134, 176,
581
+ 145, 6, 97, 64, 144, 24, 19, 136, 108, 91, 177, 160, 0, 194,
582
+ 19, 253, 0, 216, 107, 214, 224, 192, 129, 5, 16, 83, 255, 244,
583
+ 43, 213, 195, 24, 159, 27, 169, 64, 230, 88, 208, 227, 129, 182,
584
+ 54, 4, 89, 158, 24, 181, 163, 199, 1, 155, 52, 233, 8, 130,
585
+ 176, 83, 24, 128, 137, 50, 18, 32, 48, 48, 114, 11, 173, 137,
586
+ 19, 110, 4, 64, 105, 1, 194, 30, 140, 68, 15, 24, 24, 224,
587
+ 50, 76, 70, 0, 11, 171, 54, 26, 160, 181, 194, 149, 148, 40,
588
+ 174, 148, 122, 64, 180, 208, 161, 17, 207, 112, 164, 1, 128, 96,
589
+ 148, 78, 18, 21, 194, 33, 229, 51, 247, 65, 133, 97, 5, 250,
590
+ 69, 229, 100, 34, 220, 128, 166, 116, 190, 62, 8, 167, 195, 170,
591
+ 47, 163, 0, 130, 90, 152, 11, 160, 173, 170, 27, 154, 26, 91,
592
+ 232, 151, 171, 18, 14, 162, 253, 98, 170, 18, 70, 171, 64, 219,
593
+ 10, 67, 136, 134, 187, 116, 75, 180, 46, 179, 174, 135, 4, 189,
594
+ 229, 231, 78, 40, 10, 62, 226, 164, 172, 64, 240, 167, 170, 10,
595
+ 18, 124, 188, 10, 107, 65, 193, 94, 11, 93, 171, 28, 248, 17,
596
+ 239, 46, 140, 78, 97, 34, 25, 153, 36, 99, 65, 130, 7, 203,
597
+ 183, 168, 51, 34, 136, 25, 140, 10, 6, 16, 28, 255, 145, 241,
598
+ 230, 140, 10, 66, 178, 167, 112, 48, 192, 128, 129, 9, 31, 141,
599
+ 84, 138, 63, 163, 162, 2, 203, 206, 240, 56, 55, 98, 192, 188,
600
+ 15, 185, 50, 160, 6, 0, 125, 62, 33, 214, 195, 33, 5, 24,
601
+ 184, 25, 231, 14, 201, 245, 144, 23, 126, 104, 228, 0, 145, 2,
602
+ 13, 140, 244, 212, 17, 21, 20, 176, 159, 17, 95, 225, 160, 128,
603
+ 16, 1, 32, 224, 142, 32, 227, 125, 87, 64, 0, 16, 54, 129,
604
+ 205, 2, 141, 76, 53, 130, 103, 37, 166, 64, 144, 107, 78, 196,
605
+ 5, 192, 0, 54, 50, 229, 9, 141, 49, 84, 194, 35, 12, 196,
606
+ 153, 48, 192, 137, 57, 84, 24, 7, 87, 159, 249, 240, 215, 143,
607
+ 105, 241, 118, 149, 9, 139, 4, 64, 203, 141, 35, 140, 129, 131,
608
+ 16, 222, 125, 231, 128, 2, 238, 17, 152, 66, 3, 5, 56, 224,
609
+ 159, 103, 16, 76, 25, 75, 5, 11, 164, 215, 96, 9, 14, 16,
610
+ 36, 225, 15, 11, 40, 144, 192, 156, 41, 10, 178, 199, 3, 66,
611
+ 64, 80, 193, 3, 124, 90, 48, 129, 129, 102, 177, 18, 192, 154,
612
+ 49, 84, 240, 208, 92, 22, 149, 96, 39, 9, 31, 74, 17, 94,
613
+ 3, 8, 177, 199, 72, 59, 85, 76, 25, 216, 8, 139, 194, 197,
614
+ 138, 163, 69, 96, 115, 0, 147, 72, 72, 84, 28, 14, 79, 86,
615
+ 233, 230, 23, 113, 26, 160, 128, 3, 10, 58, 129, 103, 14, 159,
616
+ 214, 163, 146, 117, 238, 213, 154, 128, 151, 109, 84, 64, 217, 13,
617
+ 27, 10, 228, 39, 2, 235, 164, 168, 74, 8, 0, 59,
620618
};
621619
622620
/*
623621
** WEBPAGE: logo
624622
**
625623
--- src/doc.c
+++ src/doc.c
@@ -26,11 +26,11 @@
26 ** Try to guess the mimetype from content.
27 **
28 ** If the content is pure text, return NULL.
29 **
30 ** For image types, attempt to return an appropriate mimetype
31 ** name like "image/gif" or "image/jpeg".
32 **
33 ** For any other binary type, return "unknown/unknown".
34 */
35 const char *mimetype_from_content(Blob *pBlob){
36 int i;
@@ -83,11 +83,11 @@
83 int i;
84 int first, last;
85 int len;
86 char zSuffix[20];
87
88 /* A table of mimetypes based on file suffixes.
89 ** Suffixes must be in sorted order so that we can do a binary
90 ** search to find the mime-type
91 */
92 static const struct {
93 const char *zSuffix; /* The file suffix */
@@ -487,11 +487,11 @@
487 db_end_transaction(0);
488 }
489 blob_to_utf8_no_bom(&filebody, 0);
490
491 /* The file is now contained in the filebody blob. Deliver the
492 ** file to the user
493 */
494 zMime = P("mimetype");
495 if( zMime==0 ){
496 zMime = mimetype_from_name(zName);
497 }
@@ -501,11 +501,11 @@
501 Th_Store("doc_date", db_text(0, "SELECT datetime(mtime) FROM event"
502 " WHERE objid=%d AND type='ci'", vid));
503 if( fossil_strcmp(zMime, "text/x-fossil-wiki")==0 ){
504 Blob title, tail;
505 if( wiki_find_title(&filebody, &title, &tail) ){
506 style_header(blob_str(&title));
507 wiki_convert(&tail, 0, WIKI_BUTTONS);
508 }else{
509 style_header("Documentation");
510 wiki_convert(&filebody, 0, WIKI_BUTTONS);
511 }
@@ -513,11 +513,11 @@
513 }else if( fossil_strcmp(zMime, "text/x-markdown")==0 ){
514 Blob title = BLOB_INITIALIZER;
515 Blob tail = BLOB_INITIALIZER;
516 markdown_to_html(&filebody, &title, &tail);
517 if( blob_size(&title)>0 ){
518 style_header(blob_str(&title));
519 }else{
520 style_header("Documentation");
521 }
522 blob_append(cgi_output_blob(), blob_buffer(&tail), blob_size(&tail));
523 style_footer();
@@ -528,15 +528,13 @@
528 @ </pre></blockquote>
529 style_footer();
530 #ifdef FOSSIL_ENABLE_TH1_DOCS
531 }else if( db_get_boolean("th1-docs", 0) &&
532 fossil_strcmp(zMime, "application/x-th1")==0 ){
533 char *zHtml = htmlize(zName, -1);
534 style_header(zHtml);
535 Th_Render(blob_str(&filebody));
536 style_footer();
537 fossil_free(zHtml);
538 #endif
539 }else{
540 cgi_set_content_type(zMime);
541 cgi_set_content(&filebody);
542 }
@@ -546,79 +544,79 @@
546 /* Jump here when unable to locate the document */
547 db_end_transaction(0);
548 style_header("Document Not Found");
549 @ <p>No such document: %h(zName)</p>
550 style_footer();
551 return;
552 }
553
554 /*
555 ** The default logo.
556 */
557 static const unsigned char aLogo[] = {
558 71, 73, 70, 56, 55, 97, 62, 0, 71, 0, 244, 0, 0, 85,
559 129, 149, 95, 136, 155, 99, 139, 157, 106, 144, 162, 113, 150, 166,
560 116, 152, 168, 127, 160, 175, 138, 168, 182, 148, 176, 188, 159, 184,
561 195, 170, 192, 202, 180, 199, 208, 184, 202, 210, 191, 207, 215, 201,
562 215, 221, 212, 223, 228, 223, 231, 235, 226, 227, 226, 226, 234, 237,
563 233, 239, 241, 240, 244, 246, 244, 247, 248, 255, 255, 255, 0, 0,
564 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
565 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0,
566 0, 0, 62, 0, 71, 0, 0, 5, 255, 96, 100, 141, 100, 105,
567 158, 168, 37, 41, 132, 192, 164, 112, 44, 207, 102, 99, 0, 56,
568 16, 84, 116, 239, 199, 141, 65, 110, 232, 248, 25, 141, 193, 161,
569 82, 113, 108, 202, 32, 55, 229, 210, 73, 61, 41, 164, 88, 102,
570 181, 10, 41, 96, 179, 91, 106, 35, 240, 5, 135, 143, 137, 242,
571 87, 123, 246, 33, 190, 81, 108, 163, 237, 198, 14, 30, 113, 233,
572 131, 78, 115, 72, 11, 115, 87, 101, 19, 124, 51, 66, 74, 8,
573 19, 16, 67, 100, 74, 133, 50, 15, 101, 135, 56, 11, 74, 6,
574 143, 49, 126, 106, 56, 8, 145, 67, 9, 152, 48, 139, 155, 5,
575 22, 13, 74, 115, 161, 41, 147, 101, 13, 130, 57, 132, 170, 40,
576 167, 155, 0, 94, 57, 3, 178, 48, 183, 181, 57, 160, 186, 40,
577 19, 141, 189, 0, 69, 192, 40, 16, 195, 155, 185, 199, 41, 201,
578 189, 191, 205, 193, 188, 131, 210, 49, 175, 88, 209, 214, 38, 19,
579 3, 11, 19, 111, 127, 60, 219, 39, 55, 204, 19, 11, 6, 100,
580 5, 10, 227, 228, 37, 163, 0, 239, 117, 56, 238, 243, 49, 195,
581 177, 247, 48, 158, 56, 251, 50, 216, 254, 197, 56, 128, 107, 158,
582 2, 125, 171, 114, 92, 218, 246, 96, 66, 3, 4, 50, 134, 176,
583 145, 6, 97, 64, 144, 24, 19, 136, 108, 91, 177, 160, 0, 194,
584 19, 253, 0, 216, 107, 214, 224, 192, 129, 5, 16, 83, 255, 244,
585 43, 213, 195, 24, 159, 27, 169, 64, 230, 88, 208, 227, 129, 182,
586 54, 4, 89, 158, 24, 181, 163, 199, 1, 155, 52, 233, 8, 130,
587 176, 83, 24, 128, 137, 50, 18, 32, 48, 48, 114, 11, 173, 137,
588 19, 110, 4, 64, 105, 1, 194, 30, 140, 68, 15, 24, 24, 224,
589 50, 76, 70, 0, 11, 171, 54, 26, 160, 181, 194, 149, 148, 40,
590 174, 148, 122, 64, 180, 208, 161, 17, 207, 112, 164, 1, 128, 96,
591 148, 78, 18, 21, 194, 33, 229, 51, 247, 65, 133, 97, 5, 250,
592 69, 229, 100, 34, 220, 128, 166, 116, 190, 62, 8, 167, 195, 170,
593 47, 163, 0, 130, 90, 152, 11, 160, 173, 170, 27, 154, 26, 91,
594 232, 151, 171, 18, 14, 162, 253, 98, 170, 18, 70, 171, 64, 219,
595 10, 67, 136, 134, 187, 116, 75, 180, 46, 179, 174, 135, 4, 189,
596 229, 231, 78, 40, 10, 62, 226, 164, 172, 64, 240, 167, 170, 10,
597 18, 124, 188, 10, 107, 65, 193, 94, 11, 93, 171, 28, 248, 17,
598 239, 46, 140, 78, 97, 34, 25, 153, 36, 99, 65, 130, 7, 203,
599 183, 168, 51, 34, 136, 25, 140, 10, 6, 16, 28, 255, 145, 241,
600 230, 140, 10, 66, 178, 167, 112, 48, 192, 128, 129, 9, 31, 141,
601 84, 138, 63, 163, 162, 2, 203, 206, 240, 56, 55, 98, 192, 188,
602 15, 185, 50, 160, 6, 0, 125, 62, 33, 214, 195, 33, 5, 24,
603 184, 25, 231, 14, 201, 245, 144, 23, 126, 104, 228, 0, 145, 2,
604 13, 140, 244, 212, 17, 21, 20, 176, 159, 17, 95, 225, 160, 128,
605 16, 1, 32, 224, 142, 32, 227, 125, 87, 64, 0, 16, 54, 129,
606 205, 2, 141, 76, 53, 130, 103, 37, 166, 64, 144, 107, 78, 196,
607 5, 192, 0, 54, 50, 229, 9, 141, 49, 84, 194, 35, 12, 196,
608 153, 48, 192, 137, 57, 84, 24, 7, 87, 159, 249, 240, 215, 143,
609 105, 241, 118, 149, 9, 139, 4, 64, 203, 141, 35, 140, 129, 131,
610 16, 222, 125, 231, 128, 2, 238, 17, 152, 66, 3, 5, 56, 224,
611 159, 103, 16, 76, 25, 75, 5, 11, 164, 215, 96, 9, 14, 16,
612 36, 225, 15, 11, 40, 144, 192, 156, 41, 10, 178, 199, 3, 66,
613 64, 80, 193, 3, 124, 90, 48, 129, 129, 102, 177, 18, 192, 154,
614 49, 84, 240, 208, 92, 22, 149, 96, 39, 9, 31, 74, 17, 94,
615 3, 8, 177, 199, 72, 59, 85, 76, 25, 216, 8, 139, 194, 197,
616 138, 163, 69, 96, 115, 0, 147, 72, 72, 84, 28, 14, 79, 86,
617 233, 230, 23, 113, 26, 160, 128, 3, 10, 58, 129, 103, 14, 159,
618 214, 163, 146, 117, 238, 213, 154, 128, 151, 109, 84, 64, 217, 13,
619 27, 10, 228, 39, 2, 235, 164, 168, 74, 8, 0, 59,
620 };
621
622 /*
623 ** WEBPAGE: logo
624 **
625
--- src/doc.c
+++ src/doc.c
@@ -26,11 +26,11 @@
26 ** Try to guess the mimetype from content.
27 **
28 ** If the content is pure text, return NULL.
29 **
30 ** For image types, attempt to return an appropriate mimetype
31 ** name like "image/gif" or "image/jpeg".
32 **
33 ** For any other binary type, return "unknown/unknown".
34 */
35 const char *mimetype_from_content(Blob *pBlob){
36 int i;
@@ -83,11 +83,11 @@
83 int i;
84 int first, last;
85 int len;
86 char zSuffix[20];
87
88 /* A table of mimetypes based on file suffixes.
89 ** Suffixes must be in sorted order so that we can do a binary
90 ** search to find the mime-type
91 */
92 static const struct {
93 const char *zSuffix; /* The file suffix */
@@ -487,11 +487,11 @@
487 db_end_transaction(0);
488 }
489 blob_to_utf8_no_bom(&filebody, 0);
490
491 /* The file is now contained in the filebody blob. Deliver the
492 ** file to the user
493 */
494 zMime = P("mimetype");
495 if( zMime==0 ){
496 zMime = mimetype_from_name(zName);
497 }
@@ -501,11 +501,11 @@
501 Th_Store("doc_date", db_text(0, "SELECT datetime(mtime) FROM event"
502 " WHERE objid=%d AND type='ci'", vid));
503 if( fossil_strcmp(zMime, "text/x-fossil-wiki")==0 ){
504 Blob title, tail;
505 if( wiki_find_title(&filebody, &title, &tail) ){
506 style_header("%s", blob_str(&title));
507 wiki_convert(&tail, 0, WIKI_BUTTONS);
508 }else{
509 style_header("Documentation");
510 wiki_convert(&filebody, 0, WIKI_BUTTONS);
511 }
@@ -513,11 +513,11 @@
513 }else if( fossil_strcmp(zMime, "text/x-markdown")==0 ){
514 Blob title = BLOB_INITIALIZER;
515 Blob tail = BLOB_INITIALIZER;
516 markdown_to_html(&filebody, &title, &tail);
517 if( blob_size(&title)>0 ){
518 style_header("%s", blob_str(&title));
519 }else{
520 style_header("Documentation");
521 }
522 blob_append(cgi_output_blob(), blob_buffer(&tail), blob_size(&tail));
523 style_footer();
@@ -528,15 +528,13 @@
528 @ </pre></blockquote>
529 style_footer();
530 #ifdef FOSSIL_ENABLE_TH1_DOCS
531 }else if( db_get_boolean("th1-docs", 0) &&
532 fossil_strcmp(zMime, "application/x-th1")==0 ){
533 style_header("%h", zName);
 
534 Th_Render(blob_str(&filebody));
535 style_footer();
 
536 #endif
537 }else{
538 cgi_set_content_type(zMime);
539 cgi_set_content(&filebody);
540 }
@@ -546,79 +544,79 @@
544 /* Jump here when unable to locate the document */
545 db_end_transaction(0);
546 style_header("Document Not Found");
547 @ <p>No such document: %h(zName)</p>
548 style_footer();
549 return;
550 }
551
552 /*
553 ** The default logo.
554 */
555 static const unsigned char aLogo[] = {
556 71, 73, 70, 56, 55, 97, 62, 0, 71, 0, 244, 0, 0, 85,
557 129, 149, 95, 136, 155, 99, 139, 157, 106, 144, 162, 113, 150, 166,
558 116, 152, 168, 127, 160, 175, 138, 168, 182, 148, 176, 188, 159, 184,
559 195, 170, 192, 202, 180, 199, 208, 184, 202, 210, 191, 207, 215, 201,
560 215, 221, 212, 223, 228, 223, 231, 235, 226, 227, 226, 226, 234, 237,
561 233, 239, 241, 240, 244, 246, 244, 247, 248, 255, 255, 255, 0, 0,
562 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
563 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0,
564 0, 0, 62, 0, 71, 0, 0, 5, 255, 96, 100, 141, 100, 105,
565 158, 168, 37, 41, 132, 192, 164, 112, 44, 207, 102, 99, 0, 56,
566 16, 84, 116, 239, 199, 141, 65, 110, 232, 248, 25, 141, 193, 161,
567 82, 113, 108, 202, 32, 55, 229, 210, 73, 61, 41, 164, 88, 102,
568 181, 10, 41, 96, 179, 91, 106, 35, 240, 5, 135, 143, 137, 242,
569 87, 123, 246, 33, 190, 81, 108, 163, 237, 198, 14, 30, 113, 233,
570 131, 78, 115, 72, 11, 115, 87, 101, 19, 124, 51, 66, 74, 8,
571 19, 16, 67, 100, 74, 133, 50, 15, 101, 135, 56, 11, 74, 6,
572 143, 49, 126, 106, 56, 8, 145, 67, 9, 152, 48, 139, 155, 5,
573 22, 13, 74, 115, 161, 41, 147, 101, 13, 130, 57, 132, 170, 40,
574 167, 155, 0, 94, 57, 3, 178, 48, 183, 181, 57, 160, 186, 40,
575 19, 141, 189, 0, 69, 192, 40, 16, 195, 155, 185, 199, 41, 201,
576 189, 191, 205, 193, 188, 131, 210, 49, 175, 88, 209, 214, 38, 19,
577 3, 11, 19, 111, 127, 60, 219, 39, 55, 204, 19, 11, 6, 100,
578 5, 10, 227, 228, 37, 163, 0, 239, 117, 56, 238, 243, 49, 195,
579 177, 247, 48, 158, 56, 251, 50, 216, 254, 197, 56, 128, 107, 158,
580 2, 125, 171, 114, 92, 218, 246, 96, 66, 3, 4, 50, 134, 176,
581 145, 6, 97, 64, 144, 24, 19, 136, 108, 91, 177, 160, 0, 194,
582 19, 253, 0, 216, 107, 214, 224, 192, 129, 5, 16, 83, 255, 244,
583 43, 213, 195, 24, 159, 27, 169, 64, 230, 88, 208, 227, 129, 182,
584 54, 4, 89, 158, 24, 181, 163, 199, 1, 155, 52, 233, 8, 130,
585 176, 83, 24, 128, 137, 50, 18, 32, 48, 48, 114, 11, 173, 137,
586 19, 110, 4, 64, 105, 1, 194, 30, 140, 68, 15, 24, 24, 224,
587 50, 76, 70, 0, 11, 171, 54, 26, 160, 181, 194, 149, 148, 40,
588 174, 148, 122, 64, 180, 208, 161, 17, 207, 112, 164, 1, 128, 96,
589 148, 78, 18, 21, 194, 33, 229, 51, 247, 65, 133, 97, 5, 250,
590 69, 229, 100, 34, 220, 128, 166, 116, 190, 62, 8, 167, 195, 170,
591 47, 163, 0, 130, 90, 152, 11, 160, 173, 170, 27, 154, 26, 91,
592 232, 151, 171, 18, 14, 162, 253, 98, 170, 18, 70, 171, 64, 219,
593 10, 67, 136, 134, 187, 116, 75, 180, 46, 179, 174, 135, 4, 189,
594 229, 231, 78, 40, 10, 62, 226, 164, 172, 64, 240, 167, 170, 10,
595 18, 124, 188, 10, 107, 65, 193, 94, 11, 93, 171, 28, 248, 17,
596 239, 46, 140, 78, 97, 34, 25, 153, 36, 99, 65, 130, 7, 203,
597 183, 168, 51, 34, 136, 25, 140, 10, 6, 16, 28, 255, 145, 241,
598 230, 140, 10, 66, 178, 167, 112, 48, 192, 128, 129, 9, 31, 141,
599 84, 138, 63, 163, 162, 2, 203, 206, 240, 56, 55, 98, 192, 188,
600 15, 185, 50, 160, 6, 0, 125, 62, 33, 214, 195, 33, 5, 24,
601 184, 25, 231, 14, 201, 245, 144, 23, 126, 104, 228, 0, 145, 2,
602 13, 140, 244, 212, 17, 21, 20, 176, 159, 17, 95, 225, 160, 128,
603 16, 1, 32, 224, 142, 32, 227, 125, 87, 64, 0, 16, 54, 129,
604 205, 2, 141, 76, 53, 130, 103, 37, 166, 64, 144, 107, 78, 196,
605 5, 192, 0, 54, 50, 229, 9, 141, 49, 84, 194, 35, 12, 196,
606 153, 48, 192, 137, 57, 84, 24, 7, 87, 159, 249, 240, 215, 143,
607 105, 241, 118, 149, 9, 139, 4, 64, 203, 141, 35, 140, 129, 131,
608 16, 222, 125, 231, 128, 2, 238, 17, 152, 66, 3, 5, 56, 224,
609 159, 103, 16, 76, 25, 75, 5, 11, 164, 215, 96, 9, 14, 16,
610 36, 225, 15, 11, 40, 144, 192, 156, 41, 10, 178, 199, 3, 66,
611 64, 80, 193, 3, 124, 90, 48, 129, 129, 102, 177, 18, 192, 154,
612 49, 84, 240, 208, 92, 22, 149, 96, 39, 9, 31, 74, 17, 94,
613 3, 8, 177, 199, 72, 59, 85, 76, 25, 216, 8, 139, 194, 197,
614 138, 163, 69, 96, 115, 0, 147, 72, 72, 84, 28, 14, 79, 86,
615 233, 230, 23, 113, 26, 160, 128, 3, 10, 58, 129, 103, 14, 159,
616 214, 163, 146, 117, 238, 213, 154, 128, 151, 109, 84, 64, 217, 13,
617 27, 10, 228, 39, 2, 235, 164, 168, 74, 8, 0, 59,
618 };
619
620 /*
621 ** WEBPAGE: logo
622 **
623
+27 -27
--- src/encode.c
+++ src/encode.c
@@ -47,30 +47,30 @@
4747
}
4848
i = 0;
4949
zOut = fossil_malloc( count+1 );
5050
while( n-->0 && (c = *zIn)!=0 ){
5151
switch( c ){
52
- case '<':
52
+ case '<':
5353
zOut[i++] = '&';
5454
zOut[i++] = 'l';
5555
zOut[i++] = 't';
5656
zOut[i++] = ';';
5757
break;
58
- case '>':
58
+ case '>':
5959
zOut[i++] = '&';
6060
zOut[i++] = 'g';
6161
zOut[i++] = 't';
6262
zOut[i++] = ';';
6363
break;
64
- case '&':
64
+ case '&':
6565
zOut[i++] = '&';
6666
zOut[i++] = 'a';
6767
zOut[i++] = 'm';
6868
zOut[i++] = 'p';
6969
zOut[i++] = ';';
7070
break;
71
- case '"':
71
+ case '"':
7272
zOut[i++] = '&';
7373
zOut[i++] = 'q';
7474
zOut[i++] = 'u';
7575
zOut[i++] = 'o';
7676
zOut[i++] = 't';
@@ -181,11 +181,11 @@
181181
/*
182182
** Convert the input string into a form that is suitable for use as
183183
** a token in the HTTP protocol. Spaces are encoded as '+' and special
184184
** characters are encoded as "%HH" where HH is a two-digit hexidecimal
185185
** representation of the character. The "/" character is not encoded
186
-** by this routine.
186
+** by this routine.
187187
*/
188188
char *urlize(const char *z, int n){
189189
return EncodeHttp(z, n, 0);
190190
}
191191
@@ -327,11 +327,11 @@
327327
328328
329329
/*
330330
** The characters used for HTTP base64 encoding.
331331
*/
332
-static unsigned char zBase[] =
332
+static unsigned char zBase[] =
333333
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
334334
335335
/*
336336
** Encode a string using a base-64 encoding.
337337
** The encoding can be reversed using the <b>decode64</b> function.
@@ -366,11 +366,11 @@
366366
z64[n] = 0;
367367
return z64;
368368
}
369369
370370
/*
371
-** COMMAND: test-encode64
371
+** COMMAND: test-encode64
372372
** Usage: %fossil test-encode64 STRING
373373
*/
374374
void test_encode64_cmd(void){
375375
char *z;
376376
int i;
@@ -431,11 +431,11 @@
431431
*pnByte = j;
432432
return zData;
433433
}
434434
435435
/*
436
-** COMMAND: test-decode64
436
+** COMMAND: test-decode64
437437
** Usage: %fossil test-decode64 STRING
438438
*/
439439
void test_decode64_cmd(void){
440440
char *z;
441441
int i, n;
@@ -454,11 +454,11 @@
454454
*/
455455
456456
/*
457457
** The array used for encoding
458458
*/ /* 123456789 12345 */
459
-static const char zEncode[] = "0123456789abcdef";
459
+static const char zEncode[] = "0123456789abcdef";
460460
461461
/*
462462
** Encode a N-digit base-256 in base-16. Return zero on success
463463
** and non-zero if there is an error.
464464
*/
@@ -473,33 +473,33 @@
473473
}
474474
475475
/*
476476
** An array for translating single base-16 characters into a value.
477477
** Disallowed input characters have a value of 64. Upper and lower
478
-** case is the same.
478
+** case is the same.
479479
*/
480480
static const char zDecode[] = {
481
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
482
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
483
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
484
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 64, 64, 64, 64, 64, 64,
481
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
482
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
483
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
484
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 64, 64, 64, 64, 64, 64,
485485
64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64,
486486
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
487487
64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64,
488488
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
489
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
490
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
491
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
492
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
493
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
494
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
495
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
496
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
489
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
490
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
491
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
492
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
493
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
494
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
495
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
496
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
497497
};
498498
499499
/*
500
-** Decode a N-character base-16 number into base-256. N must be a
500
+** Decode a N-character base-16 number into base-256. N must be a
501501
** multiple of 2. The output buffer must be at least N/2 characters
502502
** in length
503503
*/
504504
int decode16(const unsigned char *zIn, unsigned char *pOut, int N){
505505
int i, j;
@@ -545,11 +545,11 @@
545545
/* Randomness used for XOR-ing by the obscure() and unobscure() routines */
546546
static const unsigned char aObscurer[16] = {
547547
0xa7, 0x21, 0x31, 0xe3, 0x2a, 0x50, 0x2c, 0x86,
548548
0x4c, 0xa4, 0x52, 0x25, 0xff, 0x49, 0x35, 0x85
549549
};
550
-
550
+
551551
552552
/*
553553
** Obscure plain text so that it is not easily readable.
554554
**
555555
** This is used for storing sensitive information (such as passwords) in a
@@ -562,11 +562,11 @@
562562
*/
563563
char *obscure(const char *zIn){
564564
int n, i;
565565
unsigned char salt;
566566
char *zOut;
567
-
567
+
568568
if( zIn==0 ) return 0;
569569
n = strlen(zIn);
570570
zOut = fossil_malloc( n*2+3 );
571571
sqlite3_randomness(1, &salt);
572572
zOut[n+1] = (char)salt;
@@ -578,17 +578,17 @@
578578
/*
579579
** Undo the obscuring of text performed by obscure(). Or, if the input is
580580
** not hexadecimal (meaning the input is not the output of obscure()) then
581581
** do the equivalent of strdup().
582582
**
583
-** The result is memory obtained from malloc that should be freed by the caller.
583
+** The result is memory obtained from malloc that should be freed by the caller.
584584
*/
585585
char *unobscure(const char *zIn){
586586
int n, i;
587587
unsigned char salt;
588588
char *zOut;
589
-
589
+
590590
if( zIn==0 ) return 0;
591591
n = strlen(zIn);
592592
zOut = fossil_malloc( n + 1 );
593593
if( n<2
594594
|| decode16((unsigned char*)zIn, &salt, 2)
595595
--- src/encode.c
+++ src/encode.c
@@ -47,30 +47,30 @@
47 }
48 i = 0;
49 zOut = fossil_malloc( count+1 );
50 while( n-->0 && (c = *zIn)!=0 ){
51 switch( c ){
52 case '<':
53 zOut[i++] = '&';
54 zOut[i++] = 'l';
55 zOut[i++] = 't';
56 zOut[i++] = ';';
57 break;
58 case '>':
59 zOut[i++] = '&';
60 zOut[i++] = 'g';
61 zOut[i++] = 't';
62 zOut[i++] = ';';
63 break;
64 case '&':
65 zOut[i++] = '&';
66 zOut[i++] = 'a';
67 zOut[i++] = 'm';
68 zOut[i++] = 'p';
69 zOut[i++] = ';';
70 break;
71 case '"':
72 zOut[i++] = '&';
73 zOut[i++] = 'q';
74 zOut[i++] = 'u';
75 zOut[i++] = 'o';
76 zOut[i++] = 't';
@@ -181,11 +181,11 @@
181 /*
182 ** Convert the input string into a form that is suitable for use as
183 ** a token in the HTTP protocol. Spaces are encoded as '+' and special
184 ** characters are encoded as "%HH" where HH is a two-digit hexidecimal
185 ** representation of the character. The "/" character is not encoded
186 ** by this routine.
187 */
188 char *urlize(const char *z, int n){
189 return EncodeHttp(z, n, 0);
190 }
191
@@ -327,11 +327,11 @@
327
328
329 /*
330 ** The characters used for HTTP base64 encoding.
331 */
332 static unsigned char zBase[] =
333 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
334
335 /*
336 ** Encode a string using a base-64 encoding.
337 ** The encoding can be reversed using the <b>decode64</b> function.
@@ -366,11 +366,11 @@
366 z64[n] = 0;
367 return z64;
368 }
369
370 /*
371 ** COMMAND: test-encode64
372 ** Usage: %fossil test-encode64 STRING
373 */
374 void test_encode64_cmd(void){
375 char *z;
376 int i;
@@ -431,11 +431,11 @@
431 *pnByte = j;
432 return zData;
433 }
434
435 /*
436 ** COMMAND: test-decode64
437 ** Usage: %fossil test-decode64 STRING
438 */
439 void test_decode64_cmd(void){
440 char *z;
441 int i, n;
@@ -454,11 +454,11 @@
454 */
455
456 /*
457 ** The array used for encoding
458 */ /* 123456789 12345 */
459 static const char zEncode[] = "0123456789abcdef";
460
461 /*
462 ** Encode a N-digit base-256 in base-16. Return zero on success
463 ** and non-zero if there is an error.
464 */
@@ -473,33 +473,33 @@
473 }
474
475 /*
476 ** An array for translating single base-16 characters into a value.
477 ** Disallowed input characters have a value of 64. Upper and lower
478 ** case is the same.
479 */
480 static const char zDecode[] = {
481 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
482 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
483 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
484 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 64, 64, 64, 64, 64, 64,
485 64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64,
486 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
487 64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64,
488 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
489 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
490 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
491 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
492 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
493 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
494 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
495 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
496 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
497 };
498
499 /*
500 ** Decode a N-character base-16 number into base-256. N must be a
501 ** multiple of 2. The output buffer must be at least N/2 characters
502 ** in length
503 */
504 int decode16(const unsigned char *zIn, unsigned char *pOut, int N){
505 int i, j;
@@ -545,11 +545,11 @@
545 /* Randomness used for XOR-ing by the obscure() and unobscure() routines */
546 static const unsigned char aObscurer[16] = {
547 0xa7, 0x21, 0x31, 0xe3, 0x2a, 0x50, 0x2c, 0x86,
548 0x4c, 0xa4, 0x52, 0x25, 0xff, 0x49, 0x35, 0x85
549 };
550
551
552 /*
553 ** Obscure plain text so that it is not easily readable.
554 **
555 ** This is used for storing sensitive information (such as passwords) in a
@@ -562,11 +562,11 @@
562 */
563 char *obscure(const char *zIn){
564 int n, i;
565 unsigned char salt;
566 char *zOut;
567
568 if( zIn==0 ) return 0;
569 n = strlen(zIn);
570 zOut = fossil_malloc( n*2+3 );
571 sqlite3_randomness(1, &salt);
572 zOut[n+1] = (char)salt;
@@ -578,17 +578,17 @@
578 /*
579 ** Undo the obscuring of text performed by obscure(). Or, if the input is
580 ** not hexadecimal (meaning the input is not the output of obscure()) then
581 ** do the equivalent of strdup().
582 **
583 ** The result is memory obtained from malloc that should be freed by the caller.
584 */
585 char *unobscure(const char *zIn){
586 int n, i;
587 unsigned char salt;
588 char *zOut;
589
590 if( zIn==0 ) return 0;
591 n = strlen(zIn);
592 zOut = fossil_malloc( n + 1 );
593 if( n<2
594 || decode16((unsigned char*)zIn, &salt, 2)
595
--- src/encode.c
+++ src/encode.c
@@ -47,30 +47,30 @@
47 }
48 i = 0;
49 zOut = fossil_malloc( count+1 );
50 while( n-->0 && (c = *zIn)!=0 ){
51 switch( c ){
52 case '<':
53 zOut[i++] = '&';
54 zOut[i++] = 'l';
55 zOut[i++] = 't';
56 zOut[i++] = ';';
57 break;
58 case '>':
59 zOut[i++] = '&';
60 zOut[i++] = 'g';
61 zOut[i++] = 't';
62 zOut[i++] = ';';
63 break;
64 case '&':
65 zOut[i++] = '&';
66 zOut[i++] = 'a';
67 zOut[i++] = 'm';
68 zOut[i++] = 'p';
69 zOut[i++] = ';';
70 break;
71 case '"':
72 zOut[i++] = '&';
73 zOut[i++] = 'q';
74 zOut[i++] = 'u';
75 zOut[i++] = 'o';
76 zOut[i++] = 't';
@@ -181,11 +181,11 @@
181 /*
182 ** Convert the input string into a form that is suitable for use as
183 ** a token in the HTTP protocol. Spaces are encoded as '+' and special
184 ** characters are encoded as "%HH" where HH is a two-digit hexidecimal
185 ** representation of the character. The "/" character is not encoded
186 ** by this routine.
187 */
188 char *urlize(const char *z, int n){
189 return EncodeHttp(z, n, 0);
190 }
191
@@ -327,11 +327,11 @@
327
328
329 /*
330 ** The characters used for HTTP base64 encoding.
331 */
332 static unsigned char zBase[] =
333 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
334
335 /*
336 ** Encode a string using a base-64 encoding.
337 ** The encoding can be reversed using the <b>decode64</b> function.
@@ -366,11 +366,11 @@
366 z64[n] = 0;
367 return z64;
368 }
369
370 /*
371 ** COMMAND: test-encode64
372 ** Usage: %fossil test-encode64 STRING
373 */
374 void test_encode64_cmd(void){
375 char *z;
376 int i;
@@ -431,11 +431,11 @@
431 *pnByte = j;
432 return zData;
433 }
434
435 /*
436 ** COMMAND: test-decode64
437 ** Usage: %fossil test-decode64 STRING
438 */
439 void test_decode64_cmd(void){
440 char *z;
441 int i, n;
@@ -454,11 +454,11 @@
454 */
455
456 /*
457 ** The array used for encoding
458 */ /* 123456789 12345 */
459 static const char zEncode[] = "0123456789abcdef";
460
461 /*
462 ** Encode a N-digit base-256 in base-16. Return zero on success
463 ** and non-zero if there is an error.
464 */
@@ -473,33 +473,33 @@
473 }
474
475 /*
476 ** An array for translating single base-16 characters into a value.
477 ** Disallowed input characters have a value of 64. Upper and lower
478 ** case is the same.
479 */
480 static const char zDecode[] = {
481 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
482 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
483 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
484 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 64, 64, 64, 64, 64, 64,
485 64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64,
486 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
487 64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64,
488 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
489 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
490 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
491 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
492 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
493 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
494 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
495 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
496 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
497 };
498
499 /*
500 ** Decode a N-character base-16 number into base-256. N must be a
501 ** multiple of 2. The output buffer must be at least N/2 characters
502 ** in length
503 */
504 int decode16(const unsigned char *zIn, unsigned char *pOut, int N){
505 int i, j;
@@ -545,11 +545,11 @@
545 /* Randomness used for XOR-ing by the obscure() and unobscure() routines */
546 static const unsigned char aObscurer[16] = {
547 0xa7, 0x21, 0x31, 0xe3, 0x2a, 0x50, 0x2c, 0x86,
548 0x4c, 0xa4, 0x52, 0x25, 0xff, 0x49, 0x35, 0x85
549 };
550
551
552 /*
553 ** Obscure plain text so that it is not easily readable.
554 **
555 ** This is used for storing sensitive information (such as passwords) in a
@@ -562,11 +562,11 @@
562 */
563 char *obscure(const char *zIn){
564 int n, i;
565 unsigned char salt;
566 char *zOut;
567
568 if( zIn==0 ) return 0;
569 n = strlen(zIn);
570 zOut = fossil_malloc( n*2+3 );
571 sqlite3_randomness(1, &salt);
572 zOut[n+1] = (char)salt;
@@ -578,17 +578,17 @@
578 /*
579 ** Undo the obscuring of text performed by obscure(). Or, if the input is
580 ** not hexadecimal (meaning the input is not the output of obscure()) then
581 ** do the equivalent of strdup().
582 **
583 ** The result is memory obtained from malloc that should be freed by the caller.
584 */
585 char *unobscure(const char *zIn){
586 int n, i;
587 unsigned char salt;
588 char *zOut;
589
590 if( zIn==0 ) return 0;
591 n = strlen(zIn);
592 zOut = fossil_malloc( n + 1 );
593 if( n<2
594 || decode16((unsigned char*)zIn, &salt, 2)
595
+2 -4
--- src/event.c
+++ src/event.c
@@ -119,11 +119,11 @@
119119
if( pEvent==0 ){
120120
fossil_fatal("Object #%d is not an event", rid);
121121
}
122122
blob_init(&fullbody, pEvent->zWiki, -1);
123123
if( wiki_find_title(&fullbody, &title, &tail) ){
124
- style_header(blob_str(&title));
124
+ style_header("%s", blob_str(&title));
125125
}else{
126126
style_header("Event %S", zEventId);
127127
tail = fullbody;
128128
}
129129
if( g.perm.WrWiki && g.perm.Write && nextRid==0 ){
@@ -203,11 +203,10 @@
203203
void eventedit_page(void){
204204
char *zTag;
205205
int rid = 0;
206206
Blob event;
207207
const char *zEventId;
208
- char *zHtmlPageName;
209208
int n;
210209
const char *z;
211210
char *zBody = (char*)P("w");
212211
char *zETime = (char*)P("t");
213212
const char *zComment = P("c");
@@ -364,12 +363,11 @@
364363
return;
365364
}
366365
if( zBody==0 ){
367366
zBody = mprintf("<i>Event Text</i>");
368367
}
369
- zHtmlPageName = mprintf("Edit Event %S", zEventId);
370
- style_header(zHtmlPageName);
368
+ style_header("Edit Event %S", zEventId);
371369
if( P("preview")!=0 ){
372370
Blob title, tail, com;
373371
@ <p><b>Timeline comment preview:</b></p>
374372
@ <blockquote>
375373
@ <table border="0">
376374
--- src/event.c
+++ src/event.c
@@ -119,11 +119,11 @@
119 if( pEvent==0 ){
120 fossil_fatal("Object #%d is not an event", rid);
121 }
122 blob_init(&fullbody, pEvent->zWiki, -1);
123 if( wiki_find_title(&fullbody, &title, &tail) ){
124 style_header(blob_str(&title));
125 }else{
126 style_header("Event %S", zEventId);
127 tail = fullbody;
128 }
129 if( g.perm.WrWiki && g.perm.Write && nextRid==0 ){
@@ -203,11 +203,10 @@
203 void eventedit_page(void){
204 char *zTag;
205 int rid = 0;
206 Blob event;
207 const char *zEventId;
208 char *zHtmlPageName;
209 int n;
210 const char *z;
211 char *zBody = (char*)P("w");
212 char *zETime = (char*)P("t");
213 const char *zComment = P("c");
@@ -364,12 +363,11 @@
364 return;
365 }
366 if( zBody==0 ){
367 zBody = mprintf("<i>Event Text</i>");
368 }
369 zHtmlPageName = mprintf("Edit Event %S", zEventId);
370 style_header(zHtmlPageName);
371 if( P("preview")!=0 ){
372 Blob title, tail, com;
373 @ <p><b>Timeline comment preview:</b></p>
374 @ <blockquote>
375 @ <table border="0">
376
--- src/event.c
+++ src/event.c
@@ -119,11 +119,11 @@
119 if( pEvent==0 ){
120 fossil_fatal("Object #%d is not an event", rid);
121 }
122 blob_init(&fullbody, pEvent->zWiki, -1);
123 if( wiki_find_title(&fullbody, &title, &tail) ){
124 style_header("%s", blob_str(&title));
125 }else{
126 style_header("Event %S", zEventId);
127 tail = fullbody;
128 }
129 if( g.perm.WrWiki && g.perm.Write && nextRid==0 ){
@@ -203,11 +203,10 @@
203 void eventedit_page(void){
204 char *zTag;
205 int rid = 0;
206 Blob event;
207 const char *zEventId;
 
208 int n;
209 const char *z;
210 char *zBody = (char*)P("w");
211 char *zETime = (char*)P("t");
212 const char *zComment = P("c");
@@ -364,12 +363,11 @@
363 return;
364 }
365 if( zBody==0 ){
366 zBody = mprintf("<i>Event Text</i>");
367 }
368 style_header("Edit Event %S", zEventId);
 
369 if( P("preview")!=0 ){
370 Blob title, tail, com;
371 @ <p><b>Timeline comment preview:</b></p>
372 @ <blockquote>
373 @ <table border="0">
374
+12 -12
--- src/finfo.c
+++ src/finfo.c
@@ -319,11 +319,11 @@
319319
320320
zPrevDate[0] = 0;
321321
zFilename = PD("name","");
322322
url_add_parameter(&url, "name", zFilename);
323323
blob_zero(&sql);
324
- blob_appendf(&sql,
324
+ blob_append_sql(&sql,
325325
"SELECT"
326326
" datetime(event.mtime%s)," /* Date of change */
327327
" coalesce(event.ecomment, event.comment)," /* Check-in comment */
328328
" coalesce(event.euser, event.user)," /* User who made chng */
329329
" mlink.pid," /* Parent file rid */
@@ -338,44 +338,44 @@
338338
" mlink.pfnid", /* Previous filename */
339339
timeline_utc(), TAG_BRANCH
340340
);
341341
if( firstChngOnly ){
342342
#if 0
343
- blob_appendf(&sql, ", min(event.mtime)");
343
+ blob_append_sql(&sql, ", min(event.mtime)");
344344
#else
345
- blob_appendf(&sql,
345
+ blob_append_sql(&sql,
346346
", min(CASE (SELECT value FROM tagxref"
347347
" WHERE tagtype>0 AND tagid=%d"
348348
" AND tagxref.rid=mlink.mid)"
349349
" WHEN 'trunk' THEN event.mtime-10000 ELSE event.mtime END)",
350350
TAG_BRANCH);
351351
#endif
352352
}
353
- blob_appendf(&sql,
353
+ blob_append_sql(&sql,
354354
" FROM mlink, event"
355355
" WHERE mlink.fnid IN (SELECT fnid FROM filename WHERE name=%Q)"
356356
" AND event.objid=mlink.mid",
357357
zFilename
358358
);
359359
if( baseCheckin ){
360360
compute_direct_ancestors(baseCheckin, 10000000);
361
- blob_appendf(&sql," AND mlink.mid IN (SELECT rid FROM ancestor)");
361
+ blob_append_sql(&sql," AND mlink.mid IN (SELECT rid FROM ancestor)");
362362
}
363363
if( (zA = P("a"))!=0 ){
364
- blob_appendf(&sql, " AND event.mtime>=julianday('%q')", zA);
364
+ blob_append_sql(&sql, " AND event.mtime>=julianday('%q')", zA);
365365
url_add_parameter(&url, "a", zA);
366366
}
367367
if( (zB = P("b"))!=0 ){
368
- blob_appendf(&sql, " AND event.mtime<=julianday('%q')", zB);
368
+ blob_append_sql(&sql, " AND event.mtime<=julianday('%q')", zB);
369369
url_add_parameter(&url, "b", zB);
370370
}
371371
if( firstChngOnly ){
372
- blob_appendf(&sql, " GROUP BY mlink.fid");
372
+ blob_append_sql(&sql, " GROUP BY mlink.fid");
373373
}
374
- blob_appendf(&sql," ORDER BY event.mtime DESC /*sort*/");
374
+ blob_append_sql(&sql," ORDER BY event.mtime DESC /*sort*/");
375375
if( (n = atoi(PD("n","0")))>0 ){
376
- blob_appendf(&sql, " LIMIT %d", n);
376
+ blob_append_sql(&sql, " LIMIT %d", n);
377377
url_add_parameter(&url, "n", P("n"));
378378
}
379379
if( baseCheckin==0 ){
380380
if( firstChngOnly ){
381381
style_submenu_element("Full", "Show all changes","%s",
@@ -384,11 +384,11 @@
384384
style_submenu_element("Simplified",
385385
"Show only first use of a change","%s",
386386
url_render(&url, "fco", 0, 0, 0));
387387
}
388388
}
389
- db_prepare(&q, blob_str(&sql));
389
+ db_prepare(&q, "%s", blob_sql_text(&sql));
390390
if( P("showsql")!=0 ){
391391
@ <p>SQL: %h(blob_str(&sql))</p>
392392
}
393393
blob_reset(&sql);
394394
blob_zero(&title);
@@ -473,11 +473,11 @@
473473
}else{
474474
@ <b>Deleted</b> by check-in
475475
}
476476
}
477477
hyperlink_to_uuid(zCkin);
478
- @ %w(zCom) (user:
478
+ @ %W(zCom) (user:
479479
hyperlink_to_user(zUser, zDate, "");
480480
@ branch: %h(zBr))
481481
if( g.perm.Hyperlink && zUuid ){
482482
const char *z = zFilename;
483483
@ %z(href("%R/annotate?filename=%h&checkin=%s",z,zCkin))
484484
--- src/finfo.c
+++ src/finfo.c
@@ -319,11 +319,11 @@
319
320 zPrevDate[0] = 0;
321 zFilename = PD("name","");
322 url_add_parameter(&url, "name", zFilename);
323 blob_zero(&sql);
324 blob_appendf(&sql,
325 "SELECT"
326 " datetime(event.mtime%s)," /* Date of change */
327 " coalesce(event.ecomment, event.comment)," /* Check-in comment */
328 " coalesce(event.euser, event.user)," /* User who made chng */
329 " mlink.pid," /* Parent file rid */
@@ -338,44 +338,44 @@
338 " mlink.pfnid", /* Previous filename */
339 timeline_utc(), TAG_BRANCH
340 );
341 if( firstChngOnly ){
342 #if 0
343 blob_appendf(&sql, ", min(event.mtime)");
344 #else
345 blob_appendf(&sql,
346 ", min(CASE (SELECT value FROM tagxref"
347 " WHERE tagtype>0 AND tagid=%d"
348 " AND tagxref.rid=mlink.mid)"
349 " WHEN 'trunk' THEN event.mtime-10000 ELSE event.mtime END)",
350 TAG_BRANCH);
351 #endif
352 }
353 blob_appendf(&sql,
354 " FROM mlink, event"
355 " WHERE mlink.fnid IN (SELECT fnid FROM filename WHERE name=%Q)"
356 " AND event.objid=mlink.mid",
357 zFilename
358 );
359 if( baseCheckin ){
360 compute_direct_ancestors(baseCheckin, 10000000);
361 blob_appendf(&sql," AND mlink.mid IN (SELECT rid FROM ancestor)");
362 }
363 if( (zA = P("a"))!=0 ){
364 blob_appendf(&sql, " AND event.mtime>=julianday('%q')", zA);
365 url_add_parameter(&url, "a", zA);
366 }
367 if( (zB = P("b"))!=0 ){
368 blob_appendf(&sql, " AND event.mtime<=julianday('%q')", zB);
369 url_add_parameter(&url, "b", zB);
370 }
371 if( firstChngOnly ){
372 blob_appendf(&sql, " GROUP BY mlink.fid");
373 }
374 blob_appendf(&sql," ORDER BY event.mtime DESC /*sort*/");
375 if( (n = atoi(PD("n","0")))>0 ){
376 blob_appendf(&sql, " LIMIT %d", n);
377 url_add_parameter(&url, "n", P("n"));
378 }
379 if( baseCheckin==0 ){
380 if( firstChngOnly ){
381 style_submenu_element("Full", "Show all changes","%s",
@@ -384,11 +384,11 @@
384 style_submenu_element("Simplified",
385 "Show only first use of a change","%s",
386 url_render(&url, "fco", 0, 0, 0));
387 }
388 }
389 db_prepare(&q, blob_str(&sql));
390 if( P("showsql")!=0 ){
391 @ <p>SQL: %h(blob_str(&sql))</p>
392 }
393 blob_reset(&sql);
394 blob_zero(&title);
@@ -473,11 +473,11 @@
473 }else{
474 @ <b>Deleted</b> by check-in
475 }
476 }
477 hyperlink_to_uuid(zCkin);
478 @ %w(zCom) (user:
479 hyperlink_to_user(zUser, zDate, "");
480 @ branch: %h(zBr))
481 if( g.perm.Hyperlink && zUuid ){
482 const char *z = zFilename;
483 @ %z(href("%R/annotate?filename=%h&checkin=%s",z,zCkin))
484
--- src/finfo.c
+++ src/finfo.c
@@ -319,11 +319,11 @@
319
320 zPrevDate[0] = 0;
321 zFilename = PD("name","");
322 url_add_parameter(&url, "name", zFilename);
323 blob_zero(&sql);
324 blob_append_sql(&sql,
325 "SELECT"
326 " datetime(event.mtime%s)," /* Date of change */
327 " coalesce(event.ecomment, event.comment)," /* Check-in comment */
328 " coalesce(event.euser, event.user)," /* User who made chng */
329 " mlink.pid," /* Parent file rid */
@@ -338,44 +338,44 @@
338 " mlink.pfnid", /* Previous filename */
339 timeline_utc(), TAG_BRANCH
340 );
341 if( firstChngOnly ){
342 #if 0
343 blob_append_sql(&sql, ", min(event.mtime)");
344 #else
345 blob_append_sql(&sql,
346 ", min(CASE (SELECT value FROM tagxref"
347 " WHERE tagtype>0 AND tagid=%d"
348 " AND tagxref.rid=mlink.mid)"
349 " WHEN 'trunk' THEN event.mtime-10000 ELSE event.mtime END)",
350 TAG_BRANCH);
351 #endif
352 }
353 blob_append_sql(&sql,
354 " FROM mlink, event"
355 " WHERE mlink.fnid IN (SELECT fnid FROM filename WHERE name=%Q)"
356 " AND event.objid=mlink.mid",
357 zFilename
358 );
359 if( baseCheckin ){
360 compute_direct_ancestors(baseCheckin, 10000000);
361 blob_append_sql(&sql," AND mlink.mid IN (SELECT rid FROM ancestor)");
362 }
363 if( (zA = P("a"))!=0 ){
364 blob_append_sql(&sql, " AND event.mtime>=julianday('%q')", zA);
365 url_add_parameter(&url, "a", zA);
366 }
367 if( (zB = P("b"))!=0 ){
368 blob_append_sql(&sql, " AND event.mtime<=julianday('%q')", zB);
369 url_add_parameter(&url, "b", zB);
370 }
371 if( firstChngOnly ){
372 blob_append_sql(&sql, " GROUP BY mlink.fid");
373 }
374 blob_append_sql(&sql," ORDER BY event.mtime DESC /*sort*/");
375 if( (n = atoi(PD("n","0")))>0 ){
376 blob_append_sql(&sql, " LIMIT %d", n);
377 url_add_parameter(&url, "n", P("n"));
378 }
379 if( baseCheckin==0 ){
380 if( firstChngOnly ){
381 style_submenu_element("Full", "Show all changes","%s",
@@ -384,11 +384,11 @@
384 style_submenu_element("Simplified",
385 "Show only first use of a change","%s",
386 url_render(&url, "fco", 0, 0, 0));
387 }
388 }
389 db_prepare(&q, "%s", blob_sql_text(&sql));
390 if( P("showsql")!=0 ){
391 @ <p>SQL: %h(blob_str(&sql))</p>
392 }
393 blob_reset(&sql);
394 blob_zero(&title);
@@ -473,11 +473,11 @@
473 }else{
474 @ <b>Deleted</b> by check-in
475 }
476 }
477 hyperlink_to_uuid(zCkin);
478 @ %W(zCom) (user:
479 hyperlink_to_user(zUser, zDate, "");
480 @ branch: %h(zBr))
481 if( g.perm.Hyperlink && zUuid ){
482 const char *z = zFilename;
483 @ %z(href("%R/annotate?filename=%h&checkin=%s",z,zCkin))
484
+2 -2
--- src/http.c
+++ src/http.c
@@ -167,11 +167,11 @@
167167
char *zPrompt;
168168
char *zHttpAuth = 0;
169169
if( !isatty(fileno(stdin)) ) return 0;
170170
zPrompt = mprintf("\n%s authorization required by\n%s\n",
171171
g.url.isHttps==1 ? "Encrypted HTTPS" : "Unencrypted HTTP", g.url.canonical);
172
- fossil_print(zPrompt);
172
+ fossil_print("%s", zPrompt);
173173
free(zPrompt);
174174
if ( g.url.user && g.url.passwd && use_fossil_creds_for_httpauth_prompt() ){
175175
zHttpAuth = mprintf("%s:%s", g.url.user, g.url.passwd);
176176
}else{
177177
prompt_user("Basic Authorization user: ", &x);
@@ -214,11 +214,11 @@
214214
int i; /* Loop counter */
215215
int isError = 0; /* True if the reply is an error message */
216216
int isCompressed = 1; /* True if the reply is compressed */
217217
218218
if( transport_open(&g.url) ){
219
- fossil_warning(transport_errmsg(&g.url));
219
+ fossil_warning("%s", transport_errmsg(&g.url));
220220
return 1;
221221
}
222222
223223
/* Construct the login card and prepare the complete payload */
224224
blob_zero(&login);
225225
--- src/http.c
+++ src/http.c
@@ -167,11 +167,11 @@
167 char *zPrompt;
168 char *zHttpAuth = 0;
169 if( !isatty(fileno(stdin)) ) return 0;
170 zPrompt = mprintf("\n%s authorization required by\n%s\n",
171 g.url.isHttps==1 ? "Encrypted HTTPS" : "Unencrypted HTTP", g.url.canonical);
172 fossil_print(zPrompt);
173 free(zPrompt);
174 if ( g.url.user && g.url.passwd && use_fossil_creds_for_httpauth_prompt() ){
175 zHttpAuth = mprintf("%s:%s", g.url.user, g.url.passwd);
176 }else{
177 prompt_user("Basic Authorization user: ", &x);
@@ -214,11 +214,11 @@
214 int i; /* Loop counter */
215 int isError = 0; /* True if the reply is an error message */
216 int isCompressed = 1; /* True if the reply is compressed */
217
218 if( transport_open(&g.url) ){
219 fossil_warning(transport_errmsg(&g.url));
220 return 1;
221 }
222
223 /* Construct the login card and prepare the complete payload */
224 blob_zero(&login);
225
--- src/http.c
+++ src/http.c
@@ -167,11 +167,11 @@
167 char *zPrompt;
168 char *zHttpAuth = 0;
169 if( !isatty(fileno(stdin)) ) return 0;
170 zPrompt = mprintf("\n%s authorization required by\n%s\n",
171 g.url.isHttps==1 ? "Encrypted HTTPS" : "Unencrypted HTTP", g.url.canonical);
172 fossil_print("%s", zPrompt);
173 free(zPrompt);
174 if ( g.url.user && g.url.passwd && use_fossil_creds_for_httpauth_prompt() ){
175 zHttpAuth = mprintf("%s:%s", g.url.user, g.url.passwd);
176 }else{
177 prompt_user("Basic Authorization user: ", &x);
@@ -214,11 +214,11 @@
214 int i; /* Loop counter */
215 int isError = 0; /* True if the reply is an error message */
216 int isCompressed = 1; /* True if the reply is compressed */
217
218 if( transport_open(&g.url) ){
219 fossil_warning("%s", transport_errmsg(&g.url));
220 return 1;
221 }
222
223 /* Construct the login card and prepare the complete payload */
224 blob_zero(&login);
225
+6 -8
--- src/info.c
+++ src/info.c
@@ -535,20 +535,18 @@
535535
timeline_utc(), timeline_utc(), rid, rid
536536
);
537537
sideBySide = !is_false(PD("sbs","1"));
538538
if( db_step(&q1)==SQLITE_ROW ){
539539
const char *zUuid = db_column_text(&q1, 0);
540
- char *zTitle = mprintf("Check-in [%S]", zUuid);
541540
char *zEUser, *zEComment;
542541
const char *zUser;
543542
const char *zComment;
544543
const char *zDate;
545544
const char *zOrigDate;
546545
547
- style_header(zTitle);
546
+ style_header("Check-in [%S]", zUuid);
548547
login_anonymous_available();
549
- free(zTitle);
550548
zEUser = db_text(0,
551549
"SELECT value FROM tagxref"
552550
" WHERE tagid=%d AND rid=%d AND tagtype>0",
553551
TAG_USER, rid);
554552
zEComment = db_text(0,
@@ -1582,11 +1580,11 @@
15821580
login_check_credentials();
15831581
if( !g.perm.Read ){ login_needed(); return; }
15841582
if( rid==0 ) fossil_redirect_home();
15851583
if( g.perm.Admin ){
15861584
const char *zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
1587
- if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){
1585
+ if( db_exists("SELECT 1 FROM shun WHERE uuid=%Q", zUuid) ){
15881586
style_submenu_element("Unshun","Unshun", "%s/shun?accept=%s&sub=1#delshun",
15891587
g.zTop, zUuid);
15901588
}else{
15911589
style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
15921590
g.zTop, zUuid);
@@ -1768,20 +1766,20 @@
17681766
login_check_credentials();
17691767
if( !g.perm.Read ){ login_needed(); return; }
17701768
if( rid==0 ) fossil_redirect_home();
17711769
if( g.perm.Admin ){
17721770
const char *zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
1773
- if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){
1771
+ if( db_exists("SELECT 1 FROM shun WHERE uuid=%Q", zUuid) ){
17741772
style_submenu_element("Unshun","Unshun", "%s/shun?accept=%s&sub=1#accshun",
17751773
g.zTop, zUuid);
17761774
}else{
17771775
style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
17781776
g.zTop, zUuid);
17791777
}
17801778
}
17811779
if( descOnly || P("verbose")!=0 ) objdescFlags |= OBJDESC_DETAIL;
1782
- style_header(descOnly ? "Artifact Description" : "Artifact Content");
1780
+ style_header("%s", descOnly ? "Artifact Description" : "Artifact Content");
17831781
zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid);
17841782
if( g.perm.Setup ){
17851783
@ <h2>Artifact %s(zUuid) (%d(rid)):</h2>
17861784
}else{
17871785
@ <h2>Artifact %s(zUuid):</h2>
@@ -1884,11 +1882,11 @@
18841882
if( !g.perm.RdTkt ){ login_needed(); return; }
18851883
rid = name_to_rid_www("name");
18861884
if( rid==0 ){ fossil_redirect_home(); }
18871885
zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
18881886
if( g.perm.Admin ){
1889
- if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){
1887
+ if( db_exists("SELECT 1 FROM shun WHERE uuid=%Q", zUuid) ){
18901888
style_submenu_element("Unshun","Unshun", "%s/shun?accept=%s&sub=1#accshun",
18911889
g.zTop, zUuid);
18921890
}else{
18931891
style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
18941892
g.zTop, zUuid);
@@ -2029,11 +2027,11 @@
20292027
cgi_set_parameter("src","info");
20302028
ambiguous_page();
20312029
return;
20322030
}
20332031
zName = blob_str(&uuid);
2034
- rid = db_int(0, "SELECT rid FROM blob WHERE uuid='%s'", zName);
2032
+ rid = db_int(0, "SELECT rid FROM blob WHERE uuid=%Q", zName);
20352033
if( rid==0 ){
20362034
style_header("Broken Link");
20372035
@ <p>No such object: %h(zName)</p>
20382036
style_footer();
20392037
return;
20402038
--- src/info.c
+++ src/info.c
@@ -535,20 +535,18 @@
535 timeline_utc(), timeline_utc(), rid, rid
536 );
537 sideBySide = !is_false(PD("sbs","1"));
538 if( db_step(&q1)==SQLITE_ROW ){
539 const char *zUuid = db_column_text(&q1, 0);
540 char *zTitle = mprintf("Check-in [%S]", zUuid);
541 char *zEUser, *zEComment;
542 const char *zUser;
543 const char *zComment;
544 const char *zDate;
545 const char *zOrigDate;
546
547 style_header(zTitle);
548 login_anonymous_available();
549 free(zTitle);
550 zEUser = db_text(0,
551 "SELECT value FROM tagxref"
552 " WHERE tagid=%d AND rid=%d AND tagtype>0",
553 TAG_USER, rid);
554 zEComment = db_text(0,
@@ -1582,11 +1580,11 @@
1582 login_check_credentials();
1583 if( !g.perm.Read ){ login_needed(); return; }
1584 if( rid==0 ) fossil_redirect_home();
1585 if( g.perm.Admin ){
1586 const char *zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
1587 if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){
1588 style_submenu_element("Unshun","Unshun", "%s/shun?accept=%s&sub=1#delshun",
1589 g.zTop, zUuid);
1590 }else{
1591 style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
1592 g.zTop, zUuid);
@@ -1768,20 +1766,20 @@
1768 login_check_credentials();
1769 if( !g.perm.Read ){ login_needed(); return; }
1770 if( rid==0 ) fossil_redirect_home();
1771 if( g.perm.Admin ){
1772 const char *zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
1773 if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){
1774 style_submenu_element("Unshun","Unshun", "%s/shun?accept=%s&sub=1#accshun",
1775 g.zTop, zUuid);
1776 }else{
1777 style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
1778 g.zTop, zUuid);
1779 }
1780 }
1781 if( descOnly || P("verbose")!=0 ) objdescFlags |= OBJDESC_DETAIL;
1782 style_header(descOnly ? "Artifact Description" : "Artifact Content");
1783 zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid);
1784 if( g.perm.Setup ){
1785 @ <h2>Artifact %s(zUuid) (%d(rid)):</h2>
1786 }else{
1787 @ <h2>Artifact %s(zUuid):</h2>
@@ -1884,11 +1882,11 @@
1884 if( !g.perm.RdTkt ){ login_needed(); return; }
1885 rid = name_to_rid_www("name");
1886 if( rid==0 ){ fossil_redirect_home(); }
1887 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
1888 if( g.perm.Admin ){
1889 if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){
1890 style_submenu_element("Unshun","Unshun", "%s/shun?accept=%s&sub=1#accshun",
1891 g.zTop, zUuid);
1892 }else{
1893 style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
1894 g.zTop, zUuid);
@@ -2029,11 +2027,11 @@
2029 cgi_set_parameter("src","info");
2030 ambiguous_page();
2031 return;
2032 }
2033 zName = blob_str(&uuid);
2034 rid = db_int(0, "SELECT rid FROM blob WHERE uuid='%s'", zName);
2035 if( rid==0 ){
2036 style_header("Broken Link");
2037 @ <p>No such object: %h(zName)</p>
2038 style_footer();
2039 return;
2040
--- src/info.c
+++ src/info.c
@@ -535,20 +535,18 @@
535 timeline_utc(), timeline_utc(), rid, rid
536 );
537 sideBySide = !is_false(PD("sbs","1"));
538 if( db_step(&q1)==SQLITE_ROW ){
539 const char *zUuid = db_column_text(&q1, 0);
 
540 char *zEUser, *zEComment;
541 const char *zUser;
542 const char *zComment;
543 const char *zDate;
544 const char *zOrigDate;
545
546 style_header("Check-in [%S]", zUuid);
547 login_anonymous_available();
 
548 zEUser = db_text(0,
549 "SELECT value FROM tagxref"
550 " WHERE tagid=%d AND rid=%d AND tagtype>0",
551 TAG_USER, rid);
552 zEComment = db_text(0,
@@ -1582,11 +1580,11 @@
1580 login_check_credentials();
1581 if( !g.perm.Read ){ login_needed(); return; }
1582 if( rid==0 ) fossil_redirect_home();
1583 if( g.perm.Admin ){
1584 const char *zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
1585 if( db_exists("SELECT 1 FROM shun WHERE uuid=%Q", zUuid) ){
1586 style_submenu_element("Unshun","Unshun", "%s/shun?accept=%s&sub=1#delshun",
1587 g.zTop, zUuid);
1588 }else{
1589 style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
1590 g.zTop, zUuid);
@@ -1768,20 +1766,20 @@
1766 login_check_credentials();
1767 if( !g.perm.Read ){ login_needed(); return; }
1768 if( rid==0 ) fossil_redirect_home();
1769 if( g.perm.Admin ){
1770 const char *zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
1771 if( db_exists("SELECT 1 FROM shun WHERE uuid=%Q", zUuid) ){
1772 style_submenu_element("Unshun","Unshun", "%s/shun?accept=%s&sub=1#accshun",
1773 g.zTop, zUuid);
1774 }else{
1775 style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
1776 g.zTop, zUuid);
1777 }
1778 }
1779 if( descOnly || P("verbose")!=0 ) objdescFlags |= OBJDESC_DETAIL;
1780 style_header("%s", descOnly ? "Artifact Description" : "Artifact Content");
1781 zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid);
1782 if( g.perm.Setup ){
1783 @ <h2>Artifact %s(zUuid) (%d(rid)):</h2>
1784 }else{
1785 @ <h2>Artifact %s(zUuid):</h2>
@@ -1884,11 +1882,11 @@
1882 if( !g.perm.RdTkt ){ login_needed(); return; }
1883 rid = name_to_rid_www("name");
1884 if( rid==0 ){ fossil_redirect_home(); }
1885 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
1886 if( g.perm.Admin ){
1887 if( db_exists("SELECT 1 FROM shun WHERE uuid=%Q", zUuid) ){
1888 style_submenu_element("Unshun","Unshun", "%s/shun?accept=%s&sub=1#accshun",
1889 g.zTop, zUuid);
1890 }else{
1891 style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun",
1892 g.zTop, zUuid);
@@ -2029,11 +2027,11 @@
2027 cgi_set_parameter("src","info");
2028 ambiguous_page();
2029 return;
2030 }
2031 zName = blob_str(&uuid);
2032 rid = db_int(0, "SELECT rid FROM blob WHERE uuid=%Q", zName);
2033 if( rid==0 ){
2034 style_header("Broken Link");
2035 @ <p>No such object: %h(zName)</p>
2036 style_footer();
2037 return;
2038
+7 -7
--- src/json.c
+++ src/json.c
@@ -1665,11 +1665,11 @@
16651665
cson_value * json_sql_to_array_of_obj(Blob * pSql, cson_array * pTgt,
16661666
char resetBlob){
16671667
Stmt q = empty_Stmt;
16681668
cson_value * pay = NULL;
16691669
assert( blob_size(pSql) > 0 );
1670
- db_prepare(&q, "%s", blob_str(pSql));
1670
+ db_prepare(&q, "%s", blob_str(pSql) /*safe-for-%s*/);
16711671
if(resetBlob){
16721672
blob_reset(pSql);
16731673
}
16741674
pay = json_stmt_to_array_of_obj(&q, pTgt);
16751675
db_finalize(&q);
@@ -1983,16 +1983,16 @@
19831983
cson_object_set(jo, "sqlite", jv2);
19841984
sqlite3_snprintf(BufLen, zBuf, "%.19s [%.10s] (%s)",
19851985
sqlite3_sourceid(), &sqlite3_sourceid()[20], sqlite3_libversion());
19861986
SETBUF(jo2, "version");
19871987
zDb = db_name("repository");
1988
- cson_object_set(jo2, "pageCount", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA %s.page_count", zDb)));
1989
- cson_object_set(jo2, "pageSize", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA %s.page_size", zDb)));
1990
- cson_object_set(jo2, "freeList", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA %s.freelist_count", zDb)));
1991
- sqlite3_snprintf(BufLen, zBuf, "%s", db_text(0, "PRAGMA %s.encoding", zDb));
1988
+ cson_object_set(jo2, "pageCount", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA \"%w\".page_count", zDb)));
1989
+ cson_object_set(jo2, "pageSize", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA \"%w\".page_size", zDb)));
1990
+ cson_object_set(jo2, "freeList", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA \"%w\".freelist_count", zDb)));
1991
+ sqlite3_snprintf(BufLen, zBuf, "%s", db_text(0, "PRAGMA \"%w\".encoding", zDb));
19921992
SETBUF(jo2, "encoding");
1993
- sqlite3_snprintf(BufLen, zBuf, "%s", db_text(0, "PRAGMA %s.journal_mode", zDb));
1993
+ sqlite3_snprintf(BufLen, zBuf, "%s", db_text(0, "PRAGMA \"%w\".journal_mode", zDb));
19941994
cson_object_set(jo2, "journalMode", *zBuf ? cson_value_new_string(zBuf, strlen(zBuf)) : cson_value_null());
19951995
return jv;
19961996
#undef SETBUF
19971997
}
19981998
@@ -2016,11 +2016,11 @@
20162016
for( ; zPages->name; ++zPages, ++i ){
20172017
if(filterByMode){
20182018
if(g.isHTTP && zPages->runMode < 0) continue;
20192019
else if(zPages->runMode > 0) continue;
20202020
}
2021
- blob_appendf(pOut, zPages->name, -1);
2021
+ blob_append(pOut, zPages->name, -1);
20222022
if((zPages+1)->name){
20232023
blob_append(pOut, ", ",2);
20242024
}
20252025
}
20262026
return i;
20272027
--- src/json.c
+++ src/json.c
@@ -1665,11 +1665,11 @@
1665 cson_value * json_sql_to_array_of_obj(Blob * pSql, cson_array * pTgt,
1666 char resetBlob){
1667 Stmt q = empty_Stmt;
1668 cson_value * pay = NULL;
1669 assert( blob_size(pSql) > 0 );
1670 db_prepare(&q, "%s", blob_str(pSql));
1671 if(resetBlob){
1672 blob_reset(pSql);
1673 }
1674 pay = json_stmt_to_array_of_obj(&q, pTgt);
1675 db_finalize(&q);
@@ -1983,16 +1983,16 @@
1983 cson_object_set(jo, "sqlite", jv2);
1984 sqlite3_snprintf(BufLen, zBuf, "%.19s [%.10s] (%s)",
1985 sqlite3_sourceid(), &sqlite3_sourceid()[20], sqlite3_libversion());
1986 SETBUF(jo2, "version");
1987 zDb = db_name("repository");
1988 cson_object_set(jo2, "pageCount", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA %s.page_count", zDb)));
1989 cson_object_set(jo2, "pageSize", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA %s.page_size", zDb)));
1990 cson_object_set(jo2, "freeList", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA %s.freelist_count", zDb)));
1991 sqlite3_snprintf(BufLen, zBuf, "%s", db_text(0, "PRAGMA %s.encoding", zDb));
1992 SETBUF(jo2, "encoding");
1993 sqlite3_snprintf(BufLen, zBuf, "%s", db_text(0, "PRAGMA %s.journal_mode", zDb));
1994 cson_object_set(jo2, "journalMode", *zBuf ? cson_value_new_string(zBuf, strlen(zBuf)) : cson_value_null());
1995 return jv;
1996 #undef SETBUF
1997 }
1998
@@ -2016,11 +2016,11 @@
2016 for( ; zPages->name; ++zPages, ++i ){
2017 if(filterByMode){
2018 if(g.isHTTP && zPages->runMode < 0) continue;
2019 else if(zPages->runMode > 0) continue;
2020 }
2021 blob_appendf(pOut, zPages->name, -1);
2022 if((zPages+1)->name){
2023 blob_append(pOut, ", ",2);
2024 }
2025 }
2026 return i;
2027
--- src/json.c
+++ src/json.c
@@ -1665,11 +1665,11 @@
1665 cson_value * json_sql_to_array_of_obj(Blob * pSql, cson_array * pTgt,
1666 char resetBlob){
1667 Stmt q = empty_Stmt;
1668 cson_value * pay = NULL;
1669 assert( blob_size(pSql) > 0 );
1670 db_prepare(&q, "%s", blob_str(pSql) /*safe-for-%s*/);
1671 if(resetBlob){
1672 blob_reset(pSql);
1673 }
1674 pay = json_stmt_to_array_of_obj(&q, pTgt);
1675 db_finalize(&q);
@@ -1983,16 +1983,16 @@
1983 cson_object_set(jo, "sqlite", jv2);
1984 sqlite3_snprintf(BufLen, zBuf, "%.19s [%.10s] (%s)",
1985 sqlite3_sourceid(), &sqlite3_sourceid()[20], sqlite3_libversion());
1986 SETBUF(jo2, "version");
1987 zDb = db_name("repository");
1988 cson_object_set(jo2, "pageCount", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA \"%w\".page_count", zDb)));
1989 cson_object_set(jo2, "pageSize", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA \"%w\".page_size", zDb)));
1990 cson_object_set(jo2, "freeList", cson_value_new_integer((cson_int_t)db_int(0, "PRAGMA \"%w\".freelist_count", zDb)));
1991 sqlite3_snprintf(BufLen, zBuf, "%s", db_text(0, "PRAGMA \"%w\".encoding", zDb));
1992 SETBUF(jo2, "encoding");
1993 sqlite3_snprintf(BufLen, zBuf, "%s", db_text(0, "PRAGMA \"%w\".journal_mode", zDb));
1994 cson_object_set(jo2, "journalMode", *zBuf ? cson_value_new_string(zBuf, strlen(zBuf)) : cson_value_null());
1995 return jv;
1996 #undef SETBUF
1997 }
1998
@@ -2016,11 +2016,11 @@
2016 for( ; zPages->name; ++zPages, ++i ){
2017 if(filterByMode){
2018 if(g.isHTTP && zPages->runMode < 0) continue;
2019 else if(zPages->runMode > 0) continue;
2020 }
2021 blob_append(pOut, zPages->name, -1);
2022 if((zPages+1)->name){
2023 blob_append(pOut, ", ",2);
2024 }
2025 }
2026 return i;
2027
--- src/json_config.c
+++ src/json_config.c
@@ -145,11 +145,11 @@
145145
for( i = 0; prop->name; ++prop ){
146146
if(prop->groupMask & confMask){
147147
if( i++ ){
148148
blob_append(&sql,",",1);
149149
}
150
- blob_appendf(&sql, "%Q", prop->name);
150
+ blob_append_sql(&sql, "%Q", prop->name);
151151
}
152152
}
153153
blob_append(&sql,") ", -1);
154154
}
155155
@@ -156,11 +156,11 @@
156156
157157
if( optSkinBackups ){
158158
blob_append(&sql, " OR name GLOB 'skin:*'", -1);
159159
}
160160
blob_append(&sql," ORDER BY name", -1);
161
- db_prepare(&q, blob_str(&sql));
161
+ db_prepare(&q, "%s", blob_sql_text(&sql));
162162
blob_reset(&sql);
163163
pay = cson_new_object();
164164
while( (SQLITE_ROW==db_step(&q)) ){
165165
cson_object_set(pay,
166166
db_column_text(&q,0),
167167
--- src/json_config.c
+++ src/json_config.c
@@ -145,11 +145,11 @@
145 for( i = 0; prop->name; ++prop ){
146 if(prop->groupMask & confMask){
147 if( i++ ){
148 blob_append(&sql,",",1);
149 }
150 blob_appendf(&sql, "%Q", prop->name);
151 }
152 }
153 blob_append(&sql,") ", -1);
154 }
155
@@ -156,11 +156,11 @@
156
157 if( optSkinBackups ){
158 blob_append(&sql, " OR name GLOB 'skin:*'", -1);
159 }
160 blob_append(&sql," ORDER BY name", -1);
161 db_prepare(&q, blob_str(&sql));
162 blob_reset(&sql);
163 pay = cson_new_object();
164 while( (SQLITE_ROW==db_step(&q)) ){
165 cson_object_set(pay,
166 db_column_text(&q,0),
167
--- src/json_config.c
+++ src/json_config.c
@@ -145,11 +145,11 @@
145 for( i = 0; prop->name; ++prop ){
146 if(prop->groupMask & confMask){
147 if( i++ ){
148 blob_append(&sql,",",1);
149 }
150 blob_append_sql(&sql, "%Q", prop->name);
151 }
152 }
153 blob_append(&sql,") ", -1);
154 }
155
@@ -156,11 +156,11 @@
156
157 if( optSkinBackups ){
158 blob_append(&sql, " OR name GLOB 'skin:*'", -1);
159 }
160 blob_append(&sql," ORDER BY name", -1);
161 db_prepare(&q, "%s", blob_sql_text(&sql));
162 blob_reset(&sql);
163 pay = cson_new_object();
164 while( (SQLITE_ROW==db_step(&q)) ){
165 cson_object_set(pay,
166 db_column_text(&q,0),
167
--- src/json_finfo.c
+++ src/json_finfo.c
@@ -62,11 +62,11 @@
6262
zBefore = json_find_option_cstr("before",NULL,"b");
6363
zAfter = json_find_option_cstr("after",NULL,"a");
6464
limit = json_find_option_int("limit",NULL,"n", -1);
6565
zCheckin = json_find_option_cstr("checkin",NULL,"ci");
6666
67
- blob_appendf(&sql,
67
+ blob_append_sql(&sql,
6868
/*0*/ "SELECT b.uuid,"
6969
/*1*/ " ci.uuid,"
7070
/*2*/ " (SELECT uuid FROM blob WHERE rid=mlink.fid)," /* Current file uuid */
7171
/*3*/ " cast(strftime('%%s',event.mtime) AS INTEGER),"
7272
/*4*/ " coalesce(event.euser, event.user),"
@@ -93,25 +93,24 @@
9393
json_set_err((rc<0) ? FSL_JSON_E_AMBIGUOUS_UUID : FSL_JSON_E_RESOURCE_NOT_FOUND,
9494
"Checkin UUID %s.", (rc<0) ? "is ambiguous" : "not found");
9595
blob_reset(&sql);
9696
return NULL;
9797
}
98
- blob_appendf(&sql, " AND ci.uuid='%q'", zU);
98
+ blob_append_sql(&sql, " AND ci.uuid='%q'", zU);
9999
free(zU);
100100
}else{
101101
if( zAfter && *zAfter ){
102
- blob_appendf(&sql, " AND event.mtime>=julianday('%q')", zAfter);
102
+ blob_append_sql(&sql, " AND event.mtime>=julianday('%q')", zAfter);
103103
sort = 1;
104104
}else if( zBefore && *zBefore ){
105
- blob_appendf(&sql, " AND event.mtime<=julianday('%q')", zBefore);
105
+ blob_append_sql(&sql, " AND event.mtime<=julianday('%q')", zBefore);
106106
}
107107
}
108108
109
- blob_appendf(&sql," ORDER BY event.mtime %s /*sort*/", (sort>0?"ASC":"DESC"));
109
+ blob_append_sql(&sql," ORDER BY event.mtime %s /*sort*/", (sort>0?"ASC":"DESC"));
110110
/*printf("SQL=\n%s\n",blob_str(&sql));*/
111
- db_prepare(&q, "%s", blob_str(&sql)/*extra %s to avoid double-expanding
112
- SQL escapes*/);
111
+ db_prepare(&q, "%s", blob_sql_text(&sql));
113112
blob_reset(&sql);
114113
115114
pay = cson_new_object();
116115
cson_object_set(pay, "name", json_new_string(zFilename));
117116
if( limit > 0 ){
118117
--- src/json_finfo.c
+++ src/json_finfo.c
@@ -62,11 +62,11 @@
62 zBefore = json_find_option_cstr("before",NULL,"b");
63 zAfter = json_find_option_cstr("after",NULL,"a");
64 limit = json_find_option_int("limit",NULL,"n", -1);
65 zCheckin = json_find_option_cstr("checkin",NULL,"ci");
66
67 blob_appendf(&sql,
68 /*0*/ "SELECT b.uuid,"
69 /*1*/ " ci.uuid,"
70 /*2*/ " (SELECT uuid FROM blob WHERE rid=mlink.fid)," /* Current file uuid */
71 /*3*/ " cast(strftime('%%s',event.mtime) AS INTEGER),"
72 /*4*/ " coalesce(event.euser, event.user),"
@@ -93,25 +93,24 @@
93 json_set_err((rc<0) ? FSL_JSON_E_AMBIGUOUS_UUID : FSL_JSON_E_RESOURCE_NOT_FOUND,
94 "Checkin UUID %s.", (rc<0) ? "is ambiguous" : "not found");
95 blob_reset(&sql);
96 return NULL;
97 }
98 blob_appendf(&sql, " AND ci.uuid='%q'", zU);
99 free(zU);
100 }else{
101 if( zAfter && *zAfter ){
102 blob_appendf(&sql, " AND event.mtime>=julianday('%q')", zAfter);
103 sort = 1;
104 }else if( zBefore && *zBefore ){
105 blob_appendf(&sql, " AND event.mtime<=julianday('%q')", zBefore);
106 }
107 }
108
109 blob_appendf(&sql," ORDER BY event.mtime %s /*sort*/", (sort>0?"ASC":"DESC"));
110 /*printf("SQL=\n%s\n",blob_str(&sql));*/
111 db_prepare(&q, "%s", blob_str(&sql)/*extra %s to avoid double-expanding
112 SQL escapes*/);
113 blob_reset(&sql);
114
115 pay = cson_new_object();
116 cson_object_set(pay, "name", json_new_string(zFilename));
117 if( limit > 0 ){
118
--- src/json_finfo.c
+++ src/json_finfo.c
@@ -62,11 +62,11 @@
62 zBefore = json_find_option_cstr("before",NULL,"b");
63 zAfter = json_find_option_cstr("after",NULL,"a");
64 limit = json_find_option_int("limit",NULL,"n", -1);
65 zCheckin = json_find_option_cstr("checkin",NULL,"ci");
66
67 blob_append_sql(&sql,
68 /*0*/ "SELECT b.uuid,"
69 /*1*/ " ci.uuid,"
70 /*2*/ " (SELECT uuid FROM blob WHERE rid=mlink.fid)," /* Current file uuid */
71 /*3*/ " cast(strftime('%%s',event.mtime) AS INTEGER),"
72 /*4*/ " coalesce(event.euser, event.user),"
@@ -93,25 +93,24 @@
93 json_set_err((rc<0) ? FSL_JSON_E_AMBIGUOUS_UUID : FSL_JSON_E_RESOURCE_NOT_FOUND,
94 "Checkin UUID %s.", (rc<0) ? "is ambiguous" : "not found");
95 blob_reset(&sql);
96 return NULL;
97 }
98 blob_append_sql(&sql, " AND ci.uuid='%q'", zU);
99 free(zU);
100 }else{
101 if( zAfter && *zAfter ){
102 blob_append_sql(&sql, " AND event.mtime>=julianday('%q')", zAfter);
103 sort = 1;
104 }else if( zBefore && *zBefore ){
105 blob_append_sql(&sql, " AND event.mtime<=julianday('%q')", zBefore);
106 }
107 }
108
109 blob_append_sql(&sql," ORDER BY event.mtime %s /*sort*/", (sort>0?"ASC":"DESC"));
110 /*printf("SQL=\n%s\n",blob_str(&sql));*/
111 db_prepare(&q, "%s", blob_sql_text(&sql));
 
112 blob_reset(&sql);
113
114 pay = cson_new_object();
115 cson_object_set(pay, "name", json_new_string(zFilename));
116 if( limit > 0 ){
117
--- src/json_query.c
+++ src/json_query.c
@@ -64,11 +64,11 @@
6464
return NULL;
6565
}
6666
6767
zFmt = json_find_option_cstr2("format",NULL,"f",3);
6868
if(!zFmt) zFmt = "o";
69
- db_prepare(&q,"%s", zSql);
69
+ db_prepare(&q,"%s", zSql/*safe-for-%s*/);
7070
if( 0 == sqlite3_column_count( q.pStmt ) ){
7171
json_set_err(FSL_JSON_E_USAGE,
7272
"Input query has no result columns. "
7373
"Only SELECT-like queries are supported.");
7474
db_finalize(&q);
7575
--- src/json_query.c
+++ src/json_query.c
@@ -64,11 +64,11 @@
64 return NULL;
65 }
66
67 zFmt = json_find_option_cstr2("format",NULL,"f",3);
68 if(!zFmt) zFmt = "o";
69 db_prepare(&q,"%s", zSql);
70 if( 0 == sqlite3_column_count( q.pStmt ) ){
71 json_set_err(FSL_JSON_E_USAGE,
72 "Input query has no result columns. "
73 "Only SELECT-like queries are supported.");
74 db_finalize(&q);
75
--- src/json_query.c
+++ src/json_query.c
@@ -64,11 +64,11 @@
64 return NULL;
65 }
66
67 zFmt = json_find_option_cstr2("format",NULL,"f",3);
68 if(!zFmt) zFmt = "o";
69 db_prepare(&q,"%s", zSql/*safe-for-%s*/);
70 if( 0 == sqlite3_column_count( q.pStmt ) ){
71 json_set_err(FSL_JSON_E_USAGE,
72 "Input query has no result columns. "
73 "Only SELECT-like queries are supported.");
74 db_finalize(&q);
75
--- src/json_report.c
+++ src/json_report.c
@@ -204,11 +204,11 @@
204204
205205
/* Copy over report's SQL...*/
206206
blob_append(&sql, db_column_text(&q,0), -1);
207207
zTitle = mprintf("%s", db_column_text(&q,1));
208208
db_finalize(&q);
209
- db_prepare(&q, "%s", blob_str(&sql));
209
+ db_prepare(&q, "%s", blob_sql_text(&sql));
210210
211211
/** Build the response... */
212212
pay = cson_new_object();
213213
214214
cson_object_set(pay, "report", json_new_int(nReport));
215215
--- src/json_report.c
+++ src/json_report.c
@@ -204,11 +204,11 @@
204
205 /* Copy over report's SQL...*/
206 blob_append(&sql, db_column_text(&q,0), -1);
207 zTitle = mprintf("%s", db_column_text(&q,1));
208 db_finalize(&q);
209 db_prepare(&q, "%s", blob_str(&sql));
210
211 /** Build the response... */
212 pay = cson_new_object();
213
214 cson_object_set(pay, "report", json_new_int(nReport));
215
--- src/json_report.c
+++ src/json_report.c
@@ -204,11 +204,11 @@
204
205 /* Copy over report's SQL...*/
206 blob_append(&sql, db_column_text(&q,0), -1);
207 zTitle = mprintf("%s", db_column_text(&q,1));
208 db_finalize(&q);
209 db_prepare(&q, "%s", blob_sql_text(&sql));
210
211 /** Build the response... */
212 pay = cson_new_object();
213
214 cson_object_set(pay, "report", json_new_int(nReport));
215
+2 -2
--- src/json_tag.c
+++ src/json_tag.c
@@ -301,11 +301,11 @@
301301
" SELECT rid FROM tagxref"
302302
" WHERE tagtype>0 AND tagid=%d"
303303
" )"
304304
" ORDER BY event.mtime DESC"
305305
"%s LIMIT %d",
306
- zSqlBase, zType, tagid,
306
+ zSqlBase /*safe-for-%s*/, zType, tagid,
307307
(limit>0)?"":"--", limit
308308
);
309309
listV = json_stmt_to_array_of_obj(&q, NULL);
310310
db_finalize(&q);
311311
}
@@ -442,11 +442,11 @@
442442
if(!fTicket){
443443
blob_append(&sql, " AND tagname NOT GLOB('tkt-*') ", -1);
444444
}
445445
blob_append(&sql,
446446
" ORDER BY tagname", -1);
447
- db_prepare(&q, blob_buffer(&sql));
447
+ db_prepare(&q, "%s", blob_sql_text(&sql));
448448
blob_reset(&sql);
449449
cson_object_set(pay, "includeTickets", cson_value_new_bool(fTicket) );
450450
while( SQLITE_ROW == db_step(&q) ){
451451
const char *zName = db_column_text(&q, 0);
452452
if(NULL==arV){
453453
--- src/json_tag.c
+++ src/json_tag.c
@@ -301,11 +301,11 @@
301 " SELECT rid FROM tagxref"
302 " WHERE tagtype>0 AND tagid=%d"
303 " )"
304 " ORDER BY event.mtime DESC"
305 "%s LIMIT %d",
306 zSqlBase, zType, tagid,
307 (limit>0)?"":"--", limit
308 );
309 listV = json_stmt_to_array_of_obj(&q, NULL);
310 db_finalize(&q);
311 }
@@ -442,11 +442,11 @@
442 if(!fTicket){
443 blob_append(&sql, " AND tagname NOT GLOB('tkt-*') ", -1);
444 }
445 blob_append(&sql,
446 " ORDER BY tagname", -1);
447 db_prepare(&q, blob_buffer(&sql));
448 blob_reset(&sql);
449 cson_object_set(pay, "includeTickets", cson_value_new_bool(fTicket) );
450 while( SQLITE_ROW == db_step(&q) ){
451 const char *zName = db_column_text(&q, 0);
452 if(NULL==arV){
453
--- src/json_tag.c
+++ src/json_tag.c
@@ -301,11 +301,11 @@
301 " SELECT rid FROM tagxref"
302 " WHERE tagtype>0 AND tagid=%d"
303 " )"
304 " ORDER BY event.mtime DESC"
305 "%s LIMIT %d",
306 zSqlBase /*safe-for-%s*/, zType, tagid,
307 (limit>0)?"":"--", limit
308 );
309 listV = json_stmt_to_array_of_obj(&q, NULL);
310 db_finalize(&q);
311 }
@@ -442,11 +442,11 @@
442 if(!fTicket){
443 blob_append(&sql, " AND tagname NOT GLOB('tkt-*') ", -1);
444 }
445 blob_append(&sql,
446 " ORDER BY tagname", -1);
447 db_prepare(&q, "%s", blob_sql_text(&sql));
448 blob_reset(&sql);
449 cson_object_set(pay, "includeTickets", cson_value_new_bool(fTicket) );
450 while( SQLITE_ROW == db_step(&q) ){
451 const char *zName = db_column_text(&q, 0);
452 if(NULL==arV){
453
--- src/json_timeline.c
+++ src/json_timeline.c
@@ -83,11 +83,11 @@
8383
@ tags TEXT,
8484
@ tagId INTEGER,
8585
@ brief TEXT
8686
@ )
8787
;
88
- db_multi_exec(zSql);
88
+ db_multi_exec("%s", zSql /*safe-for-%s*/);
8989
}
9090
9191
/*
9292
** Return a pointer to a constant string that forms the basis
9393
** for a timeline query for the JSON interface.
@@ -384,21 +384,21 @@
384384
" bgcolor as bgColor"
385385
" FROM event JOIN blob"
386386
" WHERE blob.rid=event.objid",
387387
-1);
388388
389
- blob_appendf(&sql,
389
+ blob_append_sql(&sql,
390390
" AND event.type='ci'"
391391
" AND blob.rid IN (SELECT rid FROM tagxref"
392392
" WHERE tagtype>0 AND tagid=%d AND srcid!=0)"
393393
" ORDER BY event.mtime DESC",
394394
TAG_BRANCH);
395395
limit = json_timeline_limit(20);
396396
if(limit>0){
397
- blob_appendf(&sql," LIMIT %d ",limit);
397
+ blob_append_sql(&sql," LIMIT %d ",limit);
398398
}
399
- db_prepare(&q,"%s", blob_str(&sql));
399
+ db_prepare(&q,"%s", blob_sql_text(&sql));
400400
blob_reset(&sql);
401401
pay = json_stmt_to_array_of_obj(&q, NULL);
402402
db_finalize(&q);
403403
assert(NULL != pay);
404404
if(pay){
@@ -482,11 +482,11 @@
482482
#if 0
483483
/* only for testing! */
484484
tmp = cson_value_new_string(blob_buffer(&sql),strlen(blob_buffer(&sql)));
485485
SET("timelineSql");
486486
#endif
487
- db_multi_exec(blob_buffer(&sql));
487
+ db_multi_exec("%s", blob_buffer(&sql)/*safe-for-%s*/);
488488
blob_reset(&sql);
489489
db_prepare(&q, "SELECT "
490490
" rid AS rid"
491491
" FROM json_timeline"
492492
" ORDER BY rowid");
@@ -547,11 +547,11 @@
547547
#if 0
548548
/* only for testing! */
549549
tmp = cson_value_new_string(blob_buffer(&sql),strlen(blob_buffer(&sql)));
550550
SET("timelineSql");
551551
#endif
552
- db_multi_exec(blob_buffer(&sql));
552
+ db_multi_exec("%s", blob_buffer(&sql) /*safe-for-%s*/);
553553
blob_reset(&sql);
554554
db_prepare(&q, "SELECT"
555555
" uuid AS uuid,"
556556
" mtime AS timestamp,"
557557
#if 0
@@ -565,12 +565,11 @@
565565
" tags AS tags," /*FIXME: split this into
566566
a JSON array*/
567567
" tagId AS tagId,"
568568
#endif
569569
" FROM json_timeline"
570
- " ORDER BY rowid",
571
- -1);
570
+ " ORDER BY rowid");
572571
list = cson_new_array();
573572
json_stmt_to_array_of_obj(&q, list);
574573
cson_object_set(pay, "timeline", cson_array_value(list));
575574
goto ok;
576575
error:
@@ -607,11 +606,11 @@
607606
if(check){
608607
json_set_err(check, "Query initialization failed.");
609608
goto error;
610609
}
611610
612
- db_multi_exec(blob_buffer(&sql));
611
+ db_multi_exec("%s", blob_buffer(&sql) /*safe-for-%s*/);
613612
#define SET(K) if(0!=(check=cson_object_set(pay,K,tmp))){ \
614613
json_set_err((cson_rc.AllocError==check) \
615614
? FSL_JSON_E_ALLOC : FSL_JSON_E_UNKNOWN, \
616615
"Object property insertion failed."); \
617616
goto error;\
@@ -638,12 +637,11 @@
638637
" user AS user,"
639638
" eventType AS eventType,"
640639
" comment AS comment,"
641640
" brief AS briefComment"
642641
" FROM json_timeline"
643
- " ORDER BY rowid",
644
- -1);
642
+ " ORDER BY rowid");
645643
listV = cson_value_new_array();
646644
list = cson_value_get_array(listV);
647645
tmp = listV;
648646
SET("timeline");
649647
while( (SQLITE_ROW == db_step(&q) )){
650648
--- src/json_timeline.c
+++ src/json_timeline.c
@@ -83,11 +83,11 @@
83 @ tags TEXT,
84 @ tagId INTEGER,
85 @ brief TEXT
86 @ )
87 ;
88 db_multi_exec(zSql);
89 }
90
91 /*
92 ** Return a pointer to a constant string that forms the basis
93 ** for a timeline query for the JSON interface.
@@ -384,21 +384,21 @@
384 " bgcolor as bgColor"
385 " FROM event JOIN blob"
386 " WHERE blob.rid=event.objid",
387 -1);
388
389 blob_appendf(&sql,
390 " AND event.type='ci'"
391 " AND blob.rid IN (SELECT rid FROM tagxref"
392 " WHERE tagtype>0 AND tagid=%d AND srcid!=0)"
393 " ORDER BY event.mtime DESC",
394 TAG_BRANCH);
395 limit = json_timeline_limit(20);
396 if(limit>0){
397 blob_appendf(&sql," LIMIT %d ",limit);
398 }
399 db_prepare(&q,"%s", blob_str(&sql));
400 blob_reset(&sql);
401 pay = json_stmt_to_array_of_obj(&q, NULL);
402 db_finalize(&q);
403 assert(NULL != pay);
404 if(pay){
@@ -482,11 +482,11 @@
482 #if 0
483 /* only for testing! */
484 tmp = cson_value_new_string(blob_buffer(&sql),strlen(blob_buffer(&sql)));
485 SET("timelineSql");
486 #endif
487 db_multi_exec(blob_buffer(&sql));
488 blob_reset(&sql);
489 db_prepare(&q, "SELECT "
490 " rid AS rid"
491 " FROM json_timeline"
492 " ORDER BY rowid");
@@ -547,11 +547,11 @@
547 #if 0
548 /* only for testing! */
549 tmp = cson_value_new_string(blob_buffer(&sql),strlen(blob_buffer(&sql)));
550 SET("timelineSql");
551 #endif
552 db_multi_exec(blob_buffer(&sql));
553 blob_reset(&sql);
554 db_prepare(&q, "SELECT"
555 " uuid AS uuid,"
556 " mtime AS timestamp,"
557 #if 0
@@ -565,12 +565,11 @@
565 " tags AS tags," /*FIXME: split this into
566 a JSON array*/
567 " tagId AS tagId,"
568 #endif
569 " FROM json_timeline"
570 " ORDER BY rowid",
571 -1);
572 list = cson_new_array();
573 json_stmt_to_array_of_obj(&q, list);
574 cson_object_set(pay, "timeline", cson_array_value(list));
575 goto ok;
576 error:
@@ -607,11 +606,11 @@
607 if(check){
608 json_set_err(check, "Query initialization failed.");
609 goto error;
610 }
611
612 db_multi_exec(blob_buffer(&sql));
613 #define SET(K) if(0!=(check=cson_object_set(pay,K,tmp))){ \
614 json_set_err((cson_rc.AllocError==check) \
615 ? FSL_JSON_E_ALLOC : FSL_JSON_E_UNKNOWN, \
616 "Object property insertion failed."); \
617 goto error;\
@@ -638,12 +637,11 @@
638 " user AS user,"
639 " eventType AS eventType,"
640 " comment AS comment,"
641 " brief AS briefComment"
642 " FROM json_timeline"
643 " ORDER BY rowid",
644 -1);
645 listV = cson_value_new_array();
646 list = cson_value_get_array(listV);
647 tmp = listV;
648 SET("timeline");
649 while( (SQLITE_ROW == db_step(&q) )){
650
--- src/json_timeline.c
+++ src/json_timeline.c
@@ -83,11 +83,11 @@
83 @ tags TEXT,
84 @ tagId INTEGER,
85 @ brief TEXT
86 @ )
87 ;
88 db_multi_exec("%s", zSql /*safe-for-%s*/);
89 }
90
91 /*
92 ** Return a pointer to a constant string that forms the basis
93 ** for a timeline query for the JSON interface.
@@ -384,21 +384,21 @@
384 " bgcolor as bgColor"
385 " FROM event JOIN blob"
386 " WHERE blob.rid=event.objid",
387 -1);
388
389 blob_append_sql(&sql,
390 " AND event.type='ci'"
391 " AND blob.rid IN (SELECT rid FROM tagxref"
392 " WHERE tagtype>0 AND tagid=%d AND srcid!=0)"
393 " ORDER BY event.mtime DESC",
394 TAG_BRANCH);
395 limit = json_timeline_limit(20);
396 if(limit>0){
397 blob_append_sql(&sql," LIMIT %d ",limit);
398 }
399 db_prepare(&q,"%s", blob_sql_text(&sql));
400 blob_reset(&sql);
401 pay = json_stmt_to_array_of_obj(&q, NULL);
402 db_finalize(&q);
403 assert(NULL != pay);
404 if(pay){
@@ -482,11 +482,11 @@
482 #if 0
483 /* only for testing! */
484 tmp = cson_value_new_string(blob_buffer(&sql),strlen(blob_buffer(&sql)));
485 SET("timelineSql");
486 #endif
487 db_multi_exec("%s", blob_buffer(&sql)/*safe-for-%s*/);
488 blob_reset(&sql);
489 db_prepare(&q, "SELECT "
490 " rid AS rid"
491 " FROM json_timeline"
492 " ORDER BY rowid");
@@ -547,11 +547,11 @@
547 #if 0
548 /* only for testing! */
549 tmp = cson_value_new_string(blob_buffer(&sql),strlen(blob_buffer(&sql)));
550 SET("timelineSql");
551 #endif
552 db_multi_exec("%s", blob_buffer(&sql) /*safe-for-%s*/);
553 blob_reset(&sql);
554 db_prepare(&q, "SELECT"
555 " uuid AS uuid,"
556 " mtime AS timestamp,"
557 #if 0
@@ -565,12 +565,11 @@
565 " tags AS tags," /*FIXME: split this into
566 a JSON array*/
567 " tagId AS tagId,"
568 #endif
569 " FROM json_timeline"
570 " ORDER BY rowid");
 
571 list = cson_new_array();
572 json_stmt_to_array_of_obj(&q, list);
573 cson_object_set(pay, "timeline", cson_array_value(list));
574 goto ok;
575 error:
@@ -607,11 +606,11 @@
606 if(check){
607 json_set_err(check, "Query initialization failed.");
608 goto error;
609 }
610
611 db_multi_exec("%s", blob_buffer(&sql) /*safe-for-%s*/);
612 #define SET(K) if(0!=(check=cson_object_set(pay,K,tmp))){ \
613 json_set_err((cson_rc.AllocError==check) \
614 ? FSL_JSON_E_ALLOC : FSL_JSON_E_UNKNOWN, \
615 "Object property insertion failed."); \
616 goto error;\
@@ -638,12 +637,11 @@
637 " user AS user,"
638 " eventType AS eventType,"
639 " comment AS comment,"
640 " brief AS briefComment"
641 " FROM json_timeline"
642 " ORDER BY rowid");
 
643 listV = cson_value_new_array();
644 list = cson_value_get_array(listV);
645 tmp = listV;
646 SET("timeline");
647 while( (SQLITE_ROW == db_step(&q) )){
648
+9 -9
--- src/json_user.c
+++ src/json_user.c
@@ -286,11 +286,11 @@
286286
/* reminders: 1) does not allocate.
287287
2) we do this because changing a name
288288
invalidates any login token because the old name
289289
is part of the token hash.
290290
*/;
291
- blob_appendf(&sql, ", login=%Q", zNameNew);
291
+ blob_append_sql(&sql, ", login=%Q", zNameNew);
292292
++gotFields;
293293
}
294294
}
295295
296296
if( zCap && *zCap ){
@@ -298,11 +298,11 @@
298298
/* we "could" arguably silently ignore cap in this case. */
299299
json_set_err(FSL_JSON_E_DENIED,
300300
"Changing capabilities requires 'a' or 's' privileges.");
301301
goto error;
302302
}
303
- blob_appendf(&sql, ", cap=%Q", zCap);
303
+ blob_append_sql(&sql, ", cap=%Q", zCap);
304304
++gotFields;
305305
}
306306
307307
if( zPW && *zPW ){
308308
if(!g.perm.Admin && !g.perm.Setup && !g.perm.Password){
@@ -314,24 +314,24 @@
314314
#define TRY_LOGIN_GROUP 0 /* login group support is not yet implemented. */
315315
#if !TRY_LOGIN_GROUP
316316
char * zPWHash = NULL;
317317
++gotFields;
318318
zPWHash = sha1_shared_secret(zPW, zNameNew ? zNameNew : zName, NULL);
319
- blob_appendf(&sql, ", pw=%Q", zPWHash);
319
+ blob_append_sql(&sql, ", pw=%Q", zPWHash);
320320
free(zPWHash);
321321
#else
322322
++gotFields;
323
- blob_appendf(&sql, ", pw=coalesce(shared_secret(%Q,%Q,"
323
+ blob_append_sql(&sql, ", pw=coalesce(shared_secret(%Q,%Q,"
324324
"(SELECT value FROM config WHERE name='project-code')))",
325325
zPW, zNameNew ? zNameNew : zName);
326326
/* shared_secret() func is undefined? */
327327
#endif
328328
}
329329
}
330330
331331
if( zInfo ){
332
- blob_appendf(&sql, ", info=%Q", zInfo);
332
+ blob_append_sql(&sql, ", info=%Q", zInfo);
333333
++gotFields;
334334
}
335335
336336
if((g.perm.Admin || g.perm.Setup)
337337
&& forceLogout && cson_value_get_bool(forceLogout)){
@@ -344,26 +344,26 @@
344344
"Required user data are missing.");
345345
goto error;
346346
}
347347
assert(uid>0);
348348
#if !TRY_LOGIN_GROUP
349
- blob_appendf(&sql, " WHERE uid=%d", uid);
349
+ blob_append_sql(&sql, " WHERE uid=%d", uid);
350350
#else /* need name for login group support :/ */
351
- blob_appendf(&sql, " WHERE login=%Q", zName);
351
+ blob_append_sql(&sql, " WHERE login=%Q", zName);
352352
#endif
353353
#if 0
354354
puts(blob_str(&sql));
355355
cson_output_FILE( cson_object_value(pUser), stdout, NULL );
356356
#endif
357
- db_prepare(&q, "%s", blob_str(&sql));
357
+ db_prepare(&q, "%s", blob_sql_text(&sql));
358358
db_exec(&q);
359359
db_finalize(&q);
360360
#if TRY_LOGIN_GROUP
361361
if( zPW || cson_value_get_bool(forceLogout) ){
362362
Blob groupSql = empty_blob;
363363
char * zErr = NULL;
364
- blob_appendf(&groupSql,
364
+ blob_append_sql(&groupSql,
365365
"INSERT INTO user(login)"
366366
" SELECT %Q WHERE NOT EXISTS(SELECT 1 FROM user WHERE login=%Q);",
367367
zName, zName
368368
);
369369
blob_append(&groupSql, blob_str(&sql), blob_size(&sql));
370370
--- src/json_user.c
+++ src/json_user.c
@@ -286,11 +286,11 @@
286 /* reminders: 1) does not allocate.
287 2) we do this because changing a name
288 invalidates any login token because the old name
289 is part of the token hash.
290 */;
291 blob_appendf(&sql, ", login=%Q", zNameNew);
292 ++gotFields;
293 }
294 }
295
296 if( zCap && *zCap ){
@@ -298,11 +298,11 @@
298 /* we "could" arguably silently ignore cap in this case. */
299 json_set_err(FSL_JSON_E_DENIED,
300 "Changing capabilities requires 'a' or 's' privileges.");
301 goto error;
302 }
303 blob_appendf(&sql, ", cap=%Q", zCap);
304 ++gotFields;
305 }
306
307 if( zPW && *zPW ){
308 if(!g.perm.Admin && !g.perm.Setup && !g.perm.Password){
@@ -314,24 +314,24 @@
314 #define TRY_LOGIN_GROUP 0 /* login group support is not yet implemented. */
315 #if !TRY_LOGIN_GROUP
316 char * zPWHash = NULL;
317 ++gotFields;
318 zPWHash = sha1_shared_secret(zPW, zNameNew ? zNameNew : zName, NULL);
319 blob_appendf(&sql, ", pw=%Q", zPWHash);
320 free(zPWHash);
321 #else
322 ++gotFields;
323 blob_appendf(&sql, ", pw=coalesce(shared_secret(%Q,%Q,"
324 "(SELECT value FROM config WHERE name='project-code')))",
325 zPW, zNameNew ? zNameNew : zName);
326 /* shared_secret() func is undefined? */
327 #endif
328 }
329 }
330
331 if( zInfo ){
332 blob_appendf(&sql, ", info=%Q", zInfo);
333 ++gotFields;
334 }
335
336 if((g.perm.Admin || g.perm.Setup)
337 && forceLogout && cson_value_get_bool(forceLogout)){
@@ -344,26 +344,26 @@
344 "Required user data are missing.");
345 goto error;
346 }
347 assert(uid>0);
348 #if !TRY_LOGIN_GROUP
349 blob_appendf(&sql, " WHERE uid=%d", uid);
350 #else /* need name for login group support :/ */
351 blob_appendf(&sql, " WHERE login=%Q", zName);
352 #endif
353 #if 0
354 puts(blob_str(&sql));
355 cson_output_FILE( cson_object_value(pUser), stdout, NULL );
356 #endif
357 db_prepare(&q, "%s", blob_str(&sql));
358 db_exec(&q);
359 db_finalize(&q);
360 #if TRY_LOGIN_GROUP
361 if( zPW || cson_value_get_bool(forceLogout) ){
362 Blob groupSql = empty_blob;
363 char * zErr = NULL;
364 blob_appendf(&groupSql,
365 "INSERT INTO user(login)"
366 " SELECT %Q WHERE NOT EXISTS(SELECT 1 FROM user WHERE login=%Q);",
367 zName, zName
368 );
369 blob_append(&groupSql, blob_str(&sql), blob_size(&sql));
370
--- src/json_user.c
+++ src/json_user.c
@@ -286,11 +286,11 @@
286 /* reminders: 1) does not allocate.
287 2) we do this because changing a name
288 invalidates any login token because the old name
289 is part of the token hash.
290 */;
291 blob_append_sql(&sql, ", login=%Q", zNameNew);
292 ++gotFields;
293 }
294 }
295
296 if( zCap && *zCap ){
@@ -298,11 +298,11 @@
298 /* we "could" arguably silently ignore cap in this case. */
299 json_set_err(FSL_JSON_E_DENIED,
300 "Changing capabilities requires 'a' or 's' privileges.");
301 goto error;
302 }
303 blob_append_sql(&sql, ", cap=%Q", zCap);
304 ++gotFields;
305 }
306
307 if( zPW && *zPW ){
308 if(!g.perm.Admin && !g.perm.Setup && !g.perm.Password){
@@ -314,24 +314,24 @@
314 #define TRY_LOGIN_GROUP 0 /* login group support is not yet implemented. */
315 #if !TRY_LOGIN_GROUP
316 char * zPWHash = NULL;
317 ++gotFields;
318 zPWHash = sha1_shared_secret(zPW, zNameNew ? zNameNew : zName, NULL);
319 blob_append_sql(&sql, ", pw=%Q", zPWHash);
320 free(zPWHash);
321 #else
322 ++gotFields;
323 blob_append_sql(&sql, ", pw=coalesce(shared_secret(%Q,%Q,"
324 "(SELECT value FROM config WHERE name='project-code')))",
325 zPW, zNameNew ? zNameNew : zName);
326 /* shared_secret() func is undefined? */
327 #endif
328 }
329 }
330
331 if( zInfo ){
332 blob_append_sql(&sql, ", info=%Q", zInfo);
333 ++gotFields;
334 }
335
336 if((g.perm.Admin || g.perm.Setup)
337 && forceLogout && cson_value_get_bool(forceLogout)){
@@ -344,26 +344,26 @@
344 "Required user data are missing.");
345 goto error;
346 }
347 assert(uid>0);
348 #if !TRY_LOGIN_GROUP
349 blob_append_sql(&sql, " WHERE uid=%d", uid);
350 #else /* need name for login group support :/ */
351 blob_append_sql(&sql, " WHERE login=%Q", zName);
352 #endif
353 #if 0
354 puts(blob_str(&sql));
355 cson_output_FILE( cson_object_value(pUser), stdout, NULL );
356 #endif
357 db_prepare(&q, "%s", blob_sql_text(&sql));
358 db_exec(&q);
359 db_finalize(&q);
360 #if TRY_LOGIN_GROUP
361 if( zPW || cson_value_get_bool(forceLogout) ){
362 Blob groupSql = empty_blob;
363 char * zErr = NULL;
364 blob_append_sql(&groupSql,
365 "INSERT INTO user(login)"
366 " SELECT %Q WHERE NOT EXISTS(SELECT 1 FROM user WHERE login=%Q);",
367 zName, zName
368 );
369 blob_append(&groupSql, blob_str(&sql), blob_size(&sql));
370
+5 -6
--- src/json_wiki.c
+++ src/json_wiki.c
@@ -444,22 +444,21 @@
444444
" substr(tagname,6) as name"
445445
" FROM tag WHERE tagname GLOB 'wiki-*'",
446446
-1);
447447
zGlob = json_find_option_cstr("glob",NULL,"g");
448448
if(zGlob && *zGlob){
449
- blob_appendf(&sql," AND name %s GLOB %Q",
450
- fInvert ? "NOT" : "", zGlob);
449
+ blob_append_sql(&sql," AND name %s GLOB %Q",
450
+ fInvert ? "NOT" : "", zGlob);
451451
}else{
452452
zGlob = json_find_option_cstr("like",NULL,"l");
453453
if(zGlob && *zGlob){
454
- blob_appendf(&sql," AND name %s LIKE %Q",
455
- fInvert ? "NOT" : "",
456
- zGlob);
454
+ blob_append_sql(&sql," AND name %s LIKE %Q",
455
+ fInvert ? "NOT" : "", zGlob);
457456
}
458457
}
459458
blob_append(&sql," ORDER BY lower(name)", -1);
460
- db_prepare(&q,"%s", blob_str(&sql));
459
+ db_prepare(&q,"%s", blob_sql_text(&sql));
461460
blob_reset(&sql);
462461
listV = cson_value_new_array();
463462
list = cson_value_get_array(listV);
464463
while( SQLITE_ROW == db_step(&q) ){
465464
cson_value * v;
466465
--- src/json_wiki.c
+++ src/json_wiki.c
@@ -444,22 +444,21 @@
444 " substr(tagname,6) as name"
445 " FROM tag WHERE tagname GLOB 'wiki-*'",
446 -1);
447 zGlob = json_find_option_cstr("glob",NULL,"g");
448 if(zGlob && *zGlob){
449 blob_appendf(&sql," AND name %s GLOB %Q",
450 fInvert ? "NOT" : "", zGlob);
451 }else{
452 zGlob = json_find_option_cstr("like",NULL,"l");
453 if(zGlob && *zGlob){
454 blob_appendf(&sql," AND name %s LIKE %Q",
455 fInvert ? "NOT" : "",
456 zGlob);
457 }
458 }
459 blob_append(&sql," ORDER BY lower(name)", -1);
460 db_prepare(&q,"%s", blob_str(&sql));
461 blob_reset(&sql);
462 listV = cson_value_new_array();
463 list = cson_value_get_array(listV);
464 while( SQLITE_ROW == db_step(&q) ){
465 cson_value * v;
466
--- src/json_wiki.c
+++ src/json_wiki.c
@@ -444,22 +444,21 @@
444 " substr(tagname,6) as name"
445 " FROM tag WHERE tagname GLOB 'wiki-*'",
446 -1);
447 zGlob = json_find_option_cstr("glob",NULL,"g");
448 if(zGlob && *zGlob){
449 blob_append_sql(&sql," AND name %s GLOB %Q",
450 fInvert ? "NOT" : "", zGlob);
451 }else{
452 zGlob = json_find_option_cstr("like",NULL,"l");
453 if(zGlob && *zGlob){
454 blob_append_sql(&sql," AND name %s LIKE %Q",
455 fInvert ? "NOT" : "", zGlob);
 
456 }
457 }
458 blob_append(&sql," ORDER BY lower(name)", -1);
459 db_prepare(&q,"%s", blob_sql_text(&sql));
460 blob_reset(&sql);
461 listV = cson_value_new_array();
462 list = cson_value_get_array(listV);
463 while( SQLITE_ROW == db_step(&q) ){
464 cson_value * v;
465
+3 -2
--- src/leaf.c
+++ src/leaf.c
@@ -39,11 +39,12 @@
3939
@ AND coalesce((SELECT value FROM tagxref
4040
@ WHERE tagid=%d AND rid=plink.pid), 'trunk')
4141
@ =coalesce((SELECT value FROM tagxref
4242
@ WHERE tagid=%d AND rid=plink.cid), 'trunk')
4343
;
44
- rc = db_int(0, zSql, rid, TAG_BRANCH, TAG_BRANCH);
44
+ rc = db_int(0, zSql /*works-like:"%d,%d,%d"*/,
45
+ rid, TAG_BRANCH, TAG_BRANCH);
4546
return rc==0;
4647
}
4748
4849
/*
4950
** Count the number of primary non-branch children for the given check-in.
@@ -63,11 +64,11 @@
6364
@ AND coalesce((SELECT value FROM tagxref
6465
@ WHERE tagid=%d AND rid=plink.pid), 'trunk')
6566
@ =coalesce((SELECT value FROM tagxref
6667
@ WHERE tagid=%d AND rid=plink.cid), 'trunk')
6768
;
68
- db_static_prepare(&q, zSql, TAG_BRANCH, TAG_BRANCH);
69
+ db_static_prepare(&q, zSql /*works-like: "%d,%d"*/, TAG_BRANCH, TAG_BRANCH);
6970
db_bind_int(&q, ":pid", pid);
7071
if( db_step(&q)==SQLITE_ROW ){
7172
nNonBranch = db_column_int(&q, 0);
7273
}
7374
db_reset(&q);
7475
--- src/leaf.c
+++ src/leaf.c
@@ -39,11 +39,12 @@
39 @ AND coalesce((SELECT value FROM tagxref
40 @ WHERE tagid=%d AND rid=plink.pid), 'trunk')
41 @ =coalesce((SELECT value FROM tagxref
42 @ WHERE tagid=%d AND rid=plink.cid), 'trunk')
43 ;
44 rc = db_int(0, zSql, rid, TAG_BRANCH, TAG_BRANCH);
 
45 return rc==0;
46 }
47
48 /*
49 ** Count the number of primary non-branch children for the given check-in.
@@ -63,11 +64,11 @@
63 @ AND coalesce((SELECT value FROM tagxref
64 @ WHERE tagid=%d AND rid=plink.pid), 'trunk')
65 @ =coalesce((SELECT value FROM tagxref
66 @ WHERE tagid=%d AND rid=plink.cid), 'trunk')
67 ;
68 db_static_prepare(&q, zSql, TAG_BRANCH, TAG_BRANCH);
69 db_bind_int(&q, ":pid", pid);
70 if( db_step(&q)==SQLITE_ROW ){
71 nNonBranch = db_column_int(&q, 0);
72 }
73 db_reset(&q);
74
--- src/leaf.c
+++ src/leaf.c
@@ -39,11 +39,12 @@
39 @ AND coalesce((SELECT value FROM tagxref
40 @ WHERE tagid=%d AND rid=plink.pid), 'trunk')
41 @ =coalesce((SELECT value FROM tagxref
42 @ WHERE tagid=%d AND rid=plink.cid), 'trunk')
43 ;
44 rc = db_int(0, zSql /*works-like:"%d,%d,%d"*/,
45 rid, TAG_BRANCH, TAG_BRANCH);
46 return rc==0;
47 }
48
49 /*
50 ** Count the number of primary non-branch children for the given check-in.
@@ -63,11 +64,11 @@
64 @ AND coalesce((SELECT value FROM tagxref
65 @ WHERE tagid=%d AND rid=plink.pid), 'trunk')
66 @ =coalesce((SELECT value FROM tagxref
67 @ WHERE tagid=%d AND rid=plink.cid), 'trunk')
68 ;
69 db_static_prepare(&q, zSql /*works-like: "%d,%d"*/, TAG_BRANCH, TAG_BRANCH);
70 db_bind_int(&q, ":pid", pid);
71 if( db_step(&q)==SQLITE_ROW ){
72 nNonBranch = db_column_int(&q, 0);
73 }
74 db_reset(&q);
75
+8 -8
--- src/login.c
+++ src/login.c
@@ -1294,11 +1294,11 @@
12941294
}else{
12951295
char *zPw = sha1_shared_secret(blob_str(&passwd), blob_str(&login), 0);
12961296
int uid;
12971297
db_multi_exec(
12981298
"INSERT INTO user(login,pw,cap,info,mtime)"
1299
- "VALUES(%B,%Q,%B,%B,strftime('%s','now'))",
1299
+ "VALUES(%B,%Q,%B,%B,strftime('%%s','now'))",
13001300
&login, zPw, &caps, &contact
13011301
);
13021302
free(zPw);
13031303
13041304
/* The user is registered, now just log him in. */
@@ -1469,17 +1469,17 @@
14691469
*pzErrMsg = 0; /* Default to no errors */
14701470
zSelf = db_name("repository");
14711471
14721472
/* Get the full pathname of the other repository */
14731473
file_canonical_name(zRepo, &fullName, 0);
1474
- zRepo = mprintf(blob_str(&fullName));
1474
+ zRepo = fossil_strdup(blob_str(&fullName));
14751475
blob_reset(&fullName);
14761476
14771477
/* Get the full pathname for our repository. Also the project code
14781478
** and project name for ourself. */
14791479
file_canonical_name(g.zRepositoryName, &fullName, 0);
1480
- zSelfRepo = mprintf(blob_str(&fullName));
1480
+ zSelfRepo = fossil_strdup(blob_str(&fullName));
14811481
blob_reset(&fullName);
14821482
zSelfProjCode = db_get("project-code", "unknown");
14831483
zSelfLabel = db_get("project-name", 0);
14841484
if( zSelfLabel==0 ){
14851485
zSelfLabel = zSelfProjCode;
@@ -1500,11 +1500,11 @@
15001500
zRepo, &pOther,
15011501
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
15021502
g.zVfsName
15031503
);
15041504
if( rc!=SQLITE_OK ){
1505
- *pzErrMsg = mprintf(sqlite3_errmsg(pOther));
1505
+ *pzErrMsg = fossil_strdup(sqlite3_errmsg(pOther));
15061506
}else{
15071507
rc = sqlite3_exec(pOther, "SELECT count(*) FROM user", 0, 0, pzErrMsg);
15081508
}
15091509
sqlite3_close(pOther);
15101510
if( rc ) return;
@@ -1533,13 +1533,13 @@
15331533
*/
15341534
zSelfProjCode = abbreviated_project_code(zSelfProjCode);
15351535
zOtherProjCode = abbreviated_project_code(zOtherProjCode);
15361536
db_begin_transaction();
15371537
db_multi_exec(
1538
- "DELETE FROM %s.config WHERE name GLOB 'peer-*';"
1539
- "INSERT INTO %s.config(name,value) VALUES('peer-repo-%s',%Q);"
1540
- "INSERT INTO %s.config(name,value) "
1538
+ "DELETE FROM \"%w\".config WHERE name GLOB 'peer-*';"
1539
+ "INSERT INTO \"%w\".config(name,value) VALUES('peer-repo-%q',%Q);"
1540
+ "INSERT INTO \"%w\".config(name,value) "
15411541
" SELECT 'peer-name-%q', value FROM other.config"
15421542
" WHERE name='project-name';",
15431543
zSelf,
15441544
zSelf, zOtherProjCode, zRepo,
15451545
zSelf, zOtherProjCode
@@ -1550,11 +1550,11 @@
15501550
"INSERT OR IGNORE INTO other.config(name,value)"
15511551
" VALUES('login-group-code',lower(hex(randomblob(8))));",
15521552
zNewName
15531553
);
15541554
db_multi_exec(
1555
- "REPLACE INTO %s.config(name,value)"
1555
+ "REPLACE INTO \"%w\".config(name,value)"
15561556
" SELECT name, value FROM other.config"
15571557
" WHERE name GLOB 'peer-*' OR name GLOB 'login-group-*'",
15581558
zSelf
15591559
);
15601560
db_end_transaction(0);
15611561
--- src/login.c
+++ src/login.c
@@ -1294,11 +1294,11 @@
1294 }else{
1295 char *zPw = sha1_shared_secret(blob_str(&passwd), blob_str(&login), 0);
1296 int uid;
1297 db_multi_exec(
1298 "INSERT INTO user(login,pw,cap,info,mtime)"
1299 "VALUES(%B,%Q,%B,%B,strftime('%s','now'))",
1300 &login, zPw, &caps, &contact
1301 );
1302 free(zPw);
1303
1304 /* The user is registered, now just log him in. */
@@ -1469,17 +1469,17 @@
1469 *pzErrMsg = 0; /* Default to no errors */
1470 zSelf = db_name("repository");
1471
1472 /* Get the full pathname of the other repository */
1473 file_canonical_name(zRepo, &fullName, 0);
1474 zRepo = mprintf(blob_str(&fullName));
1475 blob_reset(&fullName);
1476
1477 /* Get the full pathname for our repository. Also the project code
1478 ** and project name for ourself. */
1479 file_canonical_name(g.zRepositoryName, &fullName, 0);
1480 zSelfRepo = mprintf(blob_str(&fullName));
1481 blob_reset(&fullName);
1482 zSelfProjCode = db_get("project-code", "unknown");
1483 zSelfLabel = db_get("project-name", 0);
1484 if( zSelfLabel==0 ){
1485 zSelfLabel = zSelfProjCode;
@@ -1500,11 +1500,11 @@
1500 zRepo, &pOther,
1501 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
1502 g.zVfsName
1503 );
1504 if( rc!=SQLITE_OK ){
1505 *pzErrMsg = mprintf(sqlite3_errmsg(pOther));
1506 }else{
1507 rc = sqlite3_exec(pOther, "SELECT count(*) FROM user", 0, 0, pzErrMsg);
1508 }
1509 sqlite3_close(pOther);
1510 if( rc ) return;
@@ -1533,13 +1533,13 @@
1533 */
1534 zSelfProjCode = abbreviated_project_code(zSelfProjCode);
1535 zOtherProjCode = abbreviated_project_code(zOtherProjCode);
1536 db_begin_transaction();
1537 db_multi_exec(
1538 "DELETE FROM %s.config WHERE name GLOB 'peer-*';"
1539 "INSERT INTO %s.config(name,value) VALUES('peer-repo-%s',%Q);"
1540 "INSERT INTO %s.config(name,value) "
1541 " SELECT 'peer-name-%q', value FROM other.config"
1542 " WHERE name='project-name';",
1543 zSelf,
1544 zSelf, zOtherProjCode, zRepo,
1545 zSelf, zOtherProjCode
@@ -1550,11 +1550,11 @@
1550 "INSERT OR IGNORE INTO other.config(name,value)"
1551 " VALUES('login-group-code',lower(hex(randomblob(8))));",
1552 zNewName
1553 );
1554 db_multi_exec(
1555 "REPLACE INTO %s.config(name,value)"
1556 " SELECT name, value FROM other.config"
1557 " WHERE name GLOB 'peer-*' OR name GLOB 'login-group-*'",
1558 zSelf
1559 );
1560 db_end_transaction(0);
1561
--- src/login.c
+++ src/login.c
@@ -1294,11 +1294,11 @@
1294 }else{
1295 char *zPw = sha1_shared_secret(blob_str(&passwd), blob_str(&login), 0);
1296 int uid;
1297 db_multi_exec(
1298 "INSERT INTO user(login,pw,cap,info,mtime)"
1299 "VALUES(%B,%Q,%B,%B,strftime('%%s','now'))",
1300 &login, zPw, &caps, &contact
1301 );
1302 free(zPw);
1303
1304 /* The user is registered, now just log him in. */
@@ -1469,17 +1469,17 @@
1469 *pzErrMsg = 0; /* Default to no errors */
1470 zSelf = db_name("repository");
1471
1472 /* Get the full pathname of the other repository */
1473 file_canonical_name(zRepo, &fullName, 0);
1474 zRepo = fossil_strdup(blob_str(&fullName));
1475 blob_reset(&fullName);
1476
1477 /* Get the full pathname for our repository. Also the project code
1478 ** and project name for ourself. */
1479 file_canonical_name(g.zRepositoryName, &fullName, 0);
1480 zSelfRepo = fossil_strdup(blob_str(&fullName));
1481 blob_reset(&fullName);
1482 zSelfProjCode = db_get("project-code", "unknown");
1483 zSelfLabel = db_get("project-name", 0);
1484 if( zSelfLabel==0 ){
1485 zSelfLabel = zSelfProjCode;
@@ -1500,11 +1500,11 @@
1500 zRepo, &pOther,
1501 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
1502 g.zVfsName
1503 );
1504 if( rc!=SQLITE_OK ){
1505 *pzErrMsg = fossil_strdup(sqlite3_errmsg(pOther));
1506 }else{
1507 rc = sqlite3_exec(pOther, "SELECT count(*) FROM user", 0, 0, pzErrMsg);
1508 }
1509 sqlite3_close(pOther);
1510 if( rc ) return;
@@ -1533,13 +1533,13 @@
1533 */
1534 zSelfProjCode = abbreviated_project_code(zSelfProjCode);
1535 zOtherProjCode = abbreviated_project_code(zOtherProjCode);
1536 db_begin_transaction();
1537 db_multi_exec(
1538 "DELETE FROM \"%w\".config WHERE name GLOB 'peer-*';"
1539 "INSERT INTO \"%w\".config(name,value) VALUES('peer-repo-%q',%Q);"
1540 "INSERT INTO \"%w\".config(name,value) "
1541 " SELECT 'peer-name-%q', value FROM other.config"
1542 " WHERE name='project-name';",
1543 zSelf,
1544 zSelf, zOtherProjCode, zRepo,
1545 zSelf, zOtherProjCode
@@ -1550,11 +1550,11 @@
1550 "INSERT OR IGNORE INTO other.config(name,value)"
1551 " VALUES('login-group-code',lower(hex(randomblob(8))));",
1552 zNewName
1553 );
1554 db_multi_exec(
1555 "REPLACE INTO \"%w\".config(name,value)"
1556 " SELECT name, value FROM other.config"
1557 " WHERE name GLOB 'peer-*' OR name GLOB 'login-group-*'",
1558 zSelf
1559 );
1560 db_end_transaction(0);
1561
+4 -4
--- src/main.c
+++ src/main.c
@@ -169,11 +169,11 @@
169169
int xlinkClusterOnly; /* Set when cloning. Only process clusters */
170170
int fTimeFormat; /* 1 for UTC. 2 for localtime. 0 not yet selected */
171171
int *aCommitFile; /* Array of files to be committed */
172172
int markPrivate; /* All new artifacts are private if true */
173173
int clockSkewSeen; /* True if clocks on client and server out of sync */
174
- int wikiFlags; /* Wiki conversion flags applied to %w and %W */
174
+ int wikiFlags; /* Wiki conversion flags applied to %W */
175175
char isHTTP; /* True if server/CGI modes, else assume CLI. */
176176
char javascriptHyperlink; /* If true, set href= using script, not HTML */
177177
Blob httpHeader; /* Complete text of the HTTP request header */
178178
UrlData url; /* Information about current URL */
179179
const char *zLogin; /* Login name. NULL or "" if not logged in. */
@@ -1721,19 +1721,19 @@
17211721
if( fossil_strcmp(azRedirect[i*2],"*")==0 ){
17221722
zNotFound = azRedirect[i*2+1];
17231723
continue;
17241724
}
17251725
db_open_repository(azRedirect[i*2]);
1726
- if( db_exists("SELECT 1 FROM blob WHERE uuid GLOB '%s*'", zName) ){
1727
- cgi_redirectf(azRedirect[i*2+1], zName);
1726
+ if( db_exists("SELECT 1 FROM blob WHERE uuid GLOB '%q*'", zName) ){
1727
+ cgi_redirectf(azRedirect[i*2+1] /*works-like:"%s"*/, zName);
17281728
return;
17291729
}
17301730
db_close(1);
17311731
}
17321732
}
17331733
if( zNotFound ){
1734
- cgi_redirectf(zNotFound, zName);
1734
+ cgi_redirectf(zNotFound /*works-like:"%s"*/, zName);
17351735
}else{
17361736
@ <html>
17371737
@ <head><title>No Such Object</title></head>
17381738
@ <body>
17391739
@ <p>No such object: <b>%h(zName)</b></p>
17401740
--- src/main.c
+++ src/main.c
@@ -169,11 +169,11 @@
169 int xlinkClusterOnly; /* Set when cloning. Only process clusters */
170 int fTimeFormat; /* 1 for UTC. 2 for localtime. 0 not yet selected */
171 int *aCommitFile; /* Array of files to be committed */
172 int markPrivate; /* All new artifacts are private if true */
173 int clockSkewSeen; /* True if clocks on client and server out of sync */
174 int wikiFlags; /* Wiki conversion flags applied to %w and %W */
175 char isHTTP; /* True if server/CGI modes, else assume CLI. */
176 char javascriptHyperlink; /* If true, set href= using script, not HTML */
177 Blob httpHeader; /* Complete text of the HTTP request header */
178 UrlData url; /* Information about current URL */
179 const char *zLogin; /* Login name. NULL or "" if not logged in. */
@@ -1721,19 +1721,19 @@
1721 if( fossil_strcmp(azRedirect[i*2],"*")==0 ){
1722 zNotFound = azRedirect[i*2+1];
1723 continue;
1724 }
1725 db_open_repository(azRedirect[i*2]);
1726 if( db_exists("SELECT 1 FROM blob WHERE uuid GLOB '%s*'", zName) ){
1727 cgi_redirectf(azRedirect[i*2+1], zName);
1728 return;
1729 }
1730 db_close(1);
1731 }
1732 }
1733 if( zNotFound ){
1734 cgi_redirectf(zNotFound, zName);
1735 }else{
1736 @ <html>
1737 @ <head><title>No Such Object</title></head>
1738 @ <body>
1739 @ <p>No such object: <b>%h(zName)</b></p>
1740
--- src/main.c
+++ src/main.c
@@ -169,11 +169,11 @@
169 int xlinkClusterOnly; /* Set when cloning. Only process clusters */
170 int fTimeFormat; /* 1 for UTC. 2 for localtime. 0 not yet selected */
171 int *aCommitFile; /* Array of files to be committed */
172 int markPrivate; /* All new artifacts are private if true */
173 int clockSkewSeen; /* True if clocks on client and server out of sync */
174 int wikiFlags; /* Wiki conversion flags applied to %W */
175 char isHTTP; /* True if server/CGI modes, else assume CLI. */
176 char javascriptHyperlink; /* If true, set href= using script, not HTML */
177 Blob httpHeader; /* Complete text of the HTTP request header */
178 UrlData url; /* Information about current URL */
179 const char *zLogin; /* Login name. NULL or "" if not logged in. */
@@ -1721,19 +1721,19 @@
1721 if( fossil_strcmp(azRedirect[i*2],"*")==0 ){
1722 zNotFound = azRedirect[i*2+1];
1723 continue;
1724 }
1725 db_open_repository(azRedirect[i*2]);
1726 if( db_exists("SELECT 1 FROM blob WHERE uuid GLOB '%q*'", zName) ){
1727 cgi_redirectf(azRedirect[i*2+1] /*works-like:"%s"*/, zName);
1728 return;
1729 }
1730 db_close(1);
1731 }
1732 }
1733 if( zNotFound ){
1734 cgi_redirectf(zNotFound /*works-like:"%s"*/, zName);
1735 }else{
1736 @ <html>
1737 @ <head><title>No Such Object</title></head>
1738 @ <body>
1739 @ <p>No such object: <b>%h(zName)</b></p>
1740
+8 -1
--- src/main.mk
+++ src/main.mk
@@ -360,10 +360,13 @@
360360
361361
install: $(APPNAME)
362362
mkdir -p $(INSTALLDIR)
363363
mv $(APPNAME) $(INSTALLDIR)
364364
365
+codecheck: $(TRANS_SRC) $(OBJDIR)/codecheck1
366
+ $(OBJDIR)/codecheck1 $(TRANS_SRC)
367
+
365368
$(OBJDIR):
366369
-mkdir $(OBJDIR)
367370
368371
$(OBJDIR)/translate: $(SRCDIR)/translate.c
369372
$(BCC) -o $(OBJDIR)/translate $(SRCDIR)/translate.c
@@ -375,10 +378,13 @@
375378
$(BCC) -o $(OBJDIR)/mkindex $(SRCDIR)/mkindex.c
376379
377380
$(OBJDIR)/mkversion: $(SRCDIR)/mkversion.c
378381
$(BCC) -o $(OBJDIR)/mkversion $(SRCDIR)/mkversion.c
379382
383
+$(OBJDIR)/codecheck1: $(SRCDIR)/codecheck1.c
384
+ $(BCC) -o $(OBJDIR)/codecheck1 $(SRCDIR)/codecheck1.c
385
+
380386
# WARNING. DANGER. Running the test suite modifies the repository the
381387
# build is done from, i.e. the checkout belongs to. Do not sync/push
382388
# the repository after running the tests.
383389
test: $(OBJDIR) $(APPNAME)
384390
$(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -430,11 +436,12 @@
430436
$(OBJDIR)/th_lang.o \
431437
$(OBJDIR)/th_tcl.o \
432438
$(OBJDIR)/cson_amalgamation.o
433439
434440
435
-$(APPNAME): $(OBJDIR)/headers $(OBJ) $(EXTRAOBJ)
441
+$(APPNAME): $(OBJDIR)/headers $(OBJDIR)/codecheck1 $(OBJ) $(EXTRAOBJ)
442
+ $(OBJDIR)/codecheck1 $(TRANS_SRC)
436443
$(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB)
437444
438445
# This rule prevents make from using its default rules to try build
439446
# an executable named "manifest" out of the file named "manifest.c"
440447
#
441448
--- src/main.mk
+++ src/main.mk
@@ -360,10 +360,13 @@
360
361 install: $(APPNAME)
362 mkdir -p $(INSTALLDIR)
363 mv $(APPNAME) $(INSTALLDIR)
364
 
 
 
365 $(OBJDIR):
366 -mkdir $(OBJDIR)
367
368 $(OBJDIR)/translate: $(SRCDIR)/translate.c
369 $(BCC) -o $(OBJDIR)/translate $(SRCDIR)/translate.c
@@ -375,10 +378,13 @@
375 $(BCC) -o $(OBJDIR)/mkindex $(SRCDIR)/mkindex.c
376
377 $(OBJDIR)/mkversion: $(SRCDIR)/mkversion.c
378 $(BCC) -o $(OBJDIR)/mkversion $(SRCDIR)/mkversion.c
379
 
 
 
380 # WARNING. DANGER. Running the test suite modifies the repository the
381 # build is done from, i.e. the checkout belongs to. Do not sync/push
382 # the repository after running the tests.
383 test: $(OBJDIR) $(APPNAME)
384 $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -430,11 +436,12 @@
430 $(OBJDIR)/th_lang.o \
431 $(OBJDIR)/th_tcl.o \
432 $(OBJDIR)/cson_amalgamation.o
433
434
435 $(APPNAME): $(OBJDIR)/headers $(OBJ) $(EXTRAOBJ)
 
436 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB)
437
438 # This rule prevents make from using its default rules to try build
439 # an executable named "manifest" out of the file named "manifest.c"
440 #
441
--- src/main.mk
+++ src/main.mk
@@ -360,10 +360,13 @@
360
361 install: $(APPNAME)
362 mkdir -p $(INSTALLDIR)
363 mv $(APPNAME) $(INSTALLDIR)
364
365 codecheck: $(TRANS_SRC) $(OBJDIR)/codecheck1
366 $(OBJDIR)/codecheck1 $(TRANS_SRC)
367
368 $(OBJDIR):
369 -mkdir $(OBJDIR)
370
371 $(OBJDIR)/translate: $(SRCDIR)/translate.c
372 $(BCC) -o $(OBJDIR)/translate $(SRCDIR)/translate.c
@@ -375,10 +378,13 @@
378 $(BCC) -o $(OBJDIR)/mkindex $(SRCDIR)/mkindex.c
379
380 $(OBJDIR)/mkversion: $(SRCDIR)/mkversion.c
381 $(BCC) -o $(OBJDIR)/mkversion $(SRCDIR)/mkversion.c
382
383 $(OBJDIR)/codecheck1: $(SRCDIR)/codecheck1.c
384 $(BCC) -o $(OBJDIR)/codecheck1 $(SRCDIR)/codecheck1.c
385
386 # WARNING. DANGER. Running the test suite modifies the repository the
387 # build is done from, i.e. the checkout belongs to. Do not sync/push
388 # the repository after running the tests.
389 test: $(OBJDIR) $(APPNAME)
390 $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -430,11 +436,12 @@
436 $(OBJDIR)/th_lang.o \
437 $(OBJDIR)/th_tcl.o \
438 $(OBJDIR)/cson_amalgamation.o
439
440
441 $(APPNAME): $(OBJDIR)/headers $(OBJDIR)/codecheck1 $(OBJ) $(EXTRAOBJ)
442 $(OBJDIR)/codecheck1 $(TRANS_SRC)
443 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB)
444
445 # This rule prevents make from using its default rules to try build
446 # an executable named "manifest" out of the file named "manifest.c"
447 #
448
+31 -8
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -241,10 +241,13 @@
241241
242242
install: $(APPNAME)
243243
mkdir -p $(INSTALLDIR)
244244
mv $(APPNAME) $(INSTALLDIR)
245245
246
+codecheck: $(TRANS_SRC) $(OBJDIR)/codecheck1
247
+ $(OBJDIR)/codecheck1 $(TRANS_SRC)
248
+
246249
$(OBJDIR):
247250
-mkdir $(OBJDIR)
248251
249252
$(OBJDIR)/translate: $(SRCDIR)/translate.c
250253
$(BCC) -o $(OBJDIR)/translate $(SRCDIR)/translate.c
@@ -256,10 +259,13 @@
256259
$(BCC) -o $(OBJDIR)/mkindex $(SRCDIR)/mkindex.c
257260
258261
$(OBJDIR)/mkversion: $(SRCDIR)/mkversion.c
259262
$(BCC) -o $(OBJDIR)/mkversion $(SRCDIR)/mkversion.c
260263
264
+$(OBJDIR)/codecheck1: $(SRCDIR)/codecheck1.c
265
+ $(BCC) -o $(OBJDIR)/codecheck1 $(SRCDIR)/codecheck1.c
266
+
261267
# WARNING. DANGER. Running the test suite modifies the repository the
262268
# build is done from, i.e. the checkout belongs to. Do not sync/push
263269
# the repository after running the tests.
264270
test: $(OBJDIR) $(APPNAME)
265271
$(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -304,11 +310,12 @@
304310
$(OBJDIR)/th_tcl.o <<<NEXT_LINE>>>
305311
$(OBJDIR)/cson_amalgamation.o
306312
}]
307313
308314
writeln {
309
-$(APPNAME): $(OBJDIR)/headers $(OBJ) $(EXTRAOBJ)
315
+$(APPNAME): $(OBJDIR)/headers $(OBJDIR)/codecheck1 $(OBJ) $(EXTRAOBJ)
316
+ $(OBJDIR)/codecheck1 $(TRANS_SRC)
310317
$(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB)
311318
312319
# This rule prevents make from using its default rules to try build
313320
# an executable named "manifest" out of the file named "manifest.c"
314321
#
@@ -753,10 +760,11 @@
753760
ifdef USE_WINDOWS
754761
TRANSLATE = $(subst /,\,$(OBJDIR)/translate.exe)
755762
MAKEHEADERS = $(subst /,\,$(OBJDIR)/makeheaders.exe)
756763
MKINDEX = $(subst /,\,$(OBJDIR)/mkindex.exe)
757764
VERSION = $(subst /,\,$(OBJDIR)/version.exe)
765
+CODECHECK1 = $(subst /,\,$(OBJDIR)/codecheck1.exe)
758766
CAT = type
759767
CP = copy
760768
GREP = find
761769
MV = copy
762770
RM = del /Q
@@ -765,10 +773,11 @@
765773
else
766774
TRANSLATE = $(OBJDIR)/translate.exe
767775
MAKEHEADERS = $(OBJDIR)/makeheaders.exe
768776
MKINDEX = $(OBJDIR)/mkindex.exe
769777
VERSION = $(OBJDIR)/version.exe
778
+CODECHECK1 = $(OBJDIR)/codecheck1.exe
770779
CAT = cat
771780
CP = cp
772781
GREP = grep
773782
MV = mv
774783
RM = rm -f
@@ -819,10 +828,13 @@
819828
$(BCC) -o $(MKINDEX) $(SRCDIR)/mkindex.c
820829
821830
$(VERSION): $(SRCDIR)/mkversion.c
822831
$(BCC) -o $(VERSION) $(SRCDIR)/mkversion.c
823832
833
+$(CODECHECK1): $(SRCDIR)/codecheck1.c
834
+ $(BCC) -o $(CODECHECK1) $(SRCDIR)/codecheck1.c
835
+
824836
# WARNING. DANGER. Running the test suite modifies the repository the
825837
# build is done from, i.e. the checkout belongs to. Do not sync/push
826838
# the repository after running the tests.
827839
test: $(OBJDIR) $(APPNAME)
828840
$(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -886,11 +898,12 @@
886898
887899
ifdef FOSSIL_BUILD_SSL
888900
APPTARGETS += openssl
889901
endif
890902
891
-$(APPNAME): $(OBJDIR)/headers $(OBJ) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
903
+$(APPNAME): $(OBJDIR)/headers $(OBJ) $(CODECHECK1) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
904
+ $(CODECHECK1) $(TRANS_SRC)
892905
$(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) $(OBJDIR)/fossil.o
893906
894907
# This rule prevents make from using its default rules to try build
895908
# an executable named "manifest" out of the file named "manifest.c"
896909
#
@@ -1037,12 +1050,13 @@
10371050
10381051
APPNAME = $(OBJDIR)\fossil$(E)
10391052
10401053
all: $(APPNAME)
10411054
1042
-$(APPNAME) : translate$E mkindex$E headers $(OBJ) $(OBJDIR)\link
1055
+$(APPNAME) : translate$E mkindex$E codecheck1$E headers $(OBJ) $(OBJDIR)\link
10431056
cd $(OBJDIR)
1057
+ codecheck1$E $(SRC)
10441058
$(DMDIR)\bin\link @link
10451059
10461060
$(OBJDIR)\fossil.res: $B\win\fossil.rc
10471061
$(RC) $(RCFLAGS) -o$@ $**
10481062
@@ -1066,11 +1080,14 @@
10661080
$(BCC) -o$@ $**
10671081
10681082
mkindex$E: $(SRCDIR)\mkindex.c
10691083
$(BCC) -o$@ $**
10701084
1071
-version$E: $B\src\mkversion.c
1085
+mkversion$E: $(SRCDIR)\mkversion.c
1086
+ $(BCC) -o$@ $**
1087
+
1088
+codecheck1$E: $(SRCDIR)\codecheck1.c
10721089
$(BCC) -o$@ $**
10731090
10741091
$(OBJDIR)\shell$O : $(SRCDIR)\shell.c
10751092
$(TCC) -o$@ -c $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) $**
10761093
@@ -1084,11 +1101,11 @@
10841101
$(TCC) -o$@ -c $**
10851102
10861103
$(OBJDIR)\cson_amalgamation.h : $(SRCDIR)\cson_amalgamation.h
10871104
cp $@ $@
10881105
1089
-VERSION.h : version$E $B\manifest.uuid $B\manifest $B\VERSION
1106
+VERSION.h : mkversion$E $B\manifest.uuid $B\manifest $B\VERSION
10901107
+$** > $@
10911108
10921109
page_index.h: mkindex$E $(SRC)
10931110
+$** > $@
10941111
@@ -1095,11 +1112,11 @@
10951112
clean:
10961113
-del $(OBJDIR)\*.obj
10971114
-del *.obj *_.c *.h *.map
10981115
10991116
realclean:
1100
- -del $(APPNAME) translate$E mkindex$E makeheaders$E mkversion$E
1117
+ -del $(APPNAME) translate$E mkindex$E makeheaders$E mkversion$E codecheck1$E
11011118
11021119
$(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
11031120
$(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
11041121
$(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
11051122
$(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
@@ -1398,12 +1415,13 @@
13981415
!ifdef FOSSIL_BUILD_SSL
13991416
APPTARGETS = $(APPTARGETS) openssl
14001417
!endif
14011418
!endif
14021419
1403
-$(APPNAME) : $(APPTARGETS) translate$E mkindex$E headers $(OBJ) $(OX)\linkopts
1420
+$(APPNAME) : $(APPTARGETS) translate$E mkindex$E codecheck1$E headers $(OBJ) $(OX)\linkopts
14041421
cd $(OX)
1422
+ codecheck1$E $(SRC)
14051423
link $(LDFLAGS) /OUT:$@ $(LIBDIR) Wsetargv.obj fossil.res @linkopts
14061424
14071425
$(OX)\linkopts: $B\win\Makefile.msc}
14081426
set redir {>}
14091427
foreach s [lsort [concat $src $AdditionalObj]] {
@@ -1426,11 +1444,14 @@
14261444
$(BCC) $**
14271445
14281446
mkindex$E: $(SRCDIR)\mkindex.c
14291447
$(BCC) $**
14301448
1431
-mkversion$E: $B\src\mkversion.c
1449
+mkversion$E: $(SRCDIR)\mkversion.c
1450
+ $(BCC) $**
1451
+
1452
+codecheck1$E: $(SRCDIR)\codecheck1.c
14321453
$(BCC) $**
14331454
14341455
$(OX)\shell$O : $(SRCDIR)\shell.c $B\win\Makefile.msc
14351456
$(TCC) /Fo$@ $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) -c $(SRCDIR)\shell.c
14361457
@@ -1478,10 +1499,12 @@
14781499
-del mkindex$P
14791500
-del makeheaders$E
14801501
-del makeheaders$P
14811502
-del mkversion$E
14821503
-del mkversion$P
1504
+ -del codecheck1$E
1505
+ -del codecheck1$P
14831506
14841507
$(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
14851508
$(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
14861509
$(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
14871510
$(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
14881511
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -241,10 +241,13 @@
241
242 install: $(APPNAME)
243 mkdir -p $(INSTALLDIR)
244 mv $(APPNAME) $(INSTALLDIR)
245
 
 
 
246 $(OBJDIR):
247 -mkdir $(OBJDIR)
248
249 $(OBJDIR)/translate: $(SRCDIR)/translate.c
250 $(BCC) -o $(OBJDIR)/translate $(SRCDIR)/translate.c
@@ -256,10 +259,13 @@
256 $(BCC) -o $(OBJDIR)/mkindex $(SRCDIR)/mkindex.c
257
258 $(OBJDIR)/mkversion: $(SRCDIR)/mkversion.c
259 $(BCC) -o $(OBJDIR)/mkversion $(SRCDIR)/mkversion.c
260
 
 
 
261 # WARNING. DANGER. Running the test suite modifies the repository the
262 # build is done from, i.e. the checkout belongs to. Do not sync/push
263 # the repository after running the tests.
264 test: $(OBJDIR) $(APPNAME)
265 $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -304,11 +310,12 @@
304 $(OBJDIR)/th_tcl.o <<<NEXT_LINE>>>
305 $(OBJDIR)/cson_amalgamation.o
306 }]
307
308 writeln {
309 $(APPNAME): $(OBJDIR)/headers $(OBJ) $(EXTRAOBJ)
 
310 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB)
311
312 # This rule prevents make from using its default rules to try build
313 # an executable named "manifest" out of the file named "manifest.c"
314 #
@@ -753,10 +760,11 @@
753 ifdef USE_WINDOWS
754 TRANSLATE = $(subst /,\,$(OBJDIR)/translate.exe)
755 MAKEHEADERS = $(subst /,\,$(OBJDIR)/makeheaders.exe)
756 MKINDEX = $(subst /,\,$(OBJDIR)/mkindex.exe)
757 VERSION = $(subst /,\,$(OBJDIR)/version.exe)
 
758 CAT = type
759 CP = copy
760 GREP = find
761 MV = copy
762 RM = del /Q
@@ -765,10 +773,11 @@
765 else
766 TRANSLATE = $(OBJDIR)/translate.exe
767 MAKEHEADERS = $(OBJDIR)/makeheaders.exe
768 MKINDEX = $(OBJDIR)/mkindex.exe
769 VERSION = $(OBJDIR)/version.exe
 
770 CAT = cat
771 CP = cp
772 GREP = grep
773 MV = mv
774 RM = rm -f
@@ -819,10 +828,13 @@
819 $(BCC) -o $(MKINDEX) $(SRCDIR)/mkindex.c
820
821 $(VERSION): $(SRCDIR)/mkversion.c
822 $(BCC) -o $(VERSION) $(SRCDIR)/mkversion.c
823
 
 
 
824 # WARNING. DANGER. Running the test suite modifies the repository the
825 # build is done from, i.e. the checkout belongs to. Do not sync/push
826 # the repository after running the tests.
827 test: $(OBJDIR) $(APPNAME)
828 $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -886,11 +898,12 @@
886
887 ifdef FOSSIL_BUILD_SSL
888 APPTARGETS += openssl
889 endif
890
891 $(APPNAME): $(OBJDIR)/headers $(OBJ) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
 
892 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) $(OBJDIR)/fossil.o
893
894 # This rule prevents make from using its default rules to try build
895 # an executable named "manifest" out of the file named "manifest.c"
896 #
@@ -1037,12 +1050,13 @@
1037
1038 APPNAME = $(OBJDIR)\fossil$(E)
1039
1040 all: $(APPNAME)
1041
1042 $(APPNAME) : translate$E mkindex$E headers $(OBJ) $(OBJDIR)\link
1043 cd $(OBJDIR)
 
1044 $(DMDIR)\bin\link @link
1045
1046 $(OBJDIR)\fossil.res: $B\win\fossil.rc
1047 $(RC) $(RCFLAGS) -o$@ $**
1048
@@ -1066,11 +1080,14 @@
1066 $(BCC) -o$@ $**
1067
1068 mkindex$E: $(SRCDIR)\mkindex.c
1069 $(BCC) -o$@ $**
1070
1071 version$E: $B\src\mkversion.c
 
 
 
1072 $(BCC) -o$@ $**
1073
1074 $(OBJDIR)\shell$O : $(SRCDIR)\shell.c
1075 $(TCC) -o$@ -c $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) $**
1076
@@ -1084,11 +1101,11 @@
1084 $(TCC) -o$@ -c $**
1085
1086 $(OBJDIR)\cson_amalgamation.h : $(SRCDIR)\cson_amalgamation.h
1087 cp $@ $@
1088
1089 VERSION.h : version$E $B\manifest.uuid $B\manifest $B\VERSION
1090 +$** > $@
1091
1092 page_index.h: mkindex$E $(SRC)
1093 +$** > $@
1094
@@ -1095,11 +1112,11 @@
1095 clean:
1096 -del $(OBJDIR)\*.obj
1097 -del *.obj *_.c *.h *.map
1098
1099 realclean:
1100 -del $(APPNAME) translate$E mkindex$E makeheaders$E mkversion$E
1101
1102 $(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
1103 $(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
1104 $(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
1105 $(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
@@ -1398,12 +1415,13 @@
1398 !ifdef FOSSIL_BUILD_SSL
1399 APPTARGETS = $(APPTARGETS) openssl
1400 !endif
1401 !endif
1402
1403 $(APPNAME) : $(APPTARGETS) translate$E mkindex$E headers $(OBJ) $(OX)\linkopts
1404 cd $(OX)
 
1405 link $(LDFLAGS) /OUT:$@ $(LIBDIR) Wsetargv.obj fossil.res @linkopts
1406
1407 $(OX)\linkopts: $B\win\Makefile.msc}
1408 set redir {>}
1409 foreach s [lsort [concat $src $AdditionalObj]] {
@@ -1426,11 +1444,14 @@
1426 $(BCC) $**
1427
1428 mkindex$E: $(SRCDIR)\mkindex.c
1429 $(BCC) $**
1430
1431 mkversion$E: $B\src\mkversion.c
 
 
 
1432 $(BCC) $**
1433
1434 $(OX)\shell$O : $(SRCDIR)\shell.c $B\win\Makefile.msc
1435 $(TCC) /Fo$@ $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) -c $(SRCDIR)\shell.c
1436
@@ -1478,10 +1499,12 @@
1478 -del mkindex$P
1479 -del makeheaders$E
1480 -del makeheaders$P
1481 -del mkversion$E
1482 -del mkversion$P
 
 
1483
1484 $(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
1485 $(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
1486 $(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
1487 $(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
1488
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -241,10 +241,13 @@
241
242 install: $(APPNAME)
243 mkdir -p $(INSTALLDIR)
244 mv $(APPNAME) $(INSTALLDIR)
245
246 codecheck: $(TRANS_SRC) $(OBJDIR)/codecheck1
247 $(OBJDIR)/codecheck1 $(TRANS_SRC)
248
249 $(OBJDIR):
250 -mkdir $(OBJDIR)
251
252 $(OBJDIR)/translate: $(SRCDIR)/translate.c
253 $(BCC) -o $(OBJDIR)/translate $(SRCDIR)/translate.c
@@ -256,10 +259,13 @@
259 $(BCC) -o $(OBJDIR)/mkindex $(SRCDIR)/mkindex.c
260
261 $(OBJDIR)/mkversion: $(SRCDIR)/mkversion.c
262 $(BCC) -o $(OBJDIR)/mkversion $(SRCDIR)/mkversion.c
263
264 $(OBJDIR)/codecheck1: $(SRCDIR)/codecheck1.c
265 $(BCC) -o $(OBJDIR)/codecheck1 $(SRCDIR)/codecheck1.c
266
267 # WARNING. DANGER. Running the test suite modifies the repository the
268 # build is done from, i.e. the checkout belongs to. Do not sync/push
269 # the repository after running the tests.
270 test: $(OBJDIR) $(APPNAME)
271 $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -304,11 +310,12 @@
310 $(OBJDIR)/th_tcl.o <<<NEXT_LINE>>>
311 $(OBJDIR)/cson_amalgamation.o
312 }]
313
314 writeln {
315 $(APPNAME): $(OBJDIR)/headers $(OBJDIR)/codecheck1 $(OBJ) $(EXTRAOBJ)
316 $(OBJDIR)/codecheck1 $(TRANS_SRC)
317 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB)
318
319 # This rule prevents make from using its default rules to try build
320 # an executable named "manifest" out of the file named "manifest.c"
321 #
@@ -753,10 +760,11 @@
760 ifdef USE_WINDOWS
761 TRANSLATE = $(subst /,\,$(OBJDIR)/translate.exe)
762 MAKEHEADERS = $(subst /,\,$(OBJDIR)/makeheaders.exe)
763 MKINDEX = $(subst /,\,$(OBJDIR)/mkindex.exe)
764 VERSION = $(subst /,\,$(OBJDIR)/version.exe)
765 CODECHECK1 = $(subst /,\,$(OBJDIR)/codecheck1.exe)
766 CAT = type
767 CP = copy
768 GREP = find
769 MV = copy
770 RM = del /Q
@@ -765,10 +773,11 @@
773 else
774 TRANSLATE = $(OBJDIR)/translate.exe
775 MAKEHEADERS = $(OBJDIR)/makeheaders.exe
776 MKINDEX = $(OBJDIR)/mkindex.exe
777 VERSION = $(OBJDIR)/version.exe
778 CODECHECK1 = $(OBJDIR)/codecheck1.exe
779 CAT = cat
780 CP = cp
781 GREP = grep
782 MV = mv
783 RM = rm -f
@@ -819,10 +828,13 @@
828 $(BCC) -o $(MKINDEX) $(SRCDIR)/mkindex.c
829
830 $(VERSION): $(SRCDIR)/mkversion.c
831 $(BCC) -o $(VERSION) $(SRCDIR)/mkversion.c
832
833 $(CODECHECK1): $(SRCDIR)/codecheck1.c
834 $(BCC) -o $(CODECHECK1) $(SRCDIR)/codecheck1.c
835
836 # WARNING. DANGER. Running the test suite modifies the repository the
837 # build is done from, i.e. the checkout belongs to. Do not sync/push
838 # the repository after running the tests.
839 test: $(OBJDIR) $(APPNAME)
840 $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -886,11 +898,12 @@
898
899 ifdef FOSSIL_BUILD_SSL
900 APPTARGETS += openssl
901 endif
902
903 $(APPNAME): $(OBJDIR)/headers $(OBJ) $(CODECHECK1) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
904 $(CODECHECK1) $(TRANS_SRC)
905 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) $(OBJDIR)/fossil.o
906
907 # This rule prevents make from using its default rules to try build
908 # an executable named "manifest" out of the file named "manifest.c"
909 #
@@ -1037,12 +1050,13 @@
1050
1051 APPNAME = $(OBJDIR)\fossil$(E)
1052
1053 all: $(APPNAME)
1054
1055 $(APPNAME) : translate$E mkindex$E codecheck1$E headers $(OBJ) $(OBJDIR)\link
1056 cd $(OBJDIR)
1057 codecheck1$E $(SRC)
1058 $(DMDIR)\bin\link @link
1059
1060 $(OBJDIR)\fossil.res: $B\win\fossil.rc
1061 $(RC) $(RCFLAGS) -o$@ $**
1062
@@ -1066,11 +1080,14 @@
1080 $(BCC) -o$@ $**
1081
1082 mkindex$E: $(SRCDIR)\mkindex.c
1083 $(BCC) -o$@ $**
1084
1085 mkversion$E: $(SRCDIR)\mkversion.c
1086 $(BCC) -o$@ $**
1087
1088 codecheck1$E: $(SRCDIR)\codecheck1.c
1089 $(BCC) -o$@ $**
1090
1091 $(OBJDIR)\shell$O : $(SRCDIR)\shell.c
1092 $(TCC) -o$@ -c $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) $**
1093
@@ -1084,11 +1101,11 @@
1101 $(TCC) -o$@ -c $**
1102
1103 $(OBJDIR)\cson_amalgamation.h : $(SRCDIR)\cson_amalgamation.h
1104 cp $@ $@
1105
1106 VERSION.h : mkversion$E $B\manifest.uuid $B\manifest $B\VERSION
1107 +$** > $@
1108
1109 page_index.h: mkindex$E $(SRC)
1110 +$** > $@
1111
@@ -1095,11 +1112,11 @@
1112 clean:
1113 -del $(OBJDIR)\*.obj
1114 -del *.obj *_.c *.h *.map
1115
1116 realclean:
1117 -del $(APPNAME) translate$E mkindex$E makeheaders$E mkversion$E codecheck1$E
1118
1119 $(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
1120 $(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
1121 $(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
1122 $(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
@@ -1398,12 +1415,13 @@
1415 !ifdef FOSSIL_BUILD_SSL
1416 APPTARGETS = $(APPTARGETS) openssl
1417 !endif
1418 !endif
1419
1420 $(APPNAME) : $(APPTARGETS) translate$E mkindex$E codecheck1$E headers $(OBJ) $(OX)\linkopts
1421 cd $(OX)
1422 codecheck1$E $(SRC)
1423 link $(LDFLAGS) /OUT:$@ $(LIBDIR) Wsetargv.obj fossil.res @linkopts
1424
1425 $(OX)\linkopts: $B\win\Makefile.msc}
1426 set redir {>}
1427 foreach s [lsort [concat $src $AdditionalObj]] {
@@ -1426,11 +1444,14 @@
1444 $(BCC) $**
1445
1446 mkindex$E: $(SRCDIR)\mkindex.c
1447 $(BCC) $**
1448
1449 mkversion$E: $(SRCDIR)\mkversion.c
1450 $(BCC) $**
1451
1452 codecheck1$E: $(SRCDIR)\codecheck1.c
1453 $(BCC) $**
1454
1455 $(OX)\shell$O : $(SRCDIR)\shell.c $B\win\Makefile.msc
1456 $(TCC) /Fo$@ $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) -c $(SRCDIR)\shell.c
1457
@@ -1478,10 +1499,12 @@
1499 -del mkindex$P
1500 -del makeheaders$E
1501 -del makeheaders$P
1502 -del mkversion$E
1503 -del mkversion$P
1504 -del codecheck1$E
1505 -del codecheck1$P
1506
1507 $(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
1508 $(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
1509 $(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
1510 $(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
1511
+5 -6
--- src/manifest.c
+++ src/manifest.c
@@ -378,13 +378,13 @@
378378
** if that is not the case for this artifact.
379379
*/
380380
if( !isRepeat ) g.parseCnt[0]++;
381381
z = blob_materialize(pContent);
382382
n = blob_size(pContent);
383
- if( n<=0 || z[n-1]!='\n' ){
383
+ if( pErr && (n<=0 || z[n-1]!='\n') ){
384384
blob_reset(pContent);
385
- blob_appendf(pErr, n ? "not terminated with \\n" : "zero-length");
385
+ blob_append(pErr, n ? "not terminated with \\n" : "zero-length", -1);
386386
return 0;
387387
}
388388
389389
/* Strip off the PGP signature if there is one.
390390
*/
@@ -1600,11 +1600,11 @@
16001600
once = 0;
16011601
zTitleExpr = db_get("ticket-title-expr", "title");
16021602
zStatusColumn = db_get("ticket-status-column", "status");
16031603
}
16041604
zTitle = db_text("unknown",
1605
- "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
1605
+ "SELECT \"%w\" FROM ticket WHERE tkt_uuid=%Q",
16061606
zTitleExpr, pManifest->zTicketUuid
16071607
);
16081608
if( !isNew ){
16091609
for(i=0; i<pManifest->nField; i++){
16101610
if( fossil_strcmp(pManifest->aField[i].zName, zStatusColumn)==0 ){
@@ -1621,11 +1621,11 @@
16211621
}
16221622
blob_appendf(&brief, "%h ticket [%s|%S].",
16231623
zNewStatus, pManifest->zTicketUuid, pManifest->zTicketUuid);
16241624
}else{
16251625
zNewStatus = db_text("unknown",
1626
- "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
1626
+ "SELECT \"%w\" FROM ticket WHERE tkt_uuid=%Q",
16271627
zStatusColumn, pManifest->zTicketUuid
16281628
);
16291629
blob_appendf(&comment, "Ticket [%s|%S] <i>%h</i> status still %h with "
16301630
"%d other change%s",
16311631
pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus,
@@ -1907,11 +1907,10 @@
19071907
" (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype>1),"
19081908
" (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d),"
19091909
" (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));",
19101910
p->rDate, rid, p->zUser, zComment,
19111911
TAG_BGCOLOR, rid,
1912
- TAG_BGCOLOR, rid,
19131912
TAG_USER, rid,
19141913
TAG_COMMENT, rid
19151914
);
19161915
fossil_free(zComment);
19171916
}
@@ -2039,11 +2038,11 @@
20392038
" Edit [%s|%S]:",
20402039
zTagUuid, zTagUuid);
20412040
branchMove = 0;
20422041
if( permitHooks && db_exists("SELECT 1 FROM event, blob"
20432042
" WHERE event.type='ci' AND event.objid=blob.rid"
2044
- " AND blob.uuid='%s'", zTagUuid) ){
2043
+ " AND blob.uuid=%Q", zTagUuid) ){
20452044
zScript = xfer_commit_code();
20462045
zUuid = zTagUuid;
20472046
}
20482047
}
20492048
zName = p->aTag[i].zName;
20502049
--- src/manifest.c
+++ src/manifest.c
@@ -378,13 +378,13 @@
378 ** if that is not the case for this artifact.
379 */
380 if( !isRepeat ) g.parseCnt[0]++;
381 z = blob_materialize(pContent);
382 n = blob_size(pContent);
383 if( n<=0 || z[n-1]!='\n' ){
384 blob_reset(pContent);
385 blob_appendf(pErr, n ? "not terminated with \\n" : "zero-length");
386 return 0;
387 }
388
389 /* Strip off the PGP signature if there is one.
390 */
@@ -1600,11 +1600,11 @@
1600 once = 0;
1601 zTitleExpr = db_get("ticket-title-expr", "title");
1602 zStatusColumn = db_get("ticket-status-column", "status");
1603 }
1604 zTitle = db_text("unknown",
1605 "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
1606 zTitleExpr, pManifest->zTicketUuid
1607 );
1608 if( !isNew ){
1609 for(i=0; i<pManifest->nField; i++){
1610 if( fossil_strcmp(pManifest->aField[i].zName, zStatusColumn)==0 ){
@@ -1621,11 +1621,11 @@
1621 }
1622 blob_appendf(&brief, "%h ticket [%s|%S].",
1623 zNewStatus, pManifest->zTicketUuid, pManifest->zTicketUuid);
1624 }else{
1625 zNewStatus = db_text("unknown",
1626 "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
1627 zStatusColumn, pManifest->zTicketUuid
1628 );
1629 blob_appendf(&comment, "Ticket [%s|%S] <i>%h</i> status still %h with "
1630 "%d other change%s",
1631 pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus,
@@ -1907,11 +1907,10 @@
1907 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype>1),"
1908 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d),"
1909 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));",
1910 p->rDate, rid, p->zUser, zComment,
1911 TAG_BGCOLOR, rid,
1912 TAG_BGCOLOR, rid,
1913 TAG_USER, rid,
1914 TAG_COMMENT, rid
1915 );
1916 fossil_free(zComment);
1917 }
@@ -2039,11 +2038,11 @@
2039 " Edit [%s|%S]:",
2040 zTagUuid, zTagUuid);
2041 branchMove = 0;
2042 if( permitHooks && db_exists("SELECT 1 FROM event, blob"
2043 " WHERE event.type='ci' AND event.objid=blob.rid"
2044 " AND blob.uuid='%s'", zTagUuid) ){
2045 zScript = xfer_commit_code();
2046 zUuid = zTagUuid;
2047 }
2048 }
2049 zName = p->aTag[i].zName;
2050
--- src/manifest.c
+++ src/manifest.c
@@ -378,13 +378,13 @@
378 ** if that is not the case for this artifact.
379 */
380 if( !isRepeat ) g.parseCnt[0]++;
381 z = blob_materialize(pContent);
382 n = blob_size(pContent);
383 if( pErr && (n<=0 || z[n-1]!='\n') ){
384 blob_reset(pContent);
385 blob_append(pErr, n ? "not terminated with \\n" : "zero-length", -1);
386 return 0;
387 }
388
389 /* Strip off the PGP signature if there is one.
390 */
@@ -1600,11 +1600,11 @@
1600 once = 0;
1601 zTitleExpr = db_get("ticket-title-expr", "title");
1602 zStatusColumn = db_get("ticket-status-column", "status");
1603 }
1604 zTitle = db_text("unknown",
1605 "SELECT \"%w\" FROM ticket WHERE tkt_uuid=%Q",
1606 zTitleExpr, pManifest->zTicketUuid
1607 );
1608 if( !isNew ){
1609 for(i=0; i<pManifest->nField; i++){
1610 if( fossil_strcmp(pManifest->aField[i].zName, zStatusColumn)==0 ){
@@ -1621,11 +1621,11 @@
1621 }
1622 blob_appendf(&brief, "%h ticket [%s|%S].",
1623 zNewStatus, pManifest->zTicketUuid, pManifest->zTicketUuid);
1624 }else{
1625 zNewStatus = db_text("unknown",
1626 "SELECT \"%w\" FROM ticket WHERE tkt_uuid=%Q",
1627 zStatusColumn, pManifest->zTicketUuid
1628 );
1629 blob_appendf(&comment, "Ticket [%s|%S] <i>%h</i> status still %h with "
1630 "%d other change%s",
1631 pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus,
@@ -1907,11 +1907,10 @@
1907 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype>1),"
1908 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d),"
1909 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));",
1910 p->rDate, rid, p->zUser, zComment,
1911 TAG_BGCOLOR, rid,
 
1912 TAG_USER, rid,
1913 TAG_COMMENT, rid
1914 );
1915 fossil_free(zComment);
1916 }
@@ -2039,11 +2038,11 @@
2038 " Edit [%s|%S]:",
2039 zTagUuid, zTagUuid);
2040 branchMove = 0;
2041 if( permitHooks && db_exists("SELECT 1 FROM event, blob"
2042 " WHERE event.type='ci' AND event.objid=blob.rid"
2043 " AND blob.uuid=%Q", zTagUuid) ){
2044 zScript = xfer_commit_code();
2045 zUuid = zTagUuid;
2046 }
2047 }
2048 zName = p->aTag[i].zName;
2049
+5 -6
--- src/manifest.c
+++ src/manifest.c
@@ -378,13 +378,13 @@
378378
** if that is not the case for this artifact.
379379
*/
380380
if( !isRepeat ) g.parseCnt[0]++;
381381
z = blob_materialize(pContent);
382382
n = blob_size(pContent);
383
- if( n<=0 || z[n-1]!='\n' ){
383
+ if( pErr && (n<=0 || z[n-1]!='\n') ){
384384
blob_reset(pContent);
385
- blob_appendf(pErr, n ? "not terminated with \\n" : "zero-length");
385
+ blob_append(pErr, n ? "not terminated with \\n" : "zero-length", -1);
386386
return 0;
387387
}
388388
389389
/* Strip off the PGP signature if there is one.
390390
*/
@@ -1600,11 +1600,11 @@
16001600
once = 0;
16011601
zTitleExpr = db_get("ticket-title-expr", "title");
16021602
zStatusColumn = db_get("ticket-status-column", "status");
16031603
}
16041604
zTitle = db_text("unknown",
1605
- "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
1605
+ "SELECT \"%w\" FROM ticket WHERE tkt_uuid=%Q",
16061606
zTitleExpr, pManifest->zTicketUuid
16071607
);
16081608
if( !isNew ){
16091609
for(i=0; i<pManifest->nField; i++){
16101610
if( fossil_strcmp(pManifest->aField[i].zName, zStatusColumn)==0 ){
@@ -1621,11 +1621,11 @@
16211621
}
16221622
blob_appendf(&brief, "%h ticket [%s|%S].",
16231623
zNewStatus, pManifest->zTicketUuid, pManifest->zTicketUuid);
16241624
}else{
16251625
zNewStatus = db_text("unknown",
1626
- "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
1626
+ "SELECT \"%w\" FROM ticket WHERE tkt_uuid=%Q",
16271627
zStatusColumn, pManifest->zTicketUuid
16281628
);
16291629
blob_appendf(&comment, "Ticket [%s|%S] <i>%h</i> status still %h with "
16301630
"%d other change%s",
16311631
pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus,
@@ -1907,11 +1907,10 @@
19071907
" (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype>1),"
19081908
" (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d),"
19091909
" (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));",
19101910
p->rDate, rid, p->zUser, zComment,
19111911
TAG_BGCOLOR, rid,
1912
- TAG_BGCOLOR, rid,
19131912
TAG_USER, rid,
19141913
TAG_COMMENT, rid
19151914
);
19161915
fossil_free(zComment);
19171916
}
@@ -2039,11 +2038,11 @@
20392038
" Edit [%s|%S]:",
20402039
zTagUuid, zTagUuid);
20412040
branchMove = 0;
20422041
if( permitHooks && db_exists("SELECT 1 FROM event, blob"
20432042
" WHERE event.type='ci' AND event.objid=blob.rid"
2044
- " AND blob.uuid='%s'", zTagUuid) ){
2043
+ " AND blob.uuid=%Q", zTagUuid) ){
20452044
zScript = xfer_commit_code();
20462045
zUuid = zTagUuid;
20472046
}
20482047
}
20492048
zName = p->aTag[i].zName;
20502049
--- src/manifest.c
+++ src/manifest.c
@@ -378,13 +378,13 @@
378 ** if that is not the case for this artifact.
379 */
380 if( !isRepeat ) g.parseCnt[0]++;
381 z = blob_materialize(pContent);
382 n = blob_size(pContent);
383 if( n<=0 || z[n-1]!='\n' ){
384 blob_reset(pContent);
385 blob_appendf(pErr, n ? "not terminated with \\n" : "zero-length");
386 return 0;
387 }
388
389 /* Strip off the PGP signature if there is one.
390 */
@@ -1600,11 +1600,11 @@
1600 once = 0;
1601 zTitleExpr = db_get("ticket-title-expr", "title");
1602 zStatusColumn = db_get("ticket-status-column", "status");
1603 }
1604 zTitle = db_text("unknown",
1605 "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
1606 zTitleExpr, pManifest->zTicketUuid
1607 );
1608 if( !isNew ){
1609 for(i=0; i<pManifest->nField; i++){
1610 if( fossil_strcmp(pManifest->aField[i].zName, zStatusColumn)==0 ){
@@ -1621,11 +1621,11 @@
1621 }
1622 blob_appendf(&brief, "%h ticket [%s|%S].",
1623 zNewStatus, pManifest->zTicketUuid, pManifest->zTicketUuid);
1624 }else{
1625 zNewStatus = db_text("unknown",
1626 "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
1627 zStatusColumn, pManifest->zTicketUuid
1628 );
1629 blob_appendf(&comment, "Ticket [%s|%S] <i>%h</i> status still %h with "
1630 "%d other change%s",
1631 pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus,
@@ -1907,11 +1907,10 @@
1907 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype>1),"
1908 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d),"
1909 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));",
1910 p->rDate, rid, p->zUser, zComment,
1911 TAG_BGCOLOR, rid,
1912 TAG_BGCOLOR, rid,
1913 TAG_USER, rid,
1914 TAG_COMMENT, rid
1915 );
1916 fossil_free(zComment);
1917 }
@@ -2039,11 +2038,11 @@
2039 " Edit [%s|%S]:",
2040 zTagUuid, zTagUuid);
2041 branchMove = 0;
2042 if( permitHooks && db_exists("SELECT 1 FROM event, blob"
2043 " WHERE event.type='ci' AND event.objid=blob.rid"
2044 " AND blob.uuid='%s'", zTagUuid) ){
2045 zScript = xfer_commit_code();
2046 zUuid = zTagUuid;
2047 }
2048 }
2049 zName = p->aTag[i].zName;
2050
--- src/manifest.c
+++ src/manifest.c
@@ -378,13 +378,13 @@
378 ** if that is not the case for this artifact.
379 */
380 if( !isRepeat ) g.parseCnt[0]++;
381 z = blob_materialize(pContent);
382 n = blob_size(pContent);
383 if( pErr && (n<=0 || z[n-1]!='\n') ){
384 blob_reset(pContent);
385 blob_append(pErr, n ? "not terminated with \\n" : "zero-length", -1);
386 return 0;
387 }
388
389 /* Strip off the PGP signature if there is one.
390 */
@@ -1600,11 +1600,11 @@
1600 once = 0;
1601 zTitleExpr = db_get("ticket-title-expr", "title");
1602 zStatusColumn = db_get("ticket-status-column", "status");
1603 }
1604 zTitle = db_text("unknown",
1605 "SELECT \"%w\" FROM ticket WHERE tkt_uuid=%Q",
1606 zTitleExpr, pManifest->zTicketUuid
1607 );
1608 if( !isNew ){
1609 for(i=0; i<pManifest->nField; i++){
1610 if( fossil_strcmp(pManifest->aField[i].zName, zStatusColumn)==0 ){
@@ -1621,11 +1621,11 @@
1621 }
1622 blob_appendf(&brief, "%h ticket [%s|%S].",
1623 zNewStatus, pManifest->zTicketUuid, pManifest->zTicketUuid);
1624 }else{
1625 zNewStatus = db_text("unknown",
1626 "SELECT \"%w\" FROM ticket WHERE tkt_uuid=%Q",
1627 zStatusColumn, pManifest->zTicketUuid
1628 );
1629 blob_appendf(&comment, "Ticket [%s|%S] <i>%h</i> status still %h with "
1630 "%d other change%s",
1631 pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus,
@@ -1907,11 +1907,10 @@
1907 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype>1),"
1908 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d),"
1909 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));",
1910 p->rDate, rid, p->zUser, zComment,
1911 TAG_BGCOLOR, rid,
 
1912 TAG_USER, rid,
1913 TAG_COMMENT, rid
1914 );
1915 fossil_free(zComment);
1916 }
@@ -2039,11 +2038,11 @@
2038 " Edit [%s|%S]:",
2039 zTagUuid, zTagUuid);
2040 branchMove = 0;
2041 if( permitHooks && db_exists("SELECT 1 FROM event, blob"
2042 " WHERE event.type='ci' AND event.objid=blob.rid"
2043 " AND blob.uuid=%Q", zTagUuid) ){
2044 zScript = xfer_commit_code();
2045 zUuid = zTagUuid;
2046 }
2047 }
2048 zName = p->aTag[i].zName;
2049
+4 -4
--- src/merge3.c
+++ src/merge3.c
@@ -268,17 +268,17 @@
268268
nConflict++;
269269
while( !ends_at_CPY(&aC1[i1], sz) || !ends_at_CPY(&aC2[i2], sz) ){
270270
sz++;
271271
}
272272
DEBUG( printf("CONFLICT %d\n", sz); )
273
- blob_appendf(pOut, mergeMarker[0]);
273
+ blob_append(pOut, mergeMarker[0], -1);
274274
i1 = output_one_side(pOut, pV1, aC1, i1, sz);
275
- blob_appendf(pOut, mergeMarker[1]);
275
+ blob_append(pOut, mergeMarker[1], -1);
276276
blob_copy_lines(pOut, pPivot, sz);
277
- blob_appendf(pOut, mergeMarker[2]);
277
+ blob_append(pOut, mergeMarker[2], -1);
278278
i2 = output_one_side(pOut, pV2, aC2, i2, sz);
279
- blob_appendf(pOut, mergeMarker[3]);
279
+ blob_append(pOut, mergeMarker[3], -1);
280280
}
281281
282282
/* If we are finished with an edit triple, advance to the next
283283
** triple.
284284
*/
285285
--- src/merge3.c
+++ src/merge3.c
@@ -268,17 +268,17 @@
268 nConflict++;
269 while( !ends_at_CPY(&aC1[i1], sz) || !ends_at_CPY(&aC2[i2], sz) ){
270 sz++;
271 }
272 DEBUG( printf("CONFLICT %d\n", sz); )
273 blob_appendf(pOut, mergeMarker[0]);
274 i1 = output_one_side(pOut, pV1, aC1, i1, sz);
275 blob_appendf(pOut, mergeMarker[1]);
276 blob_copy_lines(pOut, pPivot, sz);
277 blob_appendf(pOut, mergeMarker[2]);
278 i2 = output_one_side(pOut, pV2, aC2, i2, sz);
279 blob_appendf(pOut, mergeMarker[3]);
280 }
281
282 /* If we are finished with an edit triple, advance to the next
283 ** triple.
284 */
285
--- src/merge3.c
+++ src/merge3.c
@@ -268,17 +268,17 @@
268 nConflict++;
269 while( !ends_at_CPY(&aC1[i1], sz) || !ends_at_CPY(&aC2[i2], sz) ){
270 sz++;
271 }
272 DEBUG( printf("CONFLICT %d\n", sz); )
273 blob_append(pOut, mergeMarker[0], -1);
274 i1 = output_one_side(pOut, pV1, aC1, i1, sz);
275 blob_append(pOut, mergeMarker[1], -1);
276 blob_copy_lines(pOut, pPivot, sz);
277 blob_append(pOut, mergeMarker[2], -1);
278 i2 = output_one_side(pOut, pV2, aC2, i2, sz);
279 blob_append(pOut, mergeMarker[3], -1);
280 }
281
282 /* If we are finished with an edit triple, advance to the next
283 ** triple.
284 */
285
+3 -3
--- src/moderate.c
+++ src/moderate.c
@@ -73,11 +73,11 @@
7373
"tagxref", "srcid",
7474
"tagxref", "rid",
7575
};
7676
int i;
7777
for(i=0; i<sizeof(aTabField)/sizeof(aTabField[0]); i+=2){
78
- if( db_exists("SELECT 1 FROM %s WHERE %s=%d",
78
+ if( db_exists("SELECT 1 FROM \"%w\" WHERE \"%w\"=%d",
7979
aTabField[i], aTabField[i+1], rid) ) return 1;
8080
}
8181
return 0;
8282
}
8383
@@ -152,15 +152,15 @@
152152
if( !g.perm.RdWiki && !g.perm.RdTkt ){ login_needed(); return; }
153153
style_header("Pending Moderation Requests");
154154
@ <h2>All Pending Moderation Requests</h2>
155155
if( moderation_table_exists() ){
156156
blob_init(&sql, timeline_query_for_www(), -1);
157
- blob_appendf(&sql,
157
+ blob_append_sql(&sql,
158158
" AND event.objid IN (SELECT objid FROM modreq)"
159159
" ORDER BY event.mtime DESC"
160160
);
161
- db_prepare(&q, blob_str(&sql));
161
+ db_prepare(&q, "%s", blob_sql_text(&sql));
162162
www_print_timeline(&q, 0, 0, 0, 0);
163163
db_finalize(&q);
164164
}
165165
style_footer();
166166
}
167167
--- src/moderate.c
+++ src/moderate.c
@@ -73,11 +73,11 @@
73 "tagxref", "srcid",
74 "tagxref", "rid",
75 };
76 int i;
77 for(i=0; i<sizeof(aTabField)/sizeof(aTabField[0]); i+=2){
78 if( db_exists("SELECT 1 FROM %s WHERE %s=%d",
79 aTabField[i], aTabField[i+1], rid) ) return 1;
80 }
81 return 0;
82 }
83
@@ -152,15 +152,15 @@
152 if( !g.perm.RdWiki && !g.perm.RdTkt ){ login_needed(); return; }
153 style_header("Pending Moderation Requests");
154 @ <h2>All Pending Moderation Requests</h2>
155 if( moderation_table_exists() ){
156 blob_init(&sql, timeline_query_for_www(), -1);
157 blob_appendf(&sql,
158 " AND event.objid IN (SELECT objid FROM modreq)"
159 " ORDER BY event.mtime DESC"
160 );
161 db_prepare(&q, blob_str(&sql));
162 www_print_timeline(&q, 0, 0, 0, 0);
163 db_finalize(&q);
164 }
165 style_footer();
166 }
167
--- src/moderate.c
+++ src/moderate.c
@@ -73,11 +73,11 @@
73 "tagxref", "srcid",
74 "tagxref", "rid",
75 };
76 int i;
77 for(i=0; i<sizeof(aTabField)/sizeof(aTabField[0]); i+=2){
78 if( db_exists("SELECT 1 FROM \"%w\" WHERE \"%w\"=%d",
79 aTabField[i], aTabField[i+1], rid) ) return 1;
80 }
81 return 0;
82 }
83
@@ -152,15 +152,15 @@
152 if( !g.perm.RdWiki && !g.perm.RdTkt ){ login_needed(); return; }
153 style_header("Pending Moderation Requests");
154 @ <h2>All Pending Moderation Requests</h2>
155 if( moderation_table_exists() ){
156 blob_init(&sql, timeline_query_for_www(), -1);
157 blob_append_sql(&sql,
158 " AND event.objid IN (SELECT objid FROM modreq)"
159 " ORDER BY event.mtime DESC"
160 );
161 db_prepare(&q, "%s", blob_sql_text(&sql));
162 www_print_timeline(&q, 0, 0, 0, 0);
163 db_finalize(&q);
164 }
165 style_footer();
166 }
167
+4 -4
--- src/name.c
+++ src/name.c
@@ -216,16 +216,16 @@
216216
char zUuid[UUID_SIZE+1];
217217
memcpy(zUuid, zTag, nTag+1);
218218
canonical16(zUuid, nTag);
219219
rid = 0;
220220
if( zType[0]=='*' ){
221
- db_prepare(&q, "SELECT rid FROM blob WHERE uuid GLOB '%s*'", zUuid);
221
+ db_prepare(&q, "SELECT rid FROM blob WHERE uuid GLOB '%q*'", zUuid);
222222
}else{
223223
db_prepare(&q,
224224
"SELECT blob.rid"
225225
" FROM blob, event"
226
- " WHERE blob.uuid GLOB '%s*'"
226
+ " WHERE blob.uuid GLOB '%q*'"
227227
" AND event.objid=blob.rid"
228228
" AND event.type GLOB '%q'",
229229
zUuid, zType
230230
);
231231
}
@@ -259,11 +259,11 @@
259259
}else{
260260
rid = db_int(0,
261261
"SELECT event.objid"
262262
" FROM event"
263263
" WHERE event.objid=%s"
264
- " AND event.type GLOB '%q'", zTag, zType);
264
+ " AND event.type GLOB '%q'", zTag /*safe-for-%s*/, zType);
265265
}
266266
}
267267
}
268268
return rid;
269269
}
@@ -554,11 +554,11 @@
554554
"SELECT tagname"
555555
" FROM tag JOIN tagxref ON tag.tagid=tagxref.tagid"
556556
" WHERE tagxref.rid=%d"
557557
" AND tag.tagid IN (5,6,7,9)"
558558
" ORDER BY 1",
559
- rid, rid
559
+ rid
560560
);
561561
cnt = 0;
562562
while( db_step(&q)==SQLITE_ROW ){
563563
const char *zPrefix = cnt++ ? ", " : "raw-tags: ";
564564
fossil_print("%s%s", zPrefix, db_column_text(&q,0));
565565
--- src/name.c
+++ src/name.c
@@ -216,16 +216,16 @@
216 char zUuid[UUID_SIZE+1];
217 memcpy(zUuid, zTag, nTag+1);
218 canonical16(zUuid, nTag);
219 rid = 0;
220 if( zType[0]=='*' ){
221 db_prepare(&q, "SELECT rid FROM blob WHERE uuid GLOB '%s*'", zUuid);
222 }else{
223 db_prepare(&q,
224 "SELECT blob.rid"
225 " FROM blob, event"
226 " WHERE blob.uuid GLOB '%s*'"
227 " AND event.objid=blob.rid"
228 " AND event.type GLOB '%q'",
229 zUuid, zType
230 );
231 }
@@ -259,11 +259,11 @@
259 }else{
260 rid = db_int(0,
261 "SELECT event.objid"
262 " FROM event"
263 " WHERE event.objid=%s"
264 " AND event.type GLOB '%q'", zTag, zType);
265 }
266 }
267 }
268 return rid;
269 }
@@ -554,11 +554,11 @@
554 "SELECT tagname"
555 " FROM tag JOIN tagxref ON tag.tagid=tagxref.tagid"
556 " WHERE tagxref.rid=%d"
557 " AND tag.tagid IN (5,6,7,9)"
558 " ORDER BY 1",
559 rid, rid
560 );
561 cnt = 0;
562 while( db_step(&q)==SQLITE_ROW ){
563 const char *zPrefix = cnt++ ? ", " : "raw-tags: ";
564 fossil_print("%s%s", zPrefix, db_column_text(&q,0));
565
--- src/name.c
+++ src/name.c
@@ -216,16 +216,16 @@
216 char zUuid[UUID_SIZE+1];
217 memcpy(zUuid, zTag, nTag+1);
218 canonical16(zUuid, nTag);
219 rid = 0;
220 if( zType[0]=='*' ){
221 db_prepare(&q, "SELECT rid FROM blob WHERE uuid GLOB '%q*'", zUuid);
222 }else{
223 db_prepare(&q,
224 "SELECT blob.rid"
225 " FROM blob, event"
226 " WHERE blob.uuid GLOB '%q*'"
227 " AND event.objid=blob.rid"
228 " AND event.type GLOB '%q'",
229 zUuid, zType
230 );
231 }
@@ -259,11 +259,11 @@
259 }else{
260 rid = db_int(0,
261 "SELECT event.objid"
262 " FROM event"
263 " WHERE event.objid=%s"
264 " AND event.type GLOB '%q'", zTag /*safe-for-%s*/, zType);
265 }
266 }
267 }
268 return rid;
269 }
@@ -554,11 +554,11 @@
554 "SELECT tagname"
555 " FROM tag JOIN tagxref ON tag.tagid=tagxref.tagid"
556 " WHERE tagxref.rid=%d"
557 " AND tag.tagid IN (5,6,7,9)"
558 " ORDER BY 1",
559 rid
560 );
561 cnt = 0;
562 while( db_step(&q)==SQLITE_ROW ){
563 const char *zPrefix = cnt++ ? ", " : "raw-tags: ";
564 fossil_print("%s%s", zPrefix, db_column_text(&q,0));
565
+10 -10
--- src/path.c
+++ src/path.c
@@ -112,11 +112,11 @@
112112
** Compute the shortest path from iFrom to iTo
113113
**
114114
** If directOnly is true, then use only the "primary" links from parent to
115115
** child. In other words, ignore merges.
116116
**
117
-** Return a pointer to the beginning of the path (the iFrom node).
117
+** Return a pointer to the beginning of the path (the iFrom node).
118118
** Elements of the path can be traversed by following the PathNode.u.pTo
119119
** pointer chain.
120120
**
121121
** Return NULL if no path is found.
122122
*/
@@ -135,25 +135,25 @@
135135
if( iTo==iFrom ){
136136
path.pEnd = path.pStart;
137137
return path.pStart;
138138
}
139139
if( oneWayOnly && directOnly ){
140
- db_prepare(&s,
140
+ db_prepare(&s,
141141
"SELECT cid, 1 FROM plink WHERE pid=:pid AND isprim"
142142
);
143143
}else if( oneWayOnly ){
144
- db_prepare(&s,
144
+ db_prepare(&s,
145145
"SELECT cid, 1 FROM plink WHERE pid=:pid "
146146
);
147147
}else if( directOnly ){
148
- db_prepare(&s,
148
+ db_prepare(&s,
149149
"SELECT cid, 1 FROM plink WHERE pid=:pid AND isprim "
150150
"UNION ALL "
151151
"SELECT pid, 0 FROM plink WHERE cid=:pid AND isprim"
152152
);
153153
}else{
154
- db_prepare(&s,
154
+ db_prepare(&s,
155155
"SELECT cid, 1 FROM plink WHERE pid=:pid "
156156
"UNION ALL "
157157
"SELECT pid, 0 FROM plink WHERE cid=:pid"
158158
);
159159
}
@@ -230,11 +230,11 @@
230230
" WHERE blob.rid=%d AND event.objid=%d AND event.type='ci'",
231231
p->rid, p->rid);
232232
fossil_print("%4d: %5d %s", n, p->rid, z);
233233
fossil_free(z);
234234
if( p->u.pTo ){
235
- fossil_print(" is a %s of\n",
235
+ fossil_print(" is a %s of\n",
236236
p->u.pTo->fromIsParent ? "parent" : "child");
237237
}else{
238238
fossil_print("\n");
239239
}
240240
}
@@ -353,11 +353,11 @@
353353
/*
354354
** Compute all file name changes that occur going from checkin iFrom
355355
** to checkin iTo.
356356
**
357357
** The number of name changes is written into *pnChng. For each name
358
-** change, two integers are allocated for *piChng. The first is the
358
+** change, two integers are allocated for *piChng. The first is the
359359
** filename.fnid for the original name as seen in check-in iFrom and
360360
** the second is for new name as it is used in check-in iTo.
361361
**
362362
** Space to hold *piChng is obtained from fossil_malloc() and should
363363
** be released by the caller.
@@ -516,11 +516,11 @@
516516
g.argc -= 2;
517517
}
518518
}
519519
520520
/* Query to extract all rename operations */
521
-static const char zRenameQuery[] =
521
+static const char zRenameQuery[] =
522522
@ SELECT
523523
@ datetime(event.mtime),
524524
@ F.name AS old_name,
525525
@ T.name AS new_name,
526526
@ blob.uuid
@@ -531,11 +531,11 @@
531531
@ AND event.objid=mlink.mid
532532
@ AND event.type='ci'
533533
@ AND blob.rid=mlink.mid
534534
@ ORDER BY 1 DESC, 2;
535535
;
536
-
536
+
537537
/*
538538
** WEBPAGE: test-rename-list
539539
**
540540
** Print a list of all file rename operations throughout history.
541541
** This page is intended for for testing purposes only and may change
@@ -551,11 +551,11 @@
551551
@ <table border="1" width="100%%">
552552
@ <tr><th>Date &amp; Time</th>
553553
@ <th>Old Name</th>
554554
@ <th>New Name</th>
555555
@ <th>Check-in</th></tr>
556
- db_prepare(&q, zRenameQuery);
556
+ db_prepare(&q, "%s", zRenameQuery/*safe-for-%s*/);
557557
while( db_step(&q)==SQLITE_ROW ){
558558
const char *zDate = db_column_text(&q, 0);
559559
const char *zOld = db_column_text(&q, 1);
560560
const char *zNew = db_column_text(&q, 2);
561561
const char *zUuid = db_column_text(&q, 3);
562562
--- src/path.c
+++ src/path.c
@@ -112,11 +112,11 @@
112 ** Compute the shortest path from iFrom to iTo
113 **
114 ** If directOnly is true, then use only the "primary" links from parent to
115 ** child. In other words, ignore merges.
116 **
117 ** Return a pointer to the beginning of the path (the iFrom node).
118 ** Elements of the path can be traversed by following the PathNode.u.pTo
119 ** pointer chain.
120 **
121 ** Return NULL if no path is found.
122 */
@@ -135,25 +135,25 @@
135 if( iTo==iFrom ){
136 path.pEnd = path.pStart;
137 return path.pStart;
138 }
139 if( oneWayOnly && directOnly ){
140 db_prepare(&s,
141 "SELECT cid, 1 FROM plink WHERE pid=:pid AND isprim"
142 );
143 }else if( oneWayOnly ){
144 db_prepare(&s,
145 "SELECT cid, 1 FROM plink WHERE pid=:pid "
146 );
147 }else if( directOnly ){
148 db_prepare(&s,
149 "SELECT cid, 1 FROM plink WHERE pid=:pid AND isprim "
150 "UNION ALL "
151 "SELECT pid, 0 FROM plink WHERE cid=:pid AND isprim"
152 );
153 }else{
154 db_prepare(&s,
155 "SELECT cid, 1 FROM plink WHERE pid=:pid "
156 "UNION ALL "
157 "SELECT pid, 0 FROM plink WHERE cid=:pid"
158 );
159 }
@@ -230,11 +230,11 @@
230 " WHERE blob.rid=%d AND event.objid=%d AND event.type='ci'",
231 p->rid, p->rid);
232 fossil_print("%4d: %5d %s", n, p->rid, z);
233 fossil_free(z);
234 if( p->u.pTo ){
235 fossil_print(" is a %s of\n",
236 p->u.pTo->fromIsParent ? "parent" : "child");
237 }else{
238 fossil_print("\n");
239 }
240 }
@@ -353,11 +353,11 @@
353 /*
354 ** Compute all file name changes that occur going from checkin iFrom
355 ** to checkin iTo.
356 **
357 ** The number of name changes is written into *pnChng. For each name
358 ** change, two integers are allocated for *piChng. The first is the
359 ** filename.fnid for the original name as seen in check-in iFrom and
360 ** the second is for new name as it is used in check-in iTo.
361 **
362 ** Space to hold *piChng is obtained from fossil_malloc() and should
363 ** be released by the caller.
@@ -516,11 +516,11 @@
516 g.argc -= 2;
517 }
518 }
519
520 /* Query to extract all rename operations */
521 static const char zRenameQuery[] =
522 @ SELECT
523 @ datetime(event.mtime),
524 @ F.name AS old_name,
525 @ T.name AS new_name,
526 @ blob.uuid
@@ -531,11 +531,11 @@
531 @ AND event.objid=mlink.mid
532 @ AND event.type='ci'
533 @ AND blob.rid=mlink.mid
534 @ ORDER BY 1 DESC, 2;
535 ;
536
537 /*
538 ** WEBPAGE: test-rename-list
539 **
540 ** Print a list of all file rename operations throughout history.
541 ** This page is intended for for testing purposes only and may change
@@ -551,11 +551,11 @@
551 @ <table border="1" width="100%%">
552 @ <tr><th>Date &amp; Time</th>
553 @ <th>Old Name</th>
554 @ <th>New Name</th>
555 @ <th>Check-in</th></tr>
556 db_prepare(&q, zRenameQuery);
557 while( db_step(&q)==SQLITE_ROW ){
558 const char *zDate = db_column_text(&q, 0);
559 const char *zOld = db_column_text(&q, 1);
560 const char *zNew = db_column_text(&q, 2);
561 const char *zUuid = db_column_text(&q, 3);
562
--- src/path.c
+++ src/path.c
@@ -112,11 +112,11 @@
112 ** Compute the shortest path from iFrom to iTo
113 **
114 ** If directOnly is true, then use only the "primary" links from parent to
115 ** child. In other words, ignore merges.
116 **
117 ** Return a pointer to the beginning of the path (the iFrom node).
118 ** Elements of the path can be traversed by following the PathNode.u.pTo
119 ** pointer chain.
120 **
121 ** Return NULL if no path is found.
122 */
@@ -135,25 +135,25 @@
135 if( iTo==iFrom ){
136 path.pEnd = path.pStart;
137 return path.pStart;
138 }
139 if( oneWayOnly && directOnly ){
140 db_prepare(&s,
141 "SELECT cid, 1 FROM plink WHERE pid=:pid AND isprim"
142 );
143 }else if( oneWayOnly ){
144 db_prepare(&s,
145 "SELECT cid, 1 FROM plink WHERE pid=:pid "
146 );
147 }else if( directOnly ){
148 db_prepare(&s,
149 "SELECT cid, 1 FROM plink WHERE pid=:pid AND isprim "
150 "UNION ALL "
151 "SELECT pid, 0 FROM plink WHERE cid=:pid AND isprim"
152 );
153 }else{
154 db_prepare(&s,
155 "SELECT cid, 1 FROM plink WHERE pid=:pid "
156 "UNION ALL "
157 "SELECT pid, 0 FROM plink WHERE cid=:pid"
158 );
159 }
@@ -230,11 +230,11 @@
230 " WHERE blob.rid=%d AND event.objid=%d AND event.type='ci'",
231 p->rid, p->rid);
232 fossil_print("%4d: %5d %s", n, p->rid, z);
233 fossil_free(z);
234 if( p->u.pTo ){
235 fossil_print(" is a %s of\n",
236 p->u.pTo->fromIsParent ? "parent" : "child");
237 }else{
238 fossil_print("\n");
239 }
240 }
@@ -353,11 +353,11 @@
353 /*
354 ** Compute all file name changes that occur going from checkin iFrom
355 ** to checkin iTo.
356 **
357 ** The number of name changes is written into *pnChng. For each name
358 ** change, two integers are allocated for *piChng. The first is the
359 ** filename.fnid for the original name as seen in check-in iFrom and
360 ** the second is for new name as it is used in check-in iTo.
361 **
362 ** Space to hold *piChng is obtained from fossil_malloc() and should
363 ** be released by the caller.
@@ -516,11 +516,11 @@
516 g.argc -= 2;
517 }
518 }
519
520 /* Query to extract all rename operations */
521 static const char zRenameQuery[] =
522 @ SELECT
523 @ datetime(event.mtime),
524 @ F.name AS old_name,
525 @ T.name AS new_name,
526 @ blob.uuid
@@ -531,11 +531,11 @@
531 @ AND event.objid=mlink.mid
532 @ AND event.type='ci'
533 @ AND blob.rid=mlink.mid
534 @ ORDER BY 1 DESC, 2;
535 ;
536
537 /*
538 ** WEBPAGE: test-rename-list
539 **
540 ** Print a list of all file rename operations throughout history.
541 ** This page is intended for for testing purposes only and may change
@@ -551,11 +551,11 @@
551 @ <table border="1" width="100%%">
552 @ <tr><th>Date &amp; Time</th>
553 @ <th>Old Name</th>
554 @ <th>New Name</th>
555 @ <th>Check-in</th></tr>
556 db_prepare(&q, "%s", zRenameQuery/*safe-for-%s*/);
557 while( db_step(&q)==SQLITE_ROW ){
558 const char *zDate = db_column_text(&q, 0);
559 const char *zOld = db_column_text(&q, 1);
560 const char *zNew = db_column_text(&q, 2);
561 const char *zUuid = db_column_text(&q, 3);
562
+18 -14
--- src/printf.c
+++ src/printf.c
@@ -44,19 +44,20 @@
4444
#define etBLOB 11 /* Blob objects. %b */
4545
#define etBLOBSQL 12 /* Blob objects quoted for SQL. %B */
4646
#define etSQLESCAPE 13 /* Strings with '\'' doubled. %q */
4747
#define etSQLESCAPE2 14 /* Strings with '\'' doubled and enclosed in '',
4848
NULL pointers replaced by SQL NULL. %Q */
49
-#define etPOINTER 15 /* The %p conversion */
50
-#define etHTMLIZE 16 /* Make text safe for HTML */
51
-#define etHTTPIZE 17 /* Make text safe for HTTP. "/" encoded as %2f */
52
-#define etURLIZE 18 /* Make text safe for HTTP. "/" not encoded */
53
-#define etFOSSILIZE 19 /* The fossil header encoding format. */
54
-#define etPATH 20 /* Path type */
55
-#define etWIKISTR 21 /* Timeline comment text rendered from a char*: %w */
49
+#define etSQLESCAPE3 15 /* Double '"' characters within an indentifier. %w */
50
+#define etPOINTER 16 /* The %p conversion */
51
+#define etHTMLIZE 17 /* Make text safe for HTML */
52
+#define etHTTPIZE 18 /* Make text safe for HTTP. "/" encoded as %2f */
53
+#define etURLIZE 19 /* Make text safe for HTTP. "/" not encoded */
54
+#define etFOSSILIZE 20 /* The fossil header encoding format. */
55
+#define etPATH 21 /* Path type */
56
+#define etWIKISTR 22 /* Timeline comment text rendered from a char*: %W */
5657
#define etSTRINGID 23 /* String with length limit for a UUID prefix: %S */
57
-#define etROOT 24 /* String value of g.zTop: % */
58
+#define etROOT 24 /* String value of g.zTop: %R */
5859
5960
6061
/*
6162
** An "etByte" is an 8-bit unsigned value.
6263
*/
@@ -96,15 +97,16 @@
9697
{ 'z', 0, 6, etDYNSTRING, 0, 0 },
9798
{ 'q', 0, 4, etSQLESCAPE, 0, 0 },
9899
{ 'Q', 0, 4, etSQLESCAPE2, 0, 0 },
99100
{ 'b', 0, 2, etBLOB, 0, 0 },
100101
{ 'B', 0, 2, etBLOBSQL, 0, 0 },
101
- { 'w', 0, 2, etWIKISTR, 0, 0 },
102
+ { 'W', 0, 2, etWIKISTR, 0, 0 },
102103
{ 'h', 0, 4, etHTMLIZE, 0, 0 },
103104
{ 'R', 0, 0, etROOT, 0, 0 },
104105
{ 't', 0, 4, etHTTPIZE, 0, 0 }, /* "/" -> "%2F" */
105106
{ 'T', 0, 4, etURLIZE, 0, 0 }, /* "/" unchanged */
107
+ { 'w', 0, 4, etSQLESCAPE3, 0, 0 },
106108
{ 'F', 0, 4, etFOSSILIZE, 0, 0 },
107109
{ 'S', 0, 4, etSTRINGID, 0, 0 },
108110
{ 'c', 0, 0, etCHARX, 0, 0 },
109111
{ 'o', 8, 0, etRADIX, 0, 2 },
110112
{ 'u', 10, 0, etRADIX, 0, 0 },
@@ -661,35 +663,37 @@
661663
length = j;
662664
assert( length==n+cnt+2 );
663665
break;
664666
}
665667
case etSQLESCAPE:
666
- case etSQLESCAPE2: {
668
+ case etSQLESCAPE2:
669
+ case etSQLESCAPE3: {
667670
int i, j, n, ch, isnull;
668671
int needQuote;
669672
int limit = flag_alternateform ? va_arg(ap,int) : -1;
673
+ char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote characters */
670674
char *escarg = va_arg(ap,char*);
671675
isnull = escarg==0;
672676
if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)");
673677
if( limit<0 ) limit = strlen(escarg);
674678
for(i=n=0; i<limit; i++){
675
- if( escarg[i]=='\'' ) n++;
679
+ if( escarg[i]==q ) n++;
676680
}
677681
needQuote = !isnull && xtype==etSQLESCAPE2;
678682
n += i + 1 + needQuote*2;
679683
if( n>etBUFSIZE ){
680684
bufpt = zExtra = fossil_malloc( n );
681685
}else{
682686
bufpt = buf;
683687
}
684688
j = 0;
685
- if( needQuote ) bufpt[j++] = '\'';
689
+ if( needQuote ) bufpt[j++] = q;
686690
for(i=0; i<limit; i++){
687691
bufpt[j++] = ch = escarg[i];
688
- if( ch=='\'' ) bufpt[j++] = ch;
692
+ if( ch==q ) bufpt[j++] = ch;
689693
}
690
- if( needQuote ) bufpt[j++] = '\'';
694
+ if( needQuote ) bufpt[j++] = q;
691695
bufpt[j] = 0;
692696
length = j;
693697
if( precision>=0 && precision<length ) length = precision;
694698
break;
695699
}
696700
--- src/printf.c
+++ src/printf.c
@@ -44,19 +44,20 @@
44 #define etBLOB 11 /* Blob objects. %b */
45 #define etBLOBSQL 12 /* Blob objects quoted for SQL. %B */
46 #define etSQLESCAPE 13 /* Strings with '\'' doubled. %q */
47 #define etSQLESCAPE2 14 /* Strings with '\'' doubled and enclosed in '',
48 NULL pointers replaced by SQL NULL. %Q */
49 #define etPOINTER 15 /* The %p conversion */
50 #define etHTMLIZE 16 /* Make text safe for HTML */
51 #define etHTTPIZE 17 /* Make text safe for HTTP. "/" encoded as %2f */
52 #define etURLIZE 18 /* Make text safe for HTTP. "/" not encoded */
53 #define etFOSSILIZE 19 /* The fossil header encoding format. */
54 #define etPATH 20 /* Path type */
55 #define etWIKISTR 21 /* Timeline comment text rendered from a char*: %w */
 
56 #define etSTRINGID 23 /* String with length limit for a UUID prefix: %S */
57 #define etROOT 24 /* String value of g.zTop: % */
58
59
60 /*
61 ** An "etByte" is an 8-bit unsigned value.
62 */
@@ -96,15 +97,16 @@
96 { 'z', 0, 6, etDYNSTRING, 0, 0 },
97 { 'q', 0, 4, etSQLESCAPE, 0, 0 },
98 { 'Q', 0, 4, etSQLESCAPE2, 0, 0 },
99 { 'b', 0, 2, etBLOB, 0, 0 },
100 { 'B', 0, 2, etBLOBSQL, 0, 0 },
101 { 'w', 0, 2, etWIKISTR, 0, 0 },
102 { 'h', 0, 4, etHTMLIZE, 0, 0 },
103 { 'R', 0, 0, etROOT, 0, 0 },
104 { 't', 0, 4, etHTTPIZE, 0, 0 }, /* "/" -> "%2F" */
105 { 'T', 0, 4, etURLIZE, 0, 0 }, /* "/" unchanged */
 
106 { 'F', 0, 4, etFOSSILIZE, 0, 0 },
107 { 'S', 0, 4, etSTRINGID, 0, 0 },
108 { 'c', 0, 0, etCHARX, 0, 0 },
109 { 'o', 8, 0, etRADIX, 0, 2 },
110 { 'u', 10, 0, etRADIX, 0, 0 },
@@ -661,35 +663,37 @@
661 length = j;
662 assert( length==n+cnt+2 );
663 break;
664 }
665 case etSQLESCAPE:
666 case etSQLESCAPE2: {
 
667 int i, j, n, ch, isnull;
668 int needQuote;
669 int limit = flag_alternateform ? va_arg(ap,int) : -1;
 
670 char *escarg = va_arg(ap,char*);
671 isnull = escarg==0;
672 if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)");
673 if( limit<0 ) limit = strlen(escarg);
674 for(i=n=0; i<limit; i++){
675 if( escarg[i]=='\'' ) n++;
676 }
677 needQuote = !isnull && xtype==etSQLESCAPE2;
678 n += i + 1 + needQuote*2;
679 if( n>etBUFSIZE ){
680 bufpt = zExtra = fossil_malloc( n );
681 }else{
682 bufpt = buf;
683 }
684 j = 0;
685 if( needQuote ) bufpt[j++] = '\'';
686 for(i=0; i<limit; i++){
687 bufpt[j++] = ch = escarg[i];
688 if( ch=='\'' ) bufpt[j++] = ch;
689 }
690 if( needQuote ) bufpt[j++] = '\'';
691 bufpt[j] = 0;
692 length = j;
693 if( precision>=0 && precision<length ) length = precision;
694 break;
695 }
696
--- src/printf.c
+++ src/printf.c
@@ -44,19 +44,20 @@
44 #define etBLOB 11 /* Blob objects. %b */
45 #define etBLOBSQL 12 /* Blob objects quoted for SQL. %B */
46 #define etSQLESCAPE 13 /* Strings with '\'' doubled. %q */
47 #define etSQLESCAPE2 14 /* Strings with '\'' doubled and enclosed in '',
48 NULL pointers replaced by SQL NULL. %Q */
49 #define etSQLESCAPE3 15 /* Double '"' characters within an indentifier. %w */
50 #define etPOINTER 16 /* The %p conversion */
51 #define etHTMLIZE 17 /* Make text safe for HTML */
52 #define etHTTPIZE 18 /* Make text safe for HTTP. "/" encoded as %2f */
53 #define etURLIZE 19 /* Make text safe for HTTP. "/" not encoded */
54 #define etFOSSILIZE 20 /* The fossil header encoding format. */
55 #define etPATH 21 /* Path type */
56 #define etWIKISTR 22 /* Timeline comment text rendered from a char*: %W */
57 #define etSTRINGID 23 /* String with length limit for a UUID prefix: %S */
58 #define etROOT 24 /* String value of g.zTop: %R */
59
60
61 /*
62 ** An "etByte" is an 8-bit unsigned value.
63 */
@@ -96,15 +97,16 @@
97 { 'z', 0, 6, etDYNSTRING, 0, 0 },
98 { 'q', 0, 4, etSQLESCAPE, 0, 0 },
99 { 'Q', 0, 4, etSQLESCAPE2, 0, 0 },
100 { 'b', 0, 2, etBLOB, 0, 0 },
101 { 'B', 0, 2, etBLOBSQL, 0, 0 },
102 { 'W', 0, 2, etWIKISTR, 0, 0 },
103 { 'h', 0, 4, etHTMLIZE, 0, 0 },
104 { 'R', 0, 0, etROOT, 0, 0 },
105 { 't', 0, 4, etHTTPIZE, 0, 0 }, /* "/" -> "%2F" */
106 { 'T', 0, 4, etURLIZE, 0, 0 }, /* "/" unchanged */
107 { 'w', 0, 4, etSQLESCAPE3, 0, 0 },
108 { 'F', 0, 4, etFOSSILIZE, 0, 0 },
109 { 'S', 0, 4, etSTRINGID, 0, 0 },
110 { 'c', 0, 0, etCHARX, 0, 0 },
111 { 'o', 8, 0, etRADIX, 0, 2 },
112 { 'u', 10, 0, etRADIX, 0, 0 },
@@ -661,35 +663,37 @@
663 length = j;
664 assert( length==n+cnt+2 );
665 break;
666 }
667 case etSQLESCAPE:
668 case etSQLESCAPE2:
669 case etSQLESCAPE3: {
670 int i, j, n, ch, isnull;
671 int needQuote;
672 int limit = flag_alternateform ? va_arg(ap,int) : -1;
673 char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote characters */
674 char *escarg = va_arg(ap,char*);
675 isnull = escarg==0;
676 if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)");
677 if( limit<0 ) limit = strlen(escarg);
678 for(i=n=0; i<limit; i++){
679 if( escarg[i]==q ) n++;
680 }
681 needQuote = !isnull && xtype==etSQLESCAPE2;
682 n += i + 1 + needQuote*2;
683 if( n>etBUFSIZE ){
684 bufpt = zExtra = fossil_malloc( n );
685 }else{
686 bufpt = buf;
687 }
688 j = 0;
689 if( needQuote ) bufpt[j++] = q;
690 for(i=0; i<limit; i++){
691 bufpt[j++] = ch = escarg[i];
692 if( ch==q ) bufpt[j++] = ch;
693 }
694 if( needQuote ) bufpt[j++] = q;
695 bufpt[j] = 0;
696 length = j;
697 if( precision>=0 && precision<length ) length = precision;
698 break;
699 }
700
+9 -8
--- src/rebuild.c
+++ src/rebuild.c
@@ -81,12 +81,12 @@
8181
@ );
8282
;
8383
8484
static void rebuild_update_schema(void){
8585
int rc;
86
- db_multi_exec(zSchemaUpdates1);
87
- db_multi_exec(zSchemaUpdates2);
86
+ db_multi_exec("%s", zSchemaUpdates1 /*safe-for-%s*/);
87
+ db_multi_exec("%s", zSchemaUpdates2 /*safe-for-%s*/);
8888
8989
rc = db_exists("SELECT 1 FROM sqlite_master"
9090
" WHERE name='user' AND sql GLOB '* mtime *'");
9191
if( rc==0 ){
9292
db_multi_exec(
@@ -135,11 +135,11 @@
135135
if( rc==0 ){
136136
db_multi_exec(
137137
"CREATE TEMP TABLE old_fmt AS SELECT * FROM reportfmt;"
138138
"DROP TABLE reportfmt;"
139139
);
140
- db_multi_exec(zSchemaUpdates2);
140
+ db_multi_exec("%s", zSchemaUpdates2/*safe-for-%s*/);
141141
db_multi_exec(
142142
"INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
143143
" SELECT rn, owner, title, cols, sqlcode, now() FROM old_fmt;"
144144
"INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
145145
" SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode, now()"
@@ -254,11 +254,12 @@
254254
/* We are doing "fossil rebuild" */
255255
manifest_crosslink(rid, pUse, MC_NONE);
256256
}else{
257257
/* We are doing "fossil deconstruct" */
258258
char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
259
- char *zFile = mprintf(zFNameFormat, zUuid, zUuid+prefixLength);
259
+ char *zFile = mprintf(zFNameFormat /*works-like:"%s:%s"*/,
260
+ zUuid, zUuid+prefixLength);
260261
blob_write_to_file(pUse,zFile);
261262
free(zFile);
262263
free(zUuid);
263264
blob_reset(pUse);
264265
}
@@ -355,11 +356,11 @@
355356
);
356357
if( zTable==0 ) break;
357358
db_multi_exec("DROP TABLE %Q", zTable);
358359
free(zTable);
359360
}
360
- db_multi_exec(zRepositorySchema2);
361
+ db_multi_exec("%s", zRepositorySchema2/*safe-for-%s*/);
361362
ticket_create_table(0);
362363
shun_artifacts();
363364
364365
db_multi_exec(
365366
"INSERT INTO unclustered"
@@ -587,13 +588,13 @@
587588
db_begin_transaction();
588589
ttyOutput = 1;
589590
errCnt = rebuild_db(randomizeFlag, 1, doClustering);
590591
reconstruct_private_table();
591592
db_multi_exec(
592
- "REPLACE INTO config(name,value,mtime) VALUES('content-schema','%s',now());"
593
- "REPLACE INTO config(name,value,mtime) VALUES('aux-schema','%s',now());"
594
- "REPLACE INTO config(name,value,mtime) VALUES('rebuilt','%s',now());",
593
+ "REPLACE INTO config(name,value,mtime) VALUES('content-schema',%Q,now());"
594
+ "REPLACE INTO config(name,value,mtime) VALUES('aux-schema',%Q,now());"
595
+ "REPLACE INTO config(name,value,mtime) VALUES('rebuilt',%Q,now());",
595596
CONTENT_SCHEMA, AUX_SCHEMA, get_version()
596597
);
597598
if( errCnt && !forceFlag ){
598599
fossil_print(
599600
"%d errors. Rolling back changes. Use --force to force a commit.\n",
600601
--- src/rebuild.c
+++ src/rebuild.c
@@ -81,12 +81,12 @@
81 @ );
82 ;
83
84 static void rebuild_update_schema(void){
85 int rc;
86 db_multi_exec(zSchemaUpdates1);
87 db_multi_exec(zSchemaUpdates2);
88
89 rc = db_exists("SELECT 1 FROM sqlite_master"
90 " WHERE name='user' AND sql GLOB '* mtime *'");
91 if( rc==0 ){
92 db_multi_exec(
@@ -135,11 +135,11 @@
135 if( rc==0 ){
136 db_multi_exec(
137 "CREATE TEMP TABLE old_fmt AS SELECT * FROM reportfmt;"
138 "DROP TABLE reportfmt;"
139 );
140 db_multi_exec(zSchemaUpdates2);
141 db_multi_exec(
142 "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
143 " SELECT rn, owner, title, cols, sqlcode, now() FROM old_fmt;"
144 "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
145 " SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode, now()"
@@ -254,11 +254,12 @@
254 /* We are doing "fossil rebuild" */
255 manifest_crosslink(rid, pUse, MC_NONE);
256 }else{
257 /* We are doing "fossil deconstruct" */
258 char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
259 char *zFile = mprintf(zFNameFormat, zUuid, zUuid+prefixLength);
 
260 blob_write_to_file(pUse,zFile);
261 free(zFile);
262 free(zUuid);
263 blob_reset(pUse);
264 }
@@ -355,11 +356,11 @@
355 );
356 if( zTable==0 ) break;
357 db_multi_exec("DROP TABLE %Q", zTable);
358 free(zTable);
359 }
360 db_multi_exec(zRepositorySchema2);
361 ticket_create_table(0);
362 shun_artifacts();
363
364 db_multi_exec(
365 "INSERT INTO unclustered"
@@ -587,13 +588,13 @@
587 db_begin_transaction();
588 ttyOutput = 1;
589 errCnt = rebuild_db(randomizeFlag, 1, doClustering);
590 reconstruct_private_table();
591 db_multi_exec(
592 "REPLACE INTO config(name,value,mtime) VALUES('content-schema','%s',now());"
593 "REPLACE INTO config(name,value,mtime) VALUES('aux-schema','%s',now());"
594 "REPLACE INTO config(name,value,mtime) VALUES('rebuilt','%s',now());",
595 CONTENT_SCHEMA, AUX_SCHEMA, get_version()
596 );
597 if( errCnt && !forceFlag ){
598 fossil_print(
599 "%d errors. Rolling back changes. Use --force to force a commit.\n",
600
--- src/rebuild.c
+++ src/rebuild.c
@@ -81,12 +81,12 @@
81 @ );
82 ;
83
84 static void rebuild_update_schema(void){
85 int rc;
86 db_multi_exec("%s", zSchemaUpdates1 /*safe-for-%s*/);
87 db_multi_exec("%s", zSchemaUpdates2 /*safe-for-%s*/);
88
89 rc = db_exists("SELECT 1 FROM sqlite_master"
90 " WHERE name='user' AND sql GLOB '* mtime *'");
91 if( rc==0 ){
92 db_multi_exec(
@@ -135,11 +135,11 @@
135 if( rc==0 ){
136 db_multi_exec(
137 "CREATE TEMP TABLE old_fmt AS SELECT * FROM reportfmt;"
138 "DROP TABLE reportfmt;"
139 );
140 db_multi_exec("%s", zSchemaUpdates2/*safe-for-%s*/);
141 db_multi_exec(
142 "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
143 " SELECT rn, owner, title, cols, sqlcode, now() FROM old_fmt;"
144 "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)"
145 " SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode, now()"
@@ -254,11 +254,12 @@
254 /* We are doing "fossil rebuild" */
255 manifest_crosslink(rid, pUse, MC_NONE);
256 }else{
257 /* We are doing "fossil deconstruct" */
258 char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
259 char *zFile = mprintf(zFNameFormat /*works-like:"%s:%s"*/,
260 zUuid, zUuid+prefixLength);
261 blob_write_to_file(pUse,zFile);
262 free(zFile);
263 free(zUuid);
264 blob_reset(pUse);
265 }
@@ -355,11 +356,11 @@
356 );
357 if( zTable==0 ) break;
358 db_multi_exec("DROP TABLE %Q", zTable);
359 free(zTable);
360 }
361 db_multi_exec("%s", zRepositorySchema2/*safe-for-%s*/);
362 ticket_create_table(0);
363 shun_artifacts();
364
365 db_multi_exec(
366 "INSERT INTO unclustered"
@@ -587,13 +588,13 @@
588 db_begin_transaction();
589 ttyOutput = 1;
590 errCnt = rebuild_db(randomizeFlag, 1, doClustering);
591 reconstruct_private_table();
592 db_multi_exec(
593 "REPLACE INTO config(name,value,mtime) VALUES('content-schema',%Q,now());"
594 "REPLACE INTO config(name,value,mtime) VALUES('aux-schema',%Q,now());"
595 "REPLACE INTO config(name,value,mtime) VALUES('rebuilt',%Q,now());",
596 CONTENT_SCHEMA, AUX_SCHEMA, get_version()
597 );
598 if( errCnt && !forceFlag ){
599 fossil_print(
600 "%d errors. Rolling back changes. Use --force to force a commit.\n",
601
+5 -7
--- src/report.c
+++ src/report.c
@@ -436,11 +436,11 @@
436436
if( zOwner==0 ) zOwner = g.zLogin;
437437
style_submenu_element("Cancel", "Cancel", "reportlist");
438438
if( rn>0 ){
439439
style_submenu_element("Delete", "Delete", "rptedit?rn=%d&del1=1", rn);
440440
}
441
- style_header(rn>0 ? "Edit Report Format":"Create New Report Format");
441
+ style_header("%s", rn>0 ? "Edit Report Format":"Create New Report Format");
442442
if( zErr ){
443443
@ <blockquote class="reportError">%h(zErr)</blockquote>
444444
}
445445
@ <form action="rptedit" method="post"><div>
446446
@ <input type="hidden" name="rn" value="%d(rn)" />
@@ -1070,11 +1070,11 @@
10701070
}
10711071
if( g.perm.NewTkt ){
10721072
style_submenu_element("New Ticket", "Create a new ticket",
10731073
"%s/tktnew", g.zTop);
10741074
}
1075
- style_header(zTitle);
1075
+ style_header("%s", zTitle);
10761076
output_color_key(zClrKey, 1,
10771077
"border=\"0\" cellpadding=\"3\" cellspacing=\"0\" class=\"report\"");
10781078
@ <table border="1" cellpadding="2" cellspacing="0" class="report"
10791079
@ id="reportTable">
10801080
sState.rn = rn;
@@ -1112,21 +1112,19 @@
11121112
** show all reports, which can be used for ticket show.
11131113
** Output is written to stdout as tab delimited table
11141114
*/
11151115
void rpt_list_reports(void){
11161116
Stmt q;
1117
- const char aRptOutFrmt[] = "%s\t%s\n";
1118
-
11191117
fossil_print("Available reports:\n");
1120
- fossil_print(aRptOutFrmt,"report number","report title");
1121
- fossil_print(aRptOutFrmt,zFullTicketRptRn,zFullTicketRptTitle);
1118
+ fossil_print("%s\t%s\n","report number","report title");
1119
+ fossil_print("%s\t%s\n",zFullTicketRptRn,zFullTicketRptTitle);
11221120
db_prepare(&q,"SELECT rn,title FROM reportfmt ORDER BY rn");
11231121
while( db_step(&q)==SQLITE_ROW ){
11241122
const char *zRn = db_column_text(&q, 0);
11251123
const char *zTitle = db_column_text(&q, 1);
11261124
1127
- fossil_print(aRptOutFrmt,zRn,zTitle);
1125
+ fossil_print("%s\t%s\n",zRn,zTitle);
11281126
}
11291127
db_finalize(&q);
11301128
}
11311129
11321130
/*
11331131
--- src/report.c
+++ src/report.c
@@ -436,11 +436,11 @@
436 if( zOwner==0 ) zOwner = g.zLogin;
437 style_submenu_element("Cancel", "Cancel", "reportlist");
438 if( rn>0 ){
439 style_submenu_element("Delete", "Delete", "rptedit?rn=%d&del1=1", rn);
440 }
441 style_header(rn>0 ? "Edit Report Format":"Create New Report Format");
442 if( zErr ){
443 @ <blockquote class="reportError">%h(zErr)</blockquote>
444 }
445 @ <form action="rptedit" method="post"><div>
446 @ <input type="hidden" name="rn" value="%d(rn)" />
@@ -1070,11 +1070,11 @@
1070 }
1071 if( g.perm.NewTkt ){
1072 style_submenu_element("New Ticket", "Create a new ticket",
1073 "%s/tktnew", g.zTop);
1074 }
1075 style_header(zTitle);
1076 output_color_key(zClrKey, 1,
1077 "border=\"0\" cellpadding=\"3\" cellspacing=\"0\" class=\"report\"");
1078 @ <table border="1" cellpadding="2" cellspacing="0" class="report"
1079 @ id="reportTable">
1080 sState.rn = rn;
@@ -1112,21 +1112,19 @@
1112 ** show all reports, which can be used for ticket show.
1113 ** Output is written to stdout as tab delimited table
1114 */
1115 void rpt_list_reports(void){
1116 Stmt q;
1117 const char aRptOutFrmt[] = "%s\t%s\n";
1118
1119 fossil_print("Available reports:\n");
1120 fossil_print(aRptOutFrmt,"report number","report title");
1121 fossil_print(aRptOutFrmt,zFullTicketRptRn,zFullTicketRptTitle);
1122 db_prepare(&q,"SELECT rn,title FROM reportfmt ORDER BY rn");
1123 while( db_step(&q)==SQLITE_ROW ){
1124 const char *zRn = db_column_text(&q, 0);
1125 const char *zTitle = db_column_text(&q, 1);
1126
1127 fossil_print(aRptOutFrmt,zRn,zTitle);
1128 }
1129 db_finalize(&q);
1130 }
1131
1132 /*
1133
--- src/report.c
+++ src/report.c
@@ -436,11 +436,11 @@
436 if( zOwner==0 ) zOwner = g.zLogin;
437 style_submenu_element("Cancel", "Cancel", "reportlist");
438 if( rn>0 ){
439 style_submenu_element("Delete", "Delete", "rptedit?rn=%d&del1=1", rn);
440 }
441 style_header("%s", rn>0 ? "Edit Report Format":"Create New Report Format");
442 if( zErr ){
443 @ <blockquote class="reportError">%h(zErr)</blockquote>
444 }
445 @ <form action="rptedit" method="post"><div>
446 @ <input type="hidden" name="rn" value="%d(rn)" />
@@ -1070,11 +1070,11 @@
1070 }
1071 if( g.perm.NewTkt ){
1072 style_submenu_element("New Ticket", "Create a new ticket",
1073 "%s/tktnew", g.zTop);
1074 }
1075 style_header("%s", zTitle);
1076 output_color_key(zClrKey, 1,
1077 "border=\"0\" cellpadding=\"3\" cellspacing=\"0\" class=\"report\"");
1078 @ <table border="1" cellpadding="2" cellspacing="0" class="report"
1079 @ id="reportTable">
1080 sState.rn = rn;
@@ -1112,21 +1112,19 @@
1112 ** show all reports, which can be used for ticket show.
1113 ** Output is written to stdout as tab delimited table
1114 */
1115 void rpt_list_reports(void){
1116 Stmt q;
 
 
1117 fossil_print("Available reports:\n");
1118 fossil_print("%s\t%s\n","report number","report title");
1119 fossil_print("%s\t%s\n",zFullTicketRptRn,zFullTicketRptTitle);
1120 db_prepare(&q,"SELECT rn,title FROM reportfmt ORDER BY rn");
1121 while( db_step(&q)==SQLITE_ROW ){
1122 const char *zRn = db_column_text(&q, 0);
1123 const char *zTitle = db_column_text(&q, 1);
1124
1125 fossil_print("%s\t%s\n",zRn,zTitle);
1126 }
1127 db_finalize(&q);
1128 }
1129
1130 /*
1131
+10 -10
--- src/rss.c
+++ src/rss.c
@@ -76,11 +76,11 @@
7676
7777
if( zType[0]!='a' ){
7878
if( zType[0]=='c' && !g.perm.Read ) zType = "x";
7979
if( zType[0]=='w' && !g.perm.RdWiki ) zType = "x";
8080
if( zType[0]=='t' && !g.perm.RdTkt ) zType = "x";
81
- blob_appendf(&bSQL, " AND event.type=%Q", zType);
81
+ blob_append_sql(&bSQL, " AND event.type=%Q", zType);
8282
}else{
8383
if( !g.perm.Read ){
8484
if( g.perm.RdTkt && g.perm.RdWiki ){
8585
blob_append(&bSQL, " AND event.type!='ci'", -1);
8686
}else if( g.perm.RdTkt ){
@@ -122,18 +122,18 @@
122122
}else{
123123
nTagId = 0;
124124
}
125125
126126
if( nTagId==-1 ){
127
- blob_appendf(&bSQL, " AND 0");
127
+ blob_append_sql(&bSQL, " AND 0");
128128
}else if( nTagId!=0 ){
129
- blob_appendf(&bSQL, " AND (EXISTS(SELECT 1 FROM tagxref"
129
+ blob_append_sql(&bSQL, " AND (EXISTS(SELECT 1 FROM tagxref"
130130
" WHERE tagid=%d AND tagtype>0 AND rid=blob.rid))", nTagId);
131131
}
132132
133133
if( zFilename ){
134
- blob_appendf(&bSQL,
134
+ blob_append_sql(&bSQL,
135135
" AND (SELECT mlink.fnid FROM mlink WHERE event.objid=mlink.mid) IN (SELECT fnid FROM filename WHERE name=%Q %s)",
136136
zFilename, filename_collation()
137137
);
138138
}
139139
@@ -160,11 +160,11 @@
160160
@ <link>%s(g.zBaseURL)</link>
161161
@ <description>%h(zProjectDescr)</description>
162162
@ <pubDate>%s(zPubDate)</pubDate>
163163
@ <generator>Fossil version %s(MANIFEST_VERSION) %s(MANIFEST_DATE)</generator>
164164
free(zPubDate);
165
- db_prepare(&q, blob_str(&bSQL));
165
+ db_prepare(&q, "%s", blob_sql_text(&bSQL));
166166
blob_reset( &bSQL );
167167
while( db_step(&q)==SQLITE_ROW && nLine<nLimit ){
168168
const char *zId = db_column_text(&q, 1);
169169
const char *zCom = db_column_text(&q, 3);
170170
const char *zAuthor = db_column_text(&q, 4);
@@ -280,11 +280,11 @@
280280
281281
blob_zero(&bSQL);
282282
blob_append( &bSQL, zSQL1, -1 );
283283
284284
if( zType[0]!='a' ){
285
- blob_appendf(&bSQL, " AND event.type=%Q", zType);
285
+ blob_append_sql(&bSQL, " AND event.type=%Q", zType);
286286
}
287287
288288
if( zTicketUuid ){
289289
nTagId = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",
290290
zTicketUuid);
@@ -306,18 +306,18 @@
306306
}else{
307307
nTagId = 0;
308308
}
309309
310310
if( nTagId==-1 ){
311
- blob_appendf(&bSQL, " AND 0");
311
+ blob_append_sql(&bSQL, " AND 0");
312312
}else if( nTagId!=0 ){
313
- blob_appendf(&bSQL, " AND (EXISTS(SELECT 1 FROM tagxref"
313
+ blob_append_sql(&bSQL, " AND (EXISTS(SELECT 1 FROM tagxref"
314314
" WHERE tagid=%d AND tagtype>0 AND rid=blob.rid))", nTagId);
315315
}
316316
317317
if( zFilename ){
318
- blob_appendf(&bSQL,
318
+ blob_append_sql(&bSQL,
319319
" AND (SELECT mlink.fnid FROM mlink WHERE event.objid=mlink.mid) IN (SELECT fnid FROM filename WHERE name=%Q %s)",
320320
zFilename, filename_collation()
321321
);
322322
}
323323
@@ -343,11 +343,11 @@
343343
fossil_print("<description>%h</description>\n", zProjectDescr);
344344
fossil_print("<pubDate>%s</pubDate>\n", zPubDate);
345345
fossil_print("<generator>Fossil version %s %s</generator>\n",
346346
MANIFEST_VERSION, MANIFEST_DATE);
347347
free(zPubDate);
348
- db_prepare(&q, blob_str(&bSQL));
348
+ db_prepare(&q, "%s", blob_sql_text(&bSQL));
349349
blob_reset( &bSQL );
350350
while( db_step(&q)==SQLITE_ROW && nLine<nLimit ){
351351
const char *zId = db_column_text(&q, 1);
352352
const char *zCom = db_column_text(&q, 3);
353353
const char *zAuthor = db_column_text(&q, 4);
354354
--- src/rss.c
+++ src/rss.c
@@ -76,11 +76,11 @@
76
77 if( zType[0]!='a' ){
78 if( zType[0]=='c' && !g.perm.Read ) zType = "x";
79 if( zType[0]=='w' && !g.perm.RdWiki ) zType = "x";
80 if( zType[0]=='t' && !g.perm.RdTkt ) zType = "x";
81 blob_appendf(&bSQL, " AND event.type=%Q", zType);
82 }else{
83 if( !g.perm.Read ){
84 if( g.perm.RdTkt && g.perm.RdWiki ){
85 blob_append(&bSQL, " AND event.type!='ci'", -1);
86 }else if( g.perm.RdTkt ){
@@ -122,18 +122,18 @@
122 }else{
123 nTagId = 0;
124 }
125
126 if( nTagId==-1 ){
127 blob_appendf(&bSQL, " AND 0");
128 }else if( nTagId!=0 ){
129 blob_appendf(&bSQL, " AND (EXISTS(SELECT 1 FROM tagxref"
130 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid))", nTagId);
131 }
132
133 if( zFilename ){
134 blob_appendf(&bSQL,
135 " AND (SELECT mlink.fnid FROM mlink WHERE event.objid=mlink.mid) IN (SELECT fnid FROM filename WHERE name=%Q %s)",
136 zFilename, filename_collation()
137 );
138 }
139
@@ -160,11 +160,11 @@
160 @ <link>%s(g.zBaseURL)</link>
161 @ <description>%h(zProjectDescr)</description>
162 @ <pubDate>%s(zPubDate)</pubDate>
163 @ <generator>Fossil version %s(MANIFEST_VERSION) %s(MANIFEST_DATE)</generator>
164 free(zPubDate);
165 db_prepare(&q, blob_str(&bSQL));
166 blob_reset( &bSQL );
167 while( db_step(&q)==SQLITE_ROW && nLine<nLimit ){
168 const char *zId = db_column_text(&q, 1);
169 const char *zCom = db_column_text(&q, 3);
170 const char *zAuthor = db_column_text(&q, 4);
@@ -280,11 +280,11 @@
280
281 blob_zero(&bSQL);
282 blob_append( &bSQL, zSQL1, -1 );
283
284 if( zType[0]!='a' ){
285 blob_appendf(&bSQL, " AND event.type=%Q", zType);
286 }
287
288 if( zTicketUuid ){
289 nTagId = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",
290 zTicketUuid);
@@ -306,18 +306,18 @@
306 }else{
307 nTagId = 0;
308 }
309
310 if( nTagId==-1 ){
311 blob_appendf(&bSQL, " AND 0");
312 }else if( nTagId!=0 ){
313 blob_appendf(&bSQL, " AND (EXISTS(SELECT 1 FROM tagxref"
314 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid))", nTagId);
315 }
316
317 if( zFilename ){
318 blob_appendf(&bSQL,
319 " AND (SELECT mlink.fnid FROM mlink WHERE event.objid=mlink.mid) IN (SELECT fnid FROM filename WHERE name=%Q %s)",
320 zFilename, filename_collation()
321 );
322 }
323
@@ -343,11 +343,11 @@
343 fossil_print("<description>%h</description>\n", zProjectDescr);
344 fossil_print("<pubDate>%s</pubDate>\n", zPubDate);
345 fossil_print("<generator>Fossil version %s %s</generator>\n",
346 MANIFEST_VERSION, MANIFEST_DATE);
347 free(zPubDate);
348 db_prepare(&q, blob_str(&bSQL));
349 blob_reset( &bSQL );
350 while( db_step(&q)==SQLITE_ROW && nLine<nLimit ){
351 const char *zId = db_column_text(&q, 1);
352 const char *zCom = db_column_text(&q, 3);
353 const char *zAuthor = db_column_text(&q, 4);
354
--- src/rss.c
+++ src/rss.c
@@ -76,11 +76,11 @@
76
77 if( zType[0]!='a' ){
78 if( zType[0]=='c' && !g.perm.Read ) zType = "x";
79 if( zType[0]=='w' && !g.perm.RdWiki ) zType = "x";
80 if( zType[0]=='t' && !g.perm.RdTkt ) zType = "x";
81 blob_append_sql(&bSQL, " AND event.type=%Q", zType);
82 }else{
83 if( !g.perm.Read ){
84 if( g.perm.RdTkt && g.perm.RdWiki ){
85 blob_append(&bSQL, " AND event.type!='ci'", -1);
86 }else if( g.perm.RdTkt ){
@@ -122,18 +122,18 @@
122 }else{
123 nTagId = 0;
124 }
125
126 if( nTagId==-1 ){
127 blob_append_sql(&bSQL, " AND 0");
128 }else if( nTagId!=0 ){
129 blob_append_sql(&bSQL, " AND (EXISTS(SELECT 1 FROM tagxref"
130 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid))", nTagId);
131 }
132
133 if( zFilename ){
134 blob_append_sql(&bSQL,
135 " AND (SELECT mlink.fnid FROM mlink WHERE event.objid=mlink.mid) IN (SELECT fnid FROM filename WHERE name=%Q %s)",
136 zFilename, filename_collation()
137 );
138 }
139
@@ -160,11 +160,11 @@
160 @ <link>%s(g.zBaseURL)</link>
161 @ <description>%h(zProjectDescr)</description>
162 @ <pubDate>%s(zPubDate)</pubDate>
163 @ <generator>Fossil version %s(MANIFEST_VERSION) %s(MANIFEST_DATE)</generator>
164 free(zPubDate);
165 db_prepare(&q, "%s", blob_sql_text(&bSQL));
166 blob_reset( &bSQL );
167 while( db_step(&q)==SQLITE_ROW && nLine<nLimit ){
168 const char *zId = db_column_text(&q, 1);
169 const char *zCom = db_column_text(&q, 3);
170 const char *zAuthor = db_column_text(&q, 4);
@@ -280,11 +280,11 @@
280
281 blob_zero(&bSQL);
282 blob_append( &bSQL, zSQL1, -1 );
283
284 if( zType[0]!='a' ){
285 blob_append_sql(&bSQL, " AND event.type=%Q", zType);
286 }
287
288 if( zTicketUuid ){
289 nTagId = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",
290 zTicketUuid);
@@ -306,18 +306,18 @@
306 }else{
307 nTagId = 0;
308 }
309
310 if( nTagId==-1 ){
311 blob_append_sql(&bSQL, " AND 0");
312 }else if( nTagId!=0 ){
313 blob_append_sql(&bSQL, " AND (EXISTS(SELECT 1 FROM tagxref"
314 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid))", nTagId);
315 }
316
317 if( zFilename ){
318 blob_append_sql(&bSQL,
319 " AND (SELECT mlink.fnid FROM mlink WHERE event.objid=mlink.mid) IN (SELECT fnid FROM filename WHERE name=%Q %s)",
320 zFilename, filename_collation()
321 );
322 }
323
@@ -343,11 +343,11 @@
343 fossil_print("<description>%h</description>\n", zProjectDescr);
344 fossil_print("<pubDate>%s</pubDate>\n", zPubDate);
345 fossil_print("<generator>Fossil version %s %s</generator>\n",
346 MANIFEST_VERSION, MANIFEST_DATE);
347 free(zPubDate);
348 db_prepare(&q, "%s", blob_sql_text(&bSQL));
349 blob_reset( &bSQL );
350 while( db_step(&q)==SQLITE_ROW && nLine<nLimit ){
351 const char *zId = db_column_text(&q, 1);
352 const char *zCom = db_column_text(&q, 3);
353 const char *zAuthor = db_column_text(&q, 4);
354
+2 -2
--- src/search.c
+++ src/search.c
@@ -231,13 +231,13 @@
231231
iBest = db_int(0, "SELECT max(x) FROM srch");
232232
blob_append(&sql,
233233
"SELECT rid, uuid, date, comment, 0, 0 FROM srch "
234234
"WHERE 1 ", -1);
235235
if(!fAll){
236
- blob_appendf(&sql,"AND x>%d ", iBest/3);
236
+ blob_append_sql(&sql,"AND x>%d ", iBest/3);
237237
}
238238
blob_append(&sql, "ORDER BY x DESC, date DESC ", -1);
239
- db_prepare(&q, blob_str(&sql));
239
+ db_prepare(&q, "%s", blob_sql_text(&sql));
240240
blob_reset(&sql);
241241
print_timeline(&q, nLimit, width, 0);
242242
db_finalize(&q);
243243
}
244244
--- src/search.c
+++ src/search.c
@@ -231,13 +231,13 @@
231 iBest = db_int(0, "SELECT max(x) FROM srch");
232 blob_append(&sql,
233 "SELECT rid, uuid, date, comment, 0, 0 FROM srch "
234 "WHERE 1 ", -1);
235 if(!fAll){
236 blob_appendf(&sql,"AND x>%d ", iBest/3);
237 }
238 blob_append(&sql, "ORDER BY x DESC, date DESC ", -1);
239 db_prepare(&q, blob_str(&sql));
240 blob_reset(&sql);
241 print_timeline(&q, nLimit, width, 0);
242 db_finalize(&q);
243 }
244
--- src/search.c
+++ src/search.c
@@ -231,13 +231,13 @@
231 iBest = db_int(0, "SELECT max(x) FROM srch");
232 blob_append(&sql,
233 "SELECT rid, uuid, date, comment, 0, 0 FROM srch "
234 "WHERE 1 ", -1);
235 if(!fAll){
236 blob_append_sql(&sql,"AND x>%d ", iBest/3);
237 }
238 blob_append(&sql, "ORDER BY x DESC, date DESC ", -1);
239 db_prepare(&q, "%s", blob_sql_text(&sql));
240 blob_reset(&sql);
241 print_timeline(&q, nLimit, width, 0);
242 db_finalize(&q);
243 }
244
+8 -4
--- src/setup.c
+++ src/setup.c
@@ -375,11 +375,11 @@
375375
return;
376376
}
377377
login_verify_csrf_secret();
378378
db_multi_exec(
379379
"REPLACE INTO user(uid,login,info,pw,cap,mtime) "
380
- "VALUES(nullif(%d,0),%Q,%Q,%Q,'%s',now())",
380
+ "VALUES(nullif(%d,0),%Q,%Q,%Q,%Q,now())",
381381
uid, P("login"), P("info"), zPw, zCap
382382
);
383383
if( atoi(PD("all","0"))>0 ){
384384
Blob sql;
385385
char *zErr = 0;
@@ -477,11 +477,11 @@
477477
478478
/* Begin generating the page
479479
*/
480480
style_submenu_element("Cancel", "Cancel", "setup_ulist");
481481
if( uid ){
482
- style_header(mprintf("Edit User %h", zLogin));
482
+ style_header("Edit User %h", zLogin);
483483
}else{
484484
style_header("Add A New User");
485485
}
486486
@ <div class="ueditCapBox">
487487
@ <form action="%s(g.zPath)" method="post"><div>
@@ -1157,11 +1157,11 @@
11571157
login_check_credentials();
11581158
if( !g.perm.Setup ){
11591159
login_needed();
11601160
}
11611161
file_canonical_name(g.zRepositoryName, &fullName, 0);
1162
- zSelfRepo = mprintf(blob_str(&fullName));
1162
+ zSelfRepo = fossil_strdup(blob_str(&fullName));
11631163
blob_reset(&fullName);
11641164
if( P("join")!=0 ){
11651165
login_group_join(zRepo, zLogin, zPw, zNewName, &zErrMsg);
11661166
}else if( P("leave") ){
11671167
login_group_leave(&zErrMsg);
@@ -1331,11 +1331,15 @@
13311331
login_needed();
13321332
}
13331333
13341334
(void) aCmdHelp; /* NOTE: Silence compiler warning. */
13351335
style_header("Settings");
1336
- db_open_local(0);
1336
+ if(!g.repositoryOpen){
1337
+ /* Provide read-only access to versioned settings,
1338
+ but only if no repo file was explicitly provided. */
1339
+ db_open_local(0);
1340
+ }
13371341
db_begin_transaction();
13381342
@ <p>This page provides a simple interface to the "fossil setting" command.
13391343
@ See the "fossil help setting" output below for further information on
13401344
@ the meaning of each setting.</p><hr />
13411345
@ <form action="%s(g.zTop)/setup_settings" method="post"><div>
13421346
--- src/setup.c
+++ src/setup.c
@@ -375,11 +375,11 @@
375 return;
376 }
377 login_verify_csrf_secret();
378 db_multi_exec(
379 "REPLACE INTO user(uid,login,info,pw,cap,mtime) "
380 "VALUES(nullif(%d,0),%Q,%Q,%Q,'%s',now())",
381 uid, P("login"), P("info"), zPw, zCap
382 );
383 if( atoi(PD("all","0"))>0 ){
384 Blob sql;
385 char *zErr = 0;
@@ -477,11 +477,11 @@
477
478 /* Begin generating the page
479 */
480 style_submenu_element("Cancel", "Cancel", "setup_ulist");
481 if( uid ){
482 style_header(mprintf("Edit User %h", zLogin));
483 }else{
484 style_header("Add A New User");
485 }
486 @ <div class="ueditCapBox">
487 @ <form action="%s(g.zPath)" method="post"><div>
@@ -1157,11 +1157,11 @@
1157 login_check_credentials();
1158 if( !g.perm.Setup ){
1159 login_needed();
1160 }
1161 file_canonical_name(g.zRepositoryName, &fullName, 0);
1162 zSelfRepo = mprintf(blob_str(&fullName));
1163 blob_reset(&fullName);
1164 if( P("join")!=0 ){
1165 login_group_join(zRepo, zLogin, zPw, zNewName, &zErrMsg);
1166 }else if( P("leave") ){
1167 login_group_leave(&zErrMsg);
@@ -1331,11 +1331,15 @@
1331 login_needed();
1332 }
1333
1334 (void) aCmdHelp; /* NOTE: Silence compiler warning. */
1335 style_header("Settings");
1336 db_open_local(0);
 
 
 
 
1337 db_begin_transaction();
1338 @ <p>This page provides a simple interface to the "fossil setting" command.
1339 @ See the "fossil help setting" output below for further information on
1340 @ the meaning of each setting.</p><hr />
1341 @ <form action="%s(g.zTop)/setup_settings" method="post"><div>
1342
--- src/setup.c
+++ src/setup.c
@@ -375,11 +375,11 @@
375 return;
376 }
377 login_verify_csrf_secret();
378 db_multi_exec(
379 "REPLACE INTO user(uid,login,info,pw,cap,mtime) "
380 "VALUES(nullif(%d,0),%Q,%Q,%Q,%Q,now())",
381 uid, P("login"), P("info"), zPw, zCap
382 );
383 if( atoi(PD("all","0"))>0 ){
384 Blob sql;
385 char *zErr = 0;
@@ -477,11 +477,11 @@
477
478 /* Begin generating the page
479 */
480 style_submenu_element("Cancel", "Cancel", "setup_ulist");
481 if( uid ){
482 style_header("Edit User %h", zLogin);
483 }else{
484 style_header("Add A New User");
485 }
486 @ <div class="ueditCapBox">
487 @ <form action="%s(g.zPath)" method="post"><div>
@@ -1157,11 +1157,11 @@
1157 login_check_credentials();
1158 if( !g.perm.Setup ){
1159 login_needed();
1160 }
1161 file_canonical_name(g.zRepositoryName, &fullName, 0);
1162 zSelfRepo = fossil_strdup(blob_str(&fullName));
1163 blob_reset(&fullName);
1164 if( P("join")!=0 ){
1165 login_group_join(zRepo, zLogin, zPw, zNewName, &zErrMsg);
1166 }else if( P("leave") ){
1167 login_group_leave(&zErrMsg);
@@ -1331,11 +1331,15 @@
1331 login_needed();
1332 }
1333
1334 (void) aCmdHelp; /* NOTE: Silence compiler warning. */
1335 style_header("Settings");
1336 if(!g.repositoryOpen){
1337 /* Provide read-only access to versioned settings,
1338 but only if no repo file was explicitly provided. */
1339 db_open_local(0);
1340 }
1341 db_begin_transaction();
1342 @ <p>This page provides a simple interface to the "fossil setting" command.
1343 @ See the "fossil help setting" output below for further information on
1344 @ the meaning of each setting.</p><hr />
1345 @ <form action="%s(g.zTop)/setup_settings" method="post"><div>
1346
+12 -1
--- src/shell.c
+++ src/shell.c
@@ -880,11 +880,11 @@
880880
for(i=0; i<nArg; i++){
881881
output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
882882
}
883883
fprintf(p->out,"%s",p->newline);
884884
}
885
- if( azArg>0 ){
885
+ if( nArg>0 ){
886886
for(i=0; i<nArg; i++){
887887
output_csv(p, azArg[i], i<nArg-1);
888888
}
889889
fprintf(p->out,"%s",p->newline);
890890
}
@@ -1350,10 +1350,21 @@
13501350
}
13511351
}
13521352
sqlite3_finalize(pExplain);
13531353
sqlite3_free(zEQP);
13541354
}
1355
+
1356
+#if USE_SYSTEM_SQLITE+0==1
1357
+ /* Output TESTCTRL_EXPLAIN text of requested */
1358
+ if( pArg && pArg->mode==MODE_Explain && sqlite3_libversion_number()<3008007 ){
1359
+ const char *zExplain = 0;
1360
+ sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1361
+ if( zExplain && zExplain[0] ){
1362
+ fprintf(pArg->out, "%s", zExplain);
1363
+ }
1364
+ }
1365
+#endif
13551366
13561367
/* If the shell is currently in ".explain" mode, gather the extra
13571368
** data required to add indents to the output.*/
13581369
if( pArg && pArg->mode==MODE_Explain ){
13591370
explain_data_prepare(pArg, pStmt);
13601371
--- src/shell.c
+++ src/shell.c
@@ -880,11 +880,11 @@
880 for(i=0; i<nArg; i++){
881 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
882 }
883 fprintf(p->out,"%s",p->newline);
884 }
885 if( azArg>0 ){
886 for(i=0; i<nArg; i++){
887 output_csv(p, azArg[i], i<nArg-1);
888 }
889 fprintf(p->out,"%s",p->newline);
890 }
@@ -1350,10 +1350,21 @@
1350 }
1351 }
1352 sqlite3_finalize(pExplain);
1353 sqlite3_free(zEQP);
1354 }
 
 
 
 
 
 
 
 
 
 
 
1355
1356 /* If the shell is currently in ".explain" mode, gather the extra
1357 ** data required to add indents to the output.*/
1358 if( pArg && pArg->mode==MODE_Explain ){
1359 explain_data_prepare(pArg, pStmt);
1360
--- src/shell.c
+++ src/shell.c
@@ -880,11 +880,11 @@
880 for(i=0; i<nArg; i++){
881 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
882 }
883 fprintf(p->out,"%s",p->newline);
884 }
885 if( nArg>0 ){
886 for(i=0; i<nArg; i++){
887 output_csv(p, azArg[i], i<nArg-1);
888 }
889 fprintf(p->out,"%s",p->newline);
890 }
@@ -1350,10 +1350,21 @@
1350 }
1351 }
1352 sqlite3_finalize(pExplain);
1353 sqlite3_free(zEQP);
1354 }
1355
1356 #if USE_SYSTEM_SQLITE+0==1
1357 /* Output TESTCTRL_EXPLAIN text of requested */
1358 if( pArg && pArg->mode==MODE_Explain && sqlite3_libversion_number()<3008007 ){
1359 const char *zExplain = 0;
1360 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1361 if( zExplain && zExplain[0] ){
1362 fprintf(pArg->out, "%s", zExplain);
1363 }
1364 }
1365 #endif
1366
1367 /* If the shell is currently in ".explain" mode, gather the extra
1368 ** data required to add indents to the output.*/
1369 if( pArg && pArg->mode==MODE_Explain ){
1370 explain_data_prepare(pArg, pStmt);
1371
+9 -9
--- src/shun.c
+++ src/shun.c
@@ -43,12 +43,11 @@
4343
int cnt = 0;
4444
const char *zUuid = P("uuid");
4545
const char *zShun = P("shun");
4646
const char *zAccept = P("accept");
4747
const char *zRcvid = P("rcvid");
48
- int nRcvid;
49
- int nUuid;
48
+ int nRcvid = 0;
5049
int numRows = 3;
5150
char *zCanonical = 0;
5251
5352
login_check_credentials();
5453
if( !g.perm.Admin ){
@@ -79,11 +78,11 @@
7978
i++;
8079
}
8180
zCanonical[j+1] = zCanonical[j] = 0;
8281
p = zCanonical;
8382
while( *p ){
84
- nUuid = strlen(p);
83
+ int nUuid = strlen(p);
8584
if( nUuid!=UUID_SIZE || !validate16(p, nUuid) ){
8685
@ <p class="generalError">Error: Bad artifact IDs.</p>
8786
fossil_free(zCanonical);
8887
zCanonical = 0;
8988
break;
@@ -98,12 +97,12 @@
9897
if( zUuid && P("sub") ){
9998
const char *p = zUuid;
10099
int allExist = 1;
101100
login_verify_csrf_secret();
102101
while( *p ){
103
- db_multi_exec("DELETE FROM shun WHERE uuid='%s'", p);
104
- if( !db_exists("SELECT 1 FROM blob WHERE uuid='%s'", p) ){
102
+ db_multi_exec("DELETE FROM shun WHERE uuid=%Q", p);
103
+ if( !db_exists("SELECT 1 FROM blob WHERE uuid=%Q", p) ){
105104
allExist = 0;
106105
}
107106
p += UUID_SIZE+1;
108107
}
109108
if( allExist ){
@@ -128,11 +127,11 @@
128127
int rid, tagid;
129128
login_verify_csrf_secret();
130129
while( *p ){
131130
db_multi_exec(
132131
"INSERT OR IGNORE INTO shun(uuid,mtime)"
133
- " VALUES('%s', now())", p);
132
+ " VALUES(%Q, now())", p);
134133
db_multi_exec("DELETE FROM attachment WHERE src=%Q", p);
135134
rid = db_int(0, "SELECT rid FROM blob WHERE uuid=%Q", p);
136135
if( rid ){
137136
db_multi_exec("DELETE FROM event WHERE objid=%d", rid);
138137
}
@@ -152,11 +151,12 @@
152151
@ They will be removed from the repository the next time the repository
153152
@ is rebuilt using the <b>fossil rebuild</b> command-line</p>
154153
}
155154
if( zRcvid ){
156155
nRcvid = atoi(zRcvid);
157
- numRows = db_int(0, "SELECT min(count(), 10) FROM blob WHERE rcvid=%d", nRcvid);
156
+ numRows = db_int(0, "SELECT min(count(), 10) FROM blob WHERE rcvid=%d",
157
+ nRcvid);
158158
}
159159
@ <p>A shunned artifact will not be pushed nor accepted in a pull and the
160160
@ artifact content will be purged from the repository the next time the
161161
@ repository is rebuilt. A list of shunned artifacts can be seen at the
162162
@ bottom of this page.</p>
@@ -183,11 +183,11 @@
183183
login_insert_csrf_secret();
184184
@ <textarea class="fullsize-text" cols="50" rows="%d(numRows)" name="uuid">
185185
if( zShun ){
186186
if( strlen(zShun) ){
187187
@ %h(zShun)
188
- }else if( zRcvid ){
188
+ }else if( nRcvid ){
189189
db_prepare(&q, "SELECT uuid FROM blob WHERE rcvid=%d", nRcvid);
190190
while( db_step(&q)==SQLITE_ROW ){
191191
@ %s(db_column_text(&q, 0))
192192
}
193193
db_finalize(&q);
@@ -210,11 +210,11 @@
210210
login_insert_csrf_secret();
211211
@ <textarea class="fullsize-text" cols="50" rows="%d(numRows)" name="uuid">
212212
if( zAccept ){
213213
if( strlen(zAccept) ){
214214
@ %h(zAccept)
215
- }else if( zRcvid ){
215
+ }else if( nRcvid ){
216216
db_prepare(&q, "SELECT uuid FROM blob WHERE rcvid=%d", nRcvid);
217217
while( db_step(&q)==SQLITE_ROW ){
218218
@ %s(db_column_text(&q, 0))
219219
}
220220
db_finalize(&q);
221221
--- src/shun.c
+++ src/shun.c
@@ -43,12 +43,11 @@
43 int cnt = 0;
44 const char *zUuid = P("uuid");
45 const char *zShun = P("shun");
46 const char *zAccept = P("accept");
47 const char *zRcvid = P("rcvid");
48 int nRcvid;
49 int nUuid;
50 int numRows = 3;
51 char *zCanonical = 0;
52
53 login_check_credentials();
54 if( !g.perm.Admin ){
@@ -79,11 +78,11 @@
79 i++;
80 }
81 zCanonical[j+1] = zCanonical[j] = 0;
82 p = zCanonical;
83 while( *p ){
84 nUuid = strlen(p);
85 if( nUuid!=UUID_SIZE || !validate16(p, nUuid) ){
86 @ <p class="generalError">Error: Bad artifact IDs.</p>
87 fossil_free(zCanonical);
88 zCanonical = 0;
89 break;
@@ -98,12 +97,12 @@
98 if( zUuid && P("sub") ){
99 const char *p = zUuid;
100 int allExist = 1;
101 login_verify_csrf_secret();
102 while( *p ){
103 db_multi_exec("DELETE FROM shun WHERE uuid='%s'", p);
104 if( !db_exists("SELECT 1 FROM blob WHERE uuid='%s'", p) ){
105 allExist = 0;
106 }
107 p += UUID_SIZE+1;
108 }
109 if( allExist ){
@@ -128,11 +127,11 @@
128 int rid, tagid;
129 login_verify_csrf_secret();
130 while( *p ){
131 db_multi_exec(
132 "INSERT OR IGNORE INTO shun(uuid,mtime)"
133 " VALUES('%s', now())", p);
134 db_multi_exec("DELETE FROM attachment WHERE src=%Q", p);
135 rid = db_int(0, "SELECT rid FROM blob WHERE uuid=%Q", p);
136 if( rid ){
137 db_multi_exec("DELETE FROM event WHERE objid=%d", rid);
138 }
@@ -152,11 +151,12 @@
152 @ They will be removed from the repository the next time the repository
153 @ is rebuilt using the <b>fossil rebuild</b> command-line</p>
154 }
155 if( zRcvid ){
156 nRcvid = atoi(zRcvid);
157 numRows = db_int(0, "SELECT min(count(), 10) FROM blob WHERE rcvid=%d", nRcvid);
 
158 }
159 @ <p>A shunned artifact will not be pushed nor accepted in a pull and the
160 @ artifact content will be purged from the repository the next time the
161 @ repository is rebuilt. A list of shunned artifacts can be seen at the
162 @ bottom of this page.</p>
@@ -183,11 +183,11 @@
183 login_insert_csrf_secret();
184 @ <textarea class="fullsize-text" cols="50" rows="%d(numRows)" name="uuid">
185 if( zShun ){
186 if( strlen(zShun) ){
187 @ %h(zShun)
188 }else if( zRcvid ){
189 db_prepare(&q, "SELECT uuid FROM blob WHERE rcvid=%d", nRcvid);
190 while( db_step(&q)==SQLITE_ROW ){
191 @ %s(db_column_text(&q, 0))
192 }
193 db_finalize(&q);
@@ -210,11 +210,11 @@
210 login_insert_csrf_secret();
211 @ <textarea class="fullsize-text" cols="50" rows="%d(numRows)" name="uuid">
212 if( zAccept ){
213 if( strlen(zAccept) ){
214 @ %h(zAccept)
215 }else if( zRcvid ){
216 db_prepare(&q, "SELECT uuid FROM blob WHERE rcvid=%d", nRcvid);
217 while( db_step(&q)==SQLITE_ROW ){
218 @ %s(db_column_text(&q, 0))
219 }
220 db_finalize(&q);
221
--- src/shun.c
+++ src/shun.c
@@ -43,12 +43,11 @@
43 int cnt = 0;
44 const char *zUuid = P("uuid");
45 const char *zShun = P("shun");
46 const char *zAccept = P("accept");
47 const char *zRcvid = P("rcvid");
48 int nRcvid = 0;
 
49 int numRows = 3;
50 char *zCanonical = 0;
51
52 login_check_credentials();
53 if( !g.perm.Admin ){
@@ -79,11 +78,11 @@
78 i++;
79 }
80 zCanonical[j+1] = zCanonical[j] = 0;
81 p = zCanonical;
82 while( *p ){
83 int nUuid = strlen(p);
84 if( nUuid!=UUID_SIZE || !validate16(p, nUuid) ){
85 @ <p class="generalError">Error: Bad artifact IDs.</p>
86 fossil_free(zCanonical);
87 zCanonical = 0;
88 break;
@@ -98,12 +97,12 @@
97 if( zUuid && P("sub") ){
98 const char *p = zUuid;
99 int allExist = 1;
100 login_verify_csrf_secret();
101 while( *p ){
102 db_multi_exec("DELETE FROM shun WHERE uuid=%Q", p);
103 if( !db_exists("SELECT 1 FROM blob WHERE uuid=%Q", p) ){
104 allExist = 0;
105 }
106 p += UUID_SIZE+1;
107 }
108 if( allExist ){
@@ -128,11 +127,11 @@
127 int rid, tagid;
128 login_verify_csrf_secret();
129 while( *p ){
130 db_multi_exec(
131 "INSERT OR IGNORE INTO shun(uuid,mtime)"
132 " VALUES(%Q, now())", p);
133 db_multi_exec("DELETE FROM attachment WHERE src=%Q", p);
134 rid = db_int(0, "SELECT rid FROM blob WHERE uuid=%Q", p);
135 if( rid ){
136 db_multi_exec("DELETE FROM event WHERE objid=%d", rid);
137 }
@@ -152,11 +151,12 @@
151 @ They will be removed from the repository the next time the repository
152 @ is rebuilt using the <b>fossil rebuild</b> command-line</p>
153 }
154 if( zRcvid ){
155 nRcvid = atoi(zRcvid);
156 numRows = db_int(0, "SELECT min(count(), 10) FROM blob WHERE rcvid=%d",
157 nRcvid);
158 }
159 @ <p>A shunned artifact will not be pushed nor accepted in a pull and the
160 @ artifact content will be purged from the repository the next time the
161 @ repository is rebuilt. A list of shunned artifacts can be seen at the
162 @ bottom of this page.</p>
@@ -183,11 +183,11 @@
183 login_insert_csrf_secret();
184 @ <textarea class="fullsize-text" cols="50" rows="%d(numRows)" name="uuid">
185 if( zShun ){
186 if( strlen(zShun) ){
187 @ %h(zShun)
188 }else if( nRcvid ){
189 db_prepare(&q, "SELECT uuid FROM blob WHERE rcvid=%d", nRcvid);
190 while( db_step(&q)==SQLITE_ROW ){
191 @ %s(db_column_text(&q, 0))
192 }
193 db_finalize(&q);
@@ -210,11 +210,11 @@
210 login_insert_csrf_secret();
211 @ <textarea class="fullsize-text" cols="50" rows="%d(numRows)" name="uuid">
212 if( zAccept ){
213 if( strlen(zAccept) ){
214 @ %h(zAccept)
215 }else if( nRcvid ){
216 db_prepare(&q, "SELECT uuid FROM blob WHERE rcvid=%d", nRcvid);
217 while( db_step(&q)==SQLITE_ROW ){
218 @ %s(db_column_text(&q, 0))
219 }
220 db_finalize(&q);
221
+2 -2
--- src/skins.c
+++ src/skins.c
@@ -1392,18 +1392,18 @@
13921392
seen = 0;
13931393
for(i=0; i<sizeof(aBuiltinSkin)/sizeof(aBuiltinSkin[0]); i++){
13941394
if( fossil_strcmp(aBuiltinSkin[i].zName, z)==0 ){
13951395
seen = 1;
13961396
zCurrent = aBuiltinSkin[i].zValue;
1397
- db_multi_exec("%s", zCurrent);
1397
+ db_multi_exec("%s", zCurrent/*safe-for-%s*/);
13981398
break;
13991399
}
14001400
}
14011401
if( !seen ){
14021402
zName = skinVarName(z,0);
14031403
zCurrent = db_get(zName, 0);
1404
- db_multi_exec("%s", zCurrent);
1404
+ db_multi_exec("%s", zCurrent/*safe-for-%s*/);
14051405
}
14061406
}
14071407
14081408
style_header("Skins");
14091409
if( zErr ){
14101410
--- src/skins.c
+++ src/skins.c
@@ -1392,18 +1392,18 @@
1392 seen = 0;
1393 for(i=0; i<sizeof(aBuiltinSkin)/sizeof(aBuiltinSkin[0]); i++){
1394 if( fossil_strcmp(aBuiltinSkin[i].zName, z)==0 ){
1395 seen = 1;
1396 zCurrent = aBuiltinSkin[i].zValue;
1397 db_multi_exec("%s", zCurrent);
1398 break;
1399 }
1400 }
1401 if( !seen ){
1402 zName = skinVarName(z,0);
1403 zCurrent = db_get(zName, 0);
1404 db_multi_exec("%s", zCurrent);
1405 }
1406 }
1407
1408 style_header("Skins");
1409 if( zErr ){
1410
--- src/skins.c
+++ src/skins.c
@@ -1392,18 +1392,18 @@
1392 seen = 0;
1393 for(i=0; i<sizeof(aBuiltinSkin)/sizeof(aBuiltinSkin[0]); i++){
1394 if( fossil_strcmp(aBuiltinSkin[i].zName, z)==0 ){
1395 seen = 1;
1396 zCurrent = aBuiltinSkin[i].zValue;
1397 db_multi_exec("%s", zCurrent/*safe-for-%s*/);
1398 break;
1399 }
1400 }
1401 if( !seen ){
1402 zName = skinVarName(z,0);
1403 zCurrent = db_get(zName, 0);
1404 db_multi_exec("%s", zCurrent/*safe-for-%s*/);
1405 }
1406 }
1407
1408 style_header("Skins");
1409 if( zErr ){
1410
--- src/sqlcmd.c
+++ src/sqlcmd.c
@@ -148,11 +148,15 @@
148148
extern int sqlite3_shell(int, char**);
149149
db_find_and_open_repository(OPEN_ANY_SCHEMA, 0);
150150
db_close(1);
151151
sqlite3_shutdown();
152152
sqlite3_shell(g.argc-1, g.argv+1);
153
+ sqlite3_cancel_auto_extension((void(*)(void))sqlcmd_autoinit);
153154
g.db = 0;
155
+ g.zMainDbType = 0;
156
+ g.repositoryOpen = 0;
157
+ g.localOpen = 0;
154158
}
155159
156160
/*
157161
** This routine is called by the patched sqlite3 command-line shell in order
158162
** to load the name and database connection for the open Fossil database.
159163
--- src/sqlcmd.c
+++ src/sqlcmd.c
@@ -148,11 +148,15 @@
148 extern int sqlite3_shell(int, char**);
149 db_find_and_open_repository(OPEN_ANY_SCHEMA, 0);
150 db_close(1);
151 sqlite3_shutdown();
152 sqlite3_shell(g.argc-1, g.argv+1);
 
153 g.db = 0;
 
 
 
154 }
155
156 /*
157 ** This routine is called by the patched sqlite3 command-line shell in order
158 ** to load the name and database connection for the open Fossil database.
159
--- src/sqlcmd.c
+++ src/sqlcmd.c
@@ -148,11 +148,15 @@
148 extern int sqlite3_shell(int, char**);
149 db_find_and_open_repository(OPEN_ANY_SCHEMA, 0);
150 db_close(1);
151 sqlite3_shutdown();
152 sqlite3_shell(g.argc-1, g.argv+1);
153 sqlite3_cancel_auto_extension((void(*)(void))sqlcmd_autoinit);
154 g.db = 0;
155 g.zMainDbType = 0;
156 g.repositoryOpen = 0;
157 g.localOpen = 0;
158 }
159
160 /*
161 ** This routine is called by the patched sqlite3 command-line shell in order
162 ** to load the name and database connection for the open Fossil database.
163
+10 -5
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -231,11 +231,11 @@
231231
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
232232
** [sqlite_version()] and [sqlite_source_id()].
233233
*/
234234
#define SQLITE_VERSION "3.8.7"
235235
#define SQLITE_VERSION_NUMBER 3008007
236
-#define SQLITE_SOURCE_ID "2014-10-15 15:28:27 3c1e70f4d55bc009ed9ed4cf6d756d7061985851"
236
+#define SQLITE_SOURCE_ID "2014-10-17 11:24:17 e4ab094f8afce0817f4074e823fabe59fc29ebb4"
237237
238238
/*
239239
** CAPI3REF: Run-Time Library Version Numbers
240240
** KEYWORDS: sqlite3_version, sqlite3_sourceid
241241
**
@@ -22091,11 +22091,11 @@
2209122091
#endif /* SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) */
2209222092
/******************************** End Unix Pthreads *************************/
2209322093
2209422094
2209522095
/********************************* Win32 Threads ****************************/
22096
-#if SQLITE_OS_WIN && !SQLITE_OS_WINRT && SQLITE_THREADSAFE>0
22096
+#if SQLITE_OS_WIN && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_THREADSAFE>0
2209722097
2209822098
#define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */
2209922099
#include <process.h>
2210022100
2210122101
/* A running thread */
@@ -22184,11 +22184,11 @@
2218422184
if( rc==WAIT_OBJECT_0 ) *ppOut = p->pResult;
2218522185
sqlite3_free(p);
2218622186
return (rc==WAIT_OBJECT_0) ? SQLITE_OK : SQLITE_ERROR;
2218722187
}
2218822188
22189
-#endif /* SQLITE_OS_WIN && !SQLITE_OS_WINRT */
22189
+#endif /* SQLITE_OS_WIN && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT */
2219022190
/******************************** End Win32 Threads *************************/
2219122191
2219222192
2219322193
/********************************* Single-Threaded **************************/
2219422194
#ifndef SQLITE_THREADS_IMPLEMENTED
@@ -33487,11 +33487,15 @@
3348733487
#endif
3348833488
3348933489
#define osWaitForSingleObject ((DWORD(WINAPI*)(HANDLE, \
3349033490
DWORD))aSyscall[63].pCurrent)
3349133491
33492
+#if !SQLITE_OS_WINCE
3349233493
{ "WaitForSingleObjectEx", (SYSCALL)WaitForSingleObjectEx, 0 },
33494
+#else
33495
+ { "WaitForSingleObjectEx", (SYSCALL)0, 0 },
33496
+#endif
3349333497
3349433498
#define osWaitForSingleObjectEx ((DWORD(WINAPI*)(HANDLE,DWORD, \
3349533499
BOOL))aSyscall[64].pCurrent)
3349633500
3349733501
#if SQLITE_OS_WINRT
@@ -33830,11 +33834,12 @@
3383033834
#else
3383133835
osSleep(milliseconds);
3383233836
#endif
3383333837
}
3383433838
33835
-#if SQLITE_MAX_WORKER_THREADS>0 && !SQLITE_OS_WINRT && SQLITE_THREADSAFE>0
33839
+#if SQLITE_MAX_WORKER_THREADS>0 && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && \
33840
+ SQLITE_THREADSAFE>0
3383633841
SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject){
3383733842
DWORD rc;
3383833843
while( (rc = osWaitForSingleObjectEx(hObject, INFINITE,
3383933844
TRUE))==WAIT_IO_COMPLETION ){}
3384033845
return rc;
@@ -78222,11 +78227,11 @@
7822278227
if( rc==SQLITE_OK ){
7822378228
#if SQLITE_MAX_WORKER_THREADS
7822478229
assert( pSorter->bUseThreads==0 || pSorter->nTask>1 );
7822578230
if( pSorter->bUseThreads ){
7822678231
int iTask;
78227
- PmaReader *pReadr;
78232
+ PmaReader *pReadr = 0;
7822878233
SortSubtask *pLast = &pSorter->aTask[pSorter->nTask-1];
7822978234
rc = vdbeSortAllocUnpacked(pLast);
7823078235
if( rc==SQLITE_OK ){
7823178236
pReadr = (PmaReader*)sqlite3DbMallocZero(db, sizeof(PmaReader));
7823278237
pSorter->pReader = pReadr;
7823378238
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -231,11 +231,11 @@
231 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
232 ** [sqlite_version()] and [sqlite_source_id()].
233 */
234 #define SQLITE_VERSION "3.8.7"
235 #define SQLITE_VERSION_NUMBER 3008007
236 #define SQLITE_SOURCE_ID "2014-10-15 15:28:27 3c1e70f4d55bc009ed9ed4cf6d756d7061985851"
237
238 /*
239 ** CAPI3REF: Run-Time Library Version Numbers
240 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
241 **
@@ -22091,11 +22091,11 @@
22091 #endif /* SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) */
22092 /******************************** End Unix Pthreads *************************/
22093
22094
22095 /********************************* Win32 Threads ****************************/
22096 #if SQLITE_OS_WIN && !SQLITE_OS_WINRT && SQLITE_THREADSAFE>0
22097
22098 #define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */
22099 #include <process.h>
22100
22101 /* A running thread */
@@ -22184,11 +22184,11 @@
22184 if( rc==WAIT_OBJECT_0 ) *ppOut = p->pResult;
22185 sqlite3_free(p);
22186 return (rc==WAIT_OBJECT_0) ? SQLITE_OK : SQLITE_ERROR;
22187 }
22188
22189 #endif /* SQLITE_OS_WIN && !SQLITE_OS_WINRT */
22190 /******************************** End Win32 Threads *************************/
22191
22192
22193 /********************************* Single-Threaded **************************/
22194 #ifndef SQLITE_THREADS_IMPLEMENTED
@@ -33487,11 +33487,15 @@
33487 #endif
33488
33489 #define osWaitForSingleObject ((DWORD(WINAPI*)(HANDLE, \
33490 DWORD))aSyscall[63].pCurrent)
33491
 
33492 { "WaitForSingleObjectEx", (SYSCALL)WaitForSingleObjectEx, 0 },
 
 
 
33493
33494 #define osWaitForSingleObjectEx ((DWORD(WINAPI*)(HANDLE,DWORD, \
33495 BOOL))aSyscall[64].pCurrent)
33496
33497 #if SQLITE_OS_WINRT
@@ -33830,11 +33834,12 @@
33830 #else
33831 osSleep(milliseconds);
33832 #endif
33833 }
33834
33835 #if SQLITE_MAX_WORKER_THREADS>0 && !SQLITE_OS_WINRT && SQLITE_THREADSAFE>0
 
33836 SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject){
33837 DWORD rc;
33838 while( (rc = osWaitForSingleObjectEx(hObject, INFINITE,
33839 TRUE))==WAIT_IO_COMPLETION ){}
33840 return rc;
@@ -78222,11 +78227,11 @@
78222 if( rc==SQLITE_OK ){
78223 #if SQLITE_MAX_WORKER_THREADS
78224 assert( pSorter->bUseThreads==0 || pSorter->nTask>1 );
78225 if( pSorter->bUseThreads ){
78226 int iTask;
78227 PmaReader *pReadr;
78228 SortSubtask *pLast = &pSorter->aTask[pSorter->nTask-1];
78229 rc = vdbeSortAllocUnpacked(pLast);
78230 if( rc==SQLITE_OK ){
78231 pReadr = (PmaReader*)sqlite3DbMallocZero(db, sizeof(PmaReader));
78232 pSorter->pReader = pReadr;
78233
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -231,11 +231,11 @@
231 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
232 ** [sqlite_version()] and [sqlite_source_id()].
233 */
234 #define SQLITE_VERSION "3.8.7"
235 #define SQLITE_VERSION_NUMBER 3008007
236 #define SQLITE_SOURCE_ID "2014-10-17 11:24:17 e4ab094f8afce0817f4074e823fabe59fc29ebb4"
237
238 /*
239 ** CAPI3REF: Run-Time Library Version Numbers
240 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
241 **
@@ -22091,11 +22091,11 @@
22091 #endif /* SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) */
22092 /******************************** End Unix Pthreads *************************/
22093
22094
22095 /********************************* Win32 Threads ****************************/
22096 #if SQLITE_OS_WIN && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_THREADSAFE>0
22097
22098 #define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */
22099 #include <process.h>
22100
22101 /* A running thread */
@@ -22184,11 +22184,11 @@
22184 if( rc==WAIT_OBJECT_0 ) *ppOut = p->pResult;
22185 sqlite3_free(p);
22186 return (rc==WAIT_OBJECT_0) ? SQLITE_OK : SQLITE_ERROR;
22187 }
22188
22189 #endif /* SQLITE_OS_WIN && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT */
22190 /******************************** End Win32 Threads *************************/
22191
22192
22193 /********************************* Single-Threaded **************************/
22194 #ifndef SQLITE_THREADS_IMPLEMENTED
@@ -33487,11 +33487,15 @@
33487 #endif
33488
33489 #define osWaitForSingleObject ((DWORD(WINAPI*)(HANDLE, \
33490 DWORD))aSyscall[63].pCurrent)
33491
33492 #if !SQLITE_OS_WINCE
33493 { "WaitForSingleObjectEx", (SYSCALL)WaitForSingleObjectEx, 0 },
33494 #else
33495 { "WaitForSingleObjectEx", (SYSCALL)0, 0 },
33496 #endif
33497
33498 #define osWaitForSingleObjectEx ((DWORD(WINAPI*)(HANDLE,DWORD, \
33499 BOOL))aSyscall[64].pCurrent)
33500
33501 #if SQLITE_OS_WINRT
@@ -33830,11 +33834,12 @@
33834 #else
33835 osSleep(milliseconds);
33836 #endif
33837 }
33838
33839 #if SQLITE_MAX_WORKER_THREADS>0 && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && \
33840 SQLITE_THREADSAFE>0
33841 SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject){
33842 DWORD rc;
33843 while( (rc = osWaitForSingleObjectEx(hObject, INFINITE,
33844 TRUE))==WAIT_IO_COMPLETION ){}
33845 return rc;
@@ -78222,11 +78227,11 @@
78227 if( rc==SQLITE_OK ){
78228 #if SQLITE_MAX_WORKER_THREADS
78229 assert( pSorter->bUseThreads==0 || pSorter->nTask>1 );
78230 if( pSorter->bUseThreads ){
78231 int iTask;
78232 PmaReader *pReadr = 0;
78233 SortSubtask *pLast = &pSorter->aTask[pSorter->nTask-1];
78234 rc = vdbeSortAllocUnpacked(pLast);
78235 if( rc==SQLITE_OK ){
78236 pReadr = (PmaReader*)sqlite3DbMallocZero(db, sizeof(PmaReader));
78237 pSorter->pReader = pReadr;
78238
+1 -1
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -107,11 +107,11 @@
107107
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
108108
** [sqlite_version()] and [sqlite_source_id()].
109109
*/
110110
#define SQLITE_VERSION "3.8.7"
111111
#define SQLITE_VERSION_NUMBER 3008007
112
-#define SQLITE_SOURCE_ID "2014-10-15 15:28:27 3c1e70f4d55bc009ed9ed4cf6d756d7061985851"
112
+#define SQLITE_SOURCE_ID "2014-10-17 11:24:17 e4ab094f8afce0817f4074e823fabe59fc29ebb4"
113113
114114
/*
115115
** CAPI3REF: Run-Time Library Version Numbers
116116
** KEYWORDS: sqlite3_version, sqlite3_sourceid
117117
**
118118
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -107,11 +107,11 @@
107 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
108 ** [sqlite_version()] and [sqlite_source_id()].
109 */
110 #define SQLITE_VERSION "3.8.7"
111 #define SQLITE_VERSION_NUMBER 3008007
112 #define SQLITE_SOURCE_ID "2014-10-15 15:28:27 3c1e70f4d55bc009ed9ed4cf6d756d7061985851"
113
114 /*
115 ** CAPI3REF: Run-Time Library Version Numbers
116 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
117 **
118
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -107,11 +107,11 @@
107 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
108 ** [sqlite_version()] and [sqlite_source_id()].
109 */
110 #define SQLITE_VERSION "3.8.7"
111 #define SQLITE_VERSION_NUMBER 3008007
112 #define SQLITE_SOURCE_ID "2014-10-17 11:24:17 e4ab094f8afce0817f4074e823fabe59fc29ebb4"
113
114 /*
115 ** CAPI3REF: Run-Time Library Version Numbers
116 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
117 **
118
+7 -7
--- src/stash.c
+++ src/stash.c
@@ -23,17 +23,17 @@
2323
2424
/*
2525
** SQL code to implement the tables needed by the stash.
2626
*/
2727
static const char zStashInit[] =
28
-@ CREATE TABLE IF NOT EXISTS %s.stash(
28
+@ CREATE TABLE IF NOT EXISTS "%w".stash(
2929
@ stashid INTEGER PRIMARY KEY, -- Unique stash identifier
3030
@ vid INTEGER, -- The baseline check-out for this stash
3131
@ comment TEXT, -- Comment for this stash. Or NULL
3232
@ ctime TIMESTAMP -- When the stash was created
3333
@ );
34
-@ CREATE TABLE IF NOT EXISTS %s.stashfile(
34
+@ CREATE TABLE IF NOT EXISTS "%w".stashfile(
3535
@ stashid INTEGER REFERENCES stash, -- Stash that contains this file
3636
@ rid INTEGER, -- Baseline content in BLOB table or 0.
3737
@ isAdded BOOLEAN, -- True if this is an added file
3838
@ isRemoved BOOLEAN, -- True if this file is deleted
3939
@ isExec BOOLEAN, -- True if file is executable
@@ -61,24 +61,24 @@
6161
6262
zFile = mprintf("%/", zFName);
6363
file_tree_name(zFile, &fname, 1);
6464
zTreename = blob_str(&fname);
6565
blob_zero(&sql);
66
- blob_appendf(&sql,
66
+ blob_append_sql(&sql,
6767
"SELECT deleted, isexe, islink, mrid, pathname, coalesce(origname,pathname)"
6868
" FROM vfile"
6969
" WHERE vid=%d AND (chnged OR deleted OR origname NOT NULL OR mrid==0)",
7070
vid
7171
);
7272
if( fossil_strcmp(zTreename,".")!=0 ){
73
- blob_appendf(&sql,
73
+ blob_append_sql(&sql,
7474
" AND (pathname GLOB '%q/*' OR origname GLOB '%q/*'"
7575
" OR pathname=%Q OR origname=%Q)",
7676
zTreename, zTreename, zTreename, zTreename
7777
);
7878
}
79
- db_prepare(&q, blob_str(&sql));
79
+ db_prepare(&q, "%s", blob_sql_text(&sql));
8080
blob_reset(&sql);
8181
db_prepare(&ins,
8282
"INSERT INTO stashfile(stashid, rid, isAdded, isRemoved, isExec, isLink,"
8383
"origname, newname, delta)"
8484
"VALUES(%d,:rid,:isadd,:isrm,:isexe,:islink,:orig,:new,:content)",
@@ -481,11 +481,11 @@
481481
undo_capture_command_line();
482482
db_must_be_within_tree();
483483
db_open_config(0);
484484
db_begin_transaction();
485485
zDb = db_name("localdb");
486
- db_multi_exec(zStashInit, zDb, zDb);
486
+ db_multi_exec(zStashInit /*works-like:"%w,%w"*/, zDb, zDb);
487487
if( g.argc<=2 ){
488488
zCmd = "save";
489489
}else{
490490
zCmd = g.argv[2];
491491
}
@@ -534,11 +534,11 @@
534534
}
535535
verify_all_options();
536536
db_prepare(&q,
537537
"SELECT stashid, (SELECT uuid FROM blob WHERE rid=vid),"
538538
" comment, datetime(ctime) FROM stash"
539
- " ORDER BY ctime DESC"
539
+ " ORDER BY ctime"
540540
);
541541
if( verboseFlag ){
542542
db_prepare(&q2, "SELECT isAdded, isRemoved, origname, newname"
543543
" FROM stashfile WHERE stashid=$id");
544544
}
545545
--- src/stash.c
+++ src/stash.c
@@ -23,17 +23,17 @@
23
24 /*
25 ** SQL code to implement the tables needed by the stash.
26 */
27 static const char zStashInit[] =
28 @ CREATE TABLE IF NOT EXISTS %s.stash(
29 @ stashid INTEGER PRIMARY KEY, -- Unique stash identifier
30 @ vid INTEGER, -- The baseline check-out for this stash
31 @ comment TEXT, -- Comment for this stash. Or NULL
32 @ ctime TIMESTAMP -- When the stash was created
33 @ );
34 @ CREATE TABLE IF NOT EXISTS %s.stashfile(
35 @ stashid INTEGER REFERENCES stash, -- Stash that contains this file
36 @ rid INTEGER, -- Baseline content in BLOB table or 0.
37 @ isAdded BOOLEAN, -- True if this is an added file
38 @ isRemoved BOOLEAN, -- True if this file is deleted
39 @ isExec BOOLEAN, -- True if file is executable
@@ -61,24 +61,24 @@
61
62 zFile = mprintf("%/", zFName);
63 file_tree_name(zFile, &fname, 1);
64 zTreename = blob_str(&fname);
65 blob_zero(&sql);
66 blob_appendf(&sql,
67 "SELECT deleted, isexe, islink, mrid, pathname, coalesce(origname,pathname)"
68 " FROM vfile"
69 " WHERE vid=%d AND (chnged OR deleted OR origname NOT NULL OR mrid==0)",
70 vid
71 );
72 if( fossil_strcmp(zTreename,".")!=0 ){
73 blob_appendf(&sql,
74 " AND (pathname GLOB '%q/*' OR origname GLOB '%q/*'"
75 " OR pathname=%Q OR origname=%Q)",
76 zTreename, zTreename, zTreename, zTreename
77 );
78 }
79 db_prepare(&q, blob_str(&sql));
80 blob_reset(&sql);
81 db_prepare(&ins,
82 "INSERT INTO stashfile(stashid, rid, isAdded, isRemoved, isExec, isLink,"
83 "origname, newname, delta)"
84 "VALUES(%d,:rid,:isadd,:isrm,:isexe,:islink,:orig,:new,:content)",
@@ -481,11 +481,11 @@
481 undo_capture_command_line();
482 db_must_be_within_tree();
483 db_open_config(0);
484 db_begin_transaction();
485 zDb = db_name("localdb");
486 db_multi_exec(zStashInit, zDb, zDb);
487 if( g.argc<=2 ){
488 zCmd = "save";
489 }else{
490 zCmd = g.argv[2];
491 }
@@ -534,11 +534,11 @@
534 }
535 verify_all_options();
536 db_prepare(&q,
537 "SELECT stashid, (SELECT uuid FROM blob WHERE rid=vid),"
538 " comment, datetime(ctime) FROM stash"
539 " ORDER BY ctime DESC"
540 );
541 if( verboseFlag ){
542 db_prepare(&q2, "SELECT isAdded, isRemoved, origname, newname"
543 " FROM stashfile WHERE stashid=$id");
544 }
545
--- src/stash.c
+++ src/stash.c
@@ -23,17 +23,17 @@
23
24 /*
25 ** SQL code to implement the tables needed by the stash.
26 */
27 static const char zStashInit[] =
28 @ CREATE TABLE IF NOT EXISTS "%w".stash(
29 @ stashid INTEGER PRIMARY KEY, -- Unique stash identifier
30 @ vid INTEGER, -- The baseline check-out for this stash
31 @ comment TEXT, -- Comment for this stash. Or NULL
32 @ ctime TIMESTAMP -- When the stash was created
33 @ );
34 @ CREATE TABLE IF NOT EXISTS "%w".stashfile(
35 @ stashid INTEGER REFERENCES stash, -- Stash that contains this file
36 @ rid INTEGER, -- Baseline content in BLOB table or 0.
37 @ isAdded BOOLEAN, -- True if this is an added file
38 @ isRemoved BOOLEAN, -- True if this file is deleted
39 @ isExec BOOLEAN, -- True if file is executable
@@ -61,24 +61,24 @@
61
62 zFile = mprintf("%/", zFName);
63 file_tree_name(zFile, &fname, 1);
64 zTreename = blob_str(&fname);
65 blob_zero(&sql);
66 blob_append_sql(&sql,
67 "SELECT deleted, isexe, islink, mrid, pathname, coalesce(origname,pathname)"
68 " FROM vfile"
69 " WHERE vid=%d AND (chnged OR deleted OR origname NOT NULL OR mrid==0)",
70 vid
71 );
72 if( fossil_strcmp(zTreename,".")!=0 ){
73 blob_append_sql(&sql,
74 " AND (pathname GLOB '%q/*' OR origname GLOB '%q/*'"
75 " OR pathname=%Q OR origname=%Q)",
76 zTreename, zTreename, zTreename, zTreename
77 );
78 }
79 db_prepare(&q, "%s", blob_sql_text(&sql));
80 blob_reset(&sql);
81 db_prepare(&ins,
82 "INSERT INTO stashfile(stashid, rid, isAdded, isRemoved, isExec, isLink,"
83 "origname, newname, delta)"
84 "VALUES(%d,:rid,:isadd,:isrm,:isexe,:islink,:orig,:new,:content)",
@@ -481,11 +481,11 @@
481 undo_capture_command_line();
482 db_must_be_within_tree();
483 db_open_config(0);
484 db_begin_transaction();
485 zDb = db_name("localdb");
486 db_multi_exec(zStashInit /*works-like:"%w,%w"*/, zDb, zDb);
487 if( g.argc<=2 ){
488 zCmd = "save";
489 }else{
490 zCmd = g.argv[2];
491 }
@@ -534,11 +534,11 @@
534 }
535 verify_all_options();
536 db_prepare(&q,
537 "SELECT stashid, (SELECT uuid FROM blob WHERE rid=vid),"
538 " comment, datetime(ctime) FROM stash"
539 " ORDER BY ctime"
540 );
541 if( verboseFlag ){
542 db_prepare(&q2, "SELECT isAdded, isRemoved, origname, newname"
543 " FROM stashfile WHERE stashid=$id");
544 }
545
+10 -10
--- src/stat.c
+++ src/stat.c
@@ -137,15 +137,15 @@
137137
@ <tr><th>Repository Rebuilt:</th><td>
138138
@ %h(db_get_mtime("rebuilt","%Y-%m-%d %H:%M:%S","Never"))
139139
@ By Fossil %h(db_get("rebuilt","Unknown"))</td></tr>
140140
@ <tr><th>Database&nbsp;Stats:</th><td>
141141
zDb = db_name("repository");
142
- @ %d(db_int(0, "PRAGMA %s.page_count", zDb)) pages,
143
- @ %d(db_int(0, "PRAGMA %s.page_size", zDb)) bytes/page,
144
- @ %d(db_int(0, "PRAGMA %s.freelist_count", zDb)) free pages,
145
- @ %s(db_text(0, "PRAGMA %s.encoding", zDb)),
146
- @ %s(db_text(0, "PRAGMA %s.journal_mode", zDb)) mode
142
+ @ %d(db_int(0, "PRAGMA \"%w\".page_count", zDb)) pages,
143
+ @ %d(db_int(0, "PRAGMA \"%w\".page_size", zDb)) bytes/page,
144
+ @ %d(db_int(0, "PRAGMA \"%w\".freelist_count", zDb)) free pages,
145
+ @ %s(db_text(0, "PRAGMA \"%w\".encoding", zDb)),
146
+ @ %s(db_text(0, "PRAGMA \"%w\".journal_mode", zDb)) mode
147147
@ </td></tr>
148148
149149
@ </table>
150150
style_footer();
151151
}
@@ -267,15 +267,15 @@
267267
}
268268
zDb = db_name("repository");
269269
fossil_print("%*s%d pages, %d bytes/pg, %d free pages, "
270270
"%s, %s mode\n",
271271
colWidth, "database-stats:",
272
- db_int(0, "PRAGMA %s.page_count", zDb),
273
- db_int(0, "PRAGMA %s.page_size", zDb),
274
- db_int(0, "PRAGMA %s.freelist_count", zDb),
275
- db_text(0, "PRAGMA %s.encoding", zDb),
276
- db_text(0, "PRAGMA %s.journal_mode", zDb));
272
+ db_int(0, "PRAGMA \"%w\".page_count", zDb),
273
+ db_int(0, "PRAGMA \"%w\".page_size", zDb),
274
+ db_int(0, "PRAGMA \"%w\".freelist_count", zDb),
275
+ db_text(0, "PRAGMA \"%w\".encoding", zDb),
276
+ db_text(0, "PRAGMA \"%w\".journal_mode", zDb));
277277
if( dbCheck ){
278278
fossil_print("%*s%s\n", colWidth, "database-check:",
279279
db_text(0, "PRAGMA quick_check(1)"));
280280
}
281281
}
282282
--- src/stat.c
+++ src/stat.c
@@ -137,15 +137,15 @@
137 @ <tr><th>Repository Rebuilt:</th><td>
138 @ %h(db_get_mtime("rebuilt","%Y-%m-%d %H:%M:%S","Never"))
139 @ By Fossil %h(db_get("rebuilt","Unknown"))</td></tr>
140 @ <tr><th>Database&nbsp;Stats:</th><td>
141 zDb = db_name("repository");
142 @ %d(db_int(0, "PRAGMA %s.page_count", zDb)) pages,
143 @ %d(db_int(0, "PRAGMA %s.page_size", zDb)) bytes/page,
144 @ %d(db_int(0, "PRAGMA %s.freelist_count", zDb)) free pages,
145 @ %s(db_text(0, "PRAGMA %s.encoding", zDb)),
146 @ %s(db_text(0, "PRAGMA %s.journal_mode", zDb)) mode
147 @ </td></tr>
148
149 @ </table>
150 style_footer();
151 }
@@ -267,15 +267,15 @@
267 }
268 zDb = db_name("repository");
269 fossil_print("%*s%d pages, %d bytes/pg, %d free pages, "
270 "%s, %s mode\n",
271 colWidth, "database-stats:",
272 db_int(0, "PRAGMA %s.page_count", zDb),
273 db_int(0, "PRAGMA %s.page_size", zDb),
274 db_int(0, "PRAGMA %s.freelist_count", zDb),
275 db_text(0, "PRAGMA %s.encoding", zDb),
276 db_text(0, "PRAGMA %s.journal_mode", zDb));
277 if( dbCheck ){
278 fossil_print("%*s%s\n", colWidth, "database-check:",
279 db_text(0, "PRAGMA quick_check(1)"));
280 }
281 }
282
--- src/stat.c
+++ src/stat.c
@@ -137,15 +137,15 @@
137 @ <tr><th>Repository Rebuilt:</th><td>
138 @ %h(db_get_mtime("rebuilt","%Y-%m-%d %H:%M:%S","Never"))
139 @ By Fossil %h(db_get("rebuilt","Unknown"))</td></tr>
140 @ <tr><th>Database&nbsp;Stats:</th><td>
141 zDb = db_name("repository");
142 @ %d(db_int(0, "PRAGMA \"%w\".page_count", zDb)) pages,
143 @ %d(db_int(0, "PRAGMA \"%w\".page_size", zDb)) bytes/page,
144 @ %d(db_int(0, "PRAGMA \"%w\".freelist_count", zDb)) free pages,
145 @ %s(db_text(0, "PRAGMA \"%w\".encoding", zDb)),
146 @ %s(db_text(0, "PRAGMA \"%w\".journal_mode", zDb)) mode
147 @ </td></tr>
148
149 @ </table>
150 style_footer();
151 }
@@ -267,15 +267,15 @@
267 }
268 zDb = db_name("repository");
269 fossil_print("%*s%d pages, %d bytes/pg, %d free pages, "
270 "%s, %s mode\n",
271 colWidth, "database-stats:",
272 db_int(0, "PRAGMA \"%w\".page_count", zDb),
273 db_int(0, "PRAGMA \"%w\".page_size", zDb),
274 db_int(0, "PRAGMA \"%w\".freelist_count", zDb),
275 db_text(0, "PRAGMA \"%w\".encoding", zDb),
276 db_text(0, "PRAGMA \"%w\".journal_mode", zDb));
277 if( dbCheck ){
278 fossil_print("%*s%s\n", colWidth, "database-check:",
279 db_text(0, "PRAGMA quick_check(1)"));
280 }
281 }
282
+7 -6
--- src/tag.c
+++ src/tag.c
@@ -213,11 +213,12 @@
213213
rid
214214
);
215215
}
216216
}
217217
if( zCol ){
218
- db_multi_exec("UPDATE event SET %s=%Q WHERE objid=%d", zCol, zValue, rid);
218
+ db_multi_exec("UPDATE event SET \"%w\"=%Q WHERE objid=%d",
219
+ zCol, zValue, rid);
219220
if( tagid==TAG_COMMENT ){
220221
char *zCopy = mprintf("%s", zValue);
221222
wiki_extract_links(zCopy, rid, 0, mtime, 1, WIKI_INLINE);
222223
free(zCopy);
223224
}
@@ -437,41 +438,41 @@
437438
if( zType==0 || zType[0]==0 ) zType = "*";
438439
if( g.argc!=4 ){
439440
usage("find ?--raw? ?-t|--type TYPE? ?-n|--limit #? TAGNAME");
440441
}
441442
if( fRaw ){
442
- blob_appendf(&sql,
443
+ blob_append_sql(&sql,
443444
"SELECT blob.uuid FROM tagxref, blob"
444445
" WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
445446
" AND tagxref.tagtype>0"
446447
" AND blob.rid=tagxref.rid",
447448
g.argv[3]
448449
);
449450
if( nFindLimit>0 ){
450
- blob_appendf(&sql, " LIMIT %d", nFindLimit);
451
+ blob_append_sql(&sql, " LIMIT %d", nFindLimit);
451452
}
452
- db_prepare(&q, "%s", blob_str(&sql));
453
+ db_prepare(&q, "%s", blob_sql_text(&sql));
453454
blob_reset(&sql);
454455
while( db_step(&q)==SQLITE_ROW ){
455456
fossil_print("%s\n", db_column_text(&q, 0));
456457
}
457458
db_finalize(&q);
458459
}else{
459460
int tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",
460461
g.argv[3]);
461462
if( tagid>0 ){
462
- blob_appendf(&sql,
463
+ blob_append_sql(&sql,
463464
"%s"
464465
" AND event.type GLOB '%q'"
465466
" AND blob.rid IN ("
466467
" SELECT rid FROM tagxref"
467468
" WHERE tagtype>0 AND tagid=%d"
468469
")"
469470
" ORDER BY event.mtime DESC",
470471
timeline_query_for_tty(), zType, tagid
471472
);
472
- db_prepare(&q, "%s", blob_str(&sql));
473
+ db_prepare(&q, "%s", blob_sql_text(&sql));
473474
blob_reset(&sql);
474475
print_timeline(&q, nFindLimit, 79, 0);
475476
db_finalize(&q);
476477
}
477478
}
478479
--- src/tag.c
+++ src/tag.c
@@ -213,11 +213,12 @@
213 rid
214 );
215 }
216 }
217 if( zCol ){
218 db_multi_exec("UPDATE event SET %s=%Q WHERE objid=%d", zCol, zValue, rid);
 
219 if( tagid==TAG_COMMENT ){
220 char *zCopy = mprintf("%s", zValue);
221 wiki_extract_links(zCopy, rid, 0, mtime, 1, WIKI_INLINE);
222 free(zCopy);
223 }
@@ -437,41 +438,41 @@
437 if( zType==0 || zType[0]==0 ) zType = "*";
438 if( g.argc!=4 ){
439 usage("find ?--raw? ?-t|--type TYPE? ?-n|--limit #? TAGNAME");
440 }
441 if( fRaw ){
442 blob_appendf(&sql,
443 "SELECT blob.uuid FROM tagxref, blob"
444 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
445 " AND tagxref.tagtype>0"
446 " AND blob.rid=tagxref.rid",
447 g.argv[3]
448 );
449 if( nFindLimit>0 ){
450 blob_appendf(&sql, " LIMIT %d", nFindLimit);
451 }
452 db_prepare(&q, "%s", blob_str(&sql));
453 blob_reset(&sql);
454 while( db_step(&q)==SQLITE_ROW ){
455 fossil_print("%s\n", db_column_text(&q, 0));
456 }
457 db_finalize(&q);
458 }else{
459 int tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",
460 g.argv[3]);
461 if( tagid>0 ){
462 blob_appendf(&sql,
463 "%s"
464 " AND event.type GLOB '%q'"
465 " AND blob.rid IN ("
466 " SELECT rid FROM tagxref"
467 " WHERE tagtype>0 AND tagid=%d"
468 ")"
469 " ORDER BY event.mtime DESC",
470 timeline_query_for_tty(), zType, tagid
471 );
472 db_prepare(&q, "%s", blob_str(&sql));
473 blob_reset(&sql);
474 print_timeline(&q, nFindLimit, 79, 0);
475 db_finalize(&q);
476 }
477 }
478
--- src/tag.c
+++ src/tag.c
@@ -213,11 +213,12 @@
213 rid
214 );
215 }
216 }
217 if( zCol ){
218 db_multi_exec("UPDATE event SET \"%w\"=%Q WHERE objid=%d",
219 zCol, zValue, rid);
220 if( tagid==TAG_COMMENT ){
221 char *zCopy = mprintf("%s", zValue);
222 wiki_extract_links(zCopy, rid, 0, mtime, 1, WIKI_INLINE);
223 free(zCopy);
224 }
@@ -437,41 +438,41 @@
438 if( zType==0 || zType[0]==0 ) zType = "*";
439 if( g.argc!=4 ){
440 usage("find ?--raw? ?-t|--type TYPE? ?-n|--limit #? TAGNAME");
441 }
442 if( fRaw ){
443 blob_append_sql(&sql,
444 "SELECT blob.uuid FROM tagxref, blob"
445 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
446 " AND tagxref.tagtype>0"
447 " AND blob.rid=tagxref.rid",
448 g.argv[3]
449 );
450 if( nFindLimit>0 ){
451 blob_append_sql(&sql, " LIMIT %d", nFindLimit);
452 }
453 db_prepare(&q, "%s", blob_sql_text(&sql));
454 blob_reset(&sql);
455 while( db_step(&q)==SQLITE_ROW ){
456 fossil_print("%s\n", db_column_text(&q, 0));
457 }
458 db_finalize(&q);
459 }else{
460 int tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",
461 g.argv[3]);
462 if( tagid>0 ){
463 blob_append_sql(&sql,
464 "%s"
465 " AND event.type GLOB '%q'"
466 " AND blob.rid IN ("
467 " SELECT rid FROM tagxref"
468 " WHERE tagtype>0 AND tagid=%d"
469 ")"
470 " ORDER BY event.mtime DESC",
471 timeline_query_for_tty(), zType, tagid
472 );
473 db_prepare(&q, "%s", blob_sql_text(&sql));
474 blob_reset(&sql);
475 print_timeline(&q, nFindLimit, 79, 0);
476 db_finalize(&q);
477 }
478 }
479
+139 -108
--- src/timeline.c
+++ src/timeline.c
@@ -393,14 +393,14 @@
393393
}else if( mxWikiLen>0 && blob_size(&comment)>mxWikiLen ){
394394
Blob truncated;
395395
blob_zero(&truncated);
396396
blob_append(&truncated, blob_buffer(&comment), mxWikiLen);
397397
blob_append(&truncated, "...", 3);
398
- @ <span class="timelineComment">%w(blob_str(&truncated))</span>
398
+ @ <span class="timelineComment">%W(blob_str(&truncated))</span>
399399
blob_reset(&truncated);
400400
}else{
401
- @ <span class="timelineComment">%w(blob_str(&comment))</span>
401
+ @ <span class="timelineComment">%W(blob_str(&comment))</span>
402402
}
403403
blob_reset(&comment);
404404
405405
/* Generate the "user: USERNAME" at the end of the comment, together
406406
** with a hyperlink to another timeline for that user.
@@ -860,11 +860,11 @@
860860
@ tagid INTEGER,
861861
@ short TEXT,
862862
@ sortby REAL
863863
@ )
864864
;
865
- db_multi_exec(zSql);
865
+ db_multi_exec("%s", zSql/*safe-for-%s*/);
866866
}
867867
868868
/*
869869
** Return a pointer to a constant string that forms the basis
870870
** for a timeline query for the WWW interface.
@@ -889,11 +889,11 @@
889889
@ event.mtime AS mtime
890890
@ FROM event CROSS JOIN blob
891891
@ WHERE blob.rid=event.objid
892892
;
893893
if( zBase==0 ){
894
- zBase = mprintf(zBaseSql, timeline_utc());
894
+ zBase = mprintf(zBaseSql /*works-like: "%s"*/, timeline_utc());
895895
}
896896
return zBase;
897897
}
898898
899899
/*
@@ -965,11 +965,11 @@
965965
Stmt q;
966966
Blob out;
967967
const char *zSep = "";
968968
db_prepare(&q,
969969
"SELECT DISTINCT filename.name FROM mlink, filename"
970
- " WHERE mlink.fid=(SELECT rid FROM blob WHERE uuid='%s')"
970
+ " WHERE mlink.fid=(SELECT rid FROM blob WHERE uuid=%Q)"
971971
" AND filename.fnid=mlink.fnid",
972972
zUuid
973973
);
974974
blob_zero(&out);
975975
while( db_step(&q)==SQLITE_ROW ){
@@ -1129,13 +1129,15 @@
11291129
if( P("fc")!=0 || P("v")!=0 || P("detail")!=0 ){
11301130
tmFlags |= TIMELINE_FCHANGES;
11311131
url_add_parameter(&url, "v", 0);
11321132
}
11331133
if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1134
- blob_appendf(&sql, " AND NOT EXISTS(SELECT 1 FROM tagxref"
1135
- " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)",
1136
- TAG_HIDDEN);
1134
+ blob_append_sql(&sql,
1135
+ " AND NOT EXISTS(SELECT 1 FROM tagxref"
1136
+ " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)",
1137
+ TAG_HIDDEN
1138
+ );
11371139
}
11381140
if( !useDividers ) url_add_parameter(&url, "nd", 0);
11391141
if( ((from_rid && to_rid) || (me_rid && you_rid)) && g.perm.Read ){
11401142
/* If from= and to= are present, display all nodes on a path connecting
11411143
** the two */
@@ -1154,21 +1156,21 @@
11541156
zFrom = P("me");
11551157
zTo = P("you");
11561158
}
11571159
blob_append(&sql, " AND event.objid IN (0", -1);
11581160
while( p ){
1159
- blob_appendf(&sql, ",%d", p->rid);
1161
+ blob_append_sql(&sql, ",%d", p->rid);
11601162
p = p->u.pTo;
11611163
}
11621164
blob_append(&sql, ")", -1);
11631165
path_reset();
11641166
blob_append(&desc, "All nodes on the path from ", -1);
11651167
blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom);
11661168
blob_append(&desc, " to ", -1);
11671169
blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo);
11681170
tmFlags |= TIMELINE_DISJOINT;
1169
- db_multi_exec("%s", blob_str(&sql));
1171
+ db_multi_exec("%s", blob_sql_text(&sql));
11701172
}else if( (p_rid || d_rid) && g.perm.Read ){
11711173
/* If p= or d= is present, ignore all other parameters other than n= */
11721174
char *zUuid;
11731175
int np, nd;
11741176
@@ -1179,16 +1181,16 @@
11791181
db_multi_exec(
11801182
"CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY)"
11811183
);
11821184
zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d",
11831185
p_rid ? p_rid : d_rid);
1184
- blob_appendf(&sql, " AND event.objid IN ok");
1186
+ blob_append_sql(&sql, " AND event.objid IN ok");
11851187
nd = 0;
11861188
if( d_rid ){
11871189
compute_descendants(d_rid, nEntry+1);
11881190
nd = db_int(0, "SELECT count(*)-1 FROM ok");
1189
- if( nd>=0 ) db_multi_exec("%s", blob_str(&sql));
1191
+ if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql));
11901192
if( nd>0 ) blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s");
11911193
if( useDividers ) timeline_add_dividers(0, d_rid);
11921194
db_multi_exec("DELETE FROM ok");
11931195
}
11941196
if( p_rid ){
@@ -1195,11 +1197,11 @@
11951197
compute_ancestors(p_rid, nEntry+1, 0);
11961198
np = db_int(0, "SELECT count(*)-1 FROM ok");
11971199
if( np>0 ){
11981200
if( nd>0 ) blob_appendf(&desc, " and ");
11991201
blob_appendf(&desc, "%d ancestors", np);
1200
- db_multi_exec("%s", blob_str(&sql));
1202
+ db_multi_exec("%s", blob_sql_text(&sql));
12011203
}
12021204
if( d_rid==0 && useDividers ) timeline_add_dividers(0, p_rid);
12031205
}
12041206
blob_appendf(&desc, " of %z[%S]</a>",
12051207
href("%R/info/%s", zUuid), zUuid);
@@ -1235,12 +1237,12 @@
12351237
"INSERT INTO ok VALUES(%d);"
12361238
"INSERT OR IGNORE INTO ok SELECT pid FROM plink WHERE cid=%d;"
12371239
"INSERT OR IGNORE INTO ok SELECT cid FROM plink WHERE pid=%d;",
12381240
f_rid, f_rid, f_rid
12391241
);
1240
- blob_appendf(&sql, " AND event.objid IN ok");
1241
- db_multi_exec("%s", blob_str(&sql));
1242
+ blob_append_sql(&sql, " AND event.objid IN ok");
1243
+ db_multi_exec("%s", blob_sql_text(&sql));
12421244
if( useDividers ) timeline_add_dividers(0, f_rid);
12431245
blob_appendf(&desc, "Parents and children of check-in ");
12441246
zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid);
12451247
blob_appendf(&desc, "%z[%S]</a>", href("%R/info/%s", zUuid), zUuid);
12461248
tmFlags |= TIMELINE_DISJOINT;
@@ -1257,25 +1259,25 @@
12571259
/* Otherwise, a timeline based on a span of time */
12581260
int n;
12591261
const char *zEType = "timeline item";
12601262
char *zDate;
12611263
if( zUses ){
1262
- blob_appendf(&sql, " AND event.objid IN usesfile ");
1264
+ blob_append_sql(&sql, " AND event.objid IN usesfile ");
12631265
}
12641266
if( renameOnly ){
1265
- blob_appendf(&sql, " AND event.objid IN rnfile ");
1267
+ blob_append_sql(&sql, " AND event.objid IN rnfile ");
12661268
}
12671269
if( zYearMonth ){
1268
- blob_appendf(&sql, " AND %Q=strftime('%%Y-%%m',event.mtime) ",
1270
+ blob_append_sql(&sql, " AND %Q=strftime('%%Y-%%m',event.mtime) ",
12691271
zYearMonth);
12701272
}
12711273
else if( zYearWeek ){
1272
- blob_appendf(&sql, " AND %Q=strftime('%%Y-%%W',event.mtime) ",
1274
+ blob_append_sql(&sql, " AND %Q=strftime('%%Y-%%W',event.mtime) ",
12731275
zYearWeek);
12741276
}
12751277
if( tagid>0 ){
1276
- blob_appendf(&sql,
1278
+ blob_append_sql(&sql,
12771279
"AND (EXISTS(SELECT 1 FROM tagxref"
12781280
" WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", tagid);
12791281
12801282
if( zBrName ){
12811283
url_add_parameter(&url, "r", zBrName);
@@ -1283,40 +1285,42 @@
12831285
** are not part of the branch which are parents or children of the
12841286
** branch to be included in the report. This related check-ins are
12851287
** useful in helping to visualize what has happened on a quiescent
12861288
** branch that is infrequently merged with a much more activate branch.
12871289
*/
1288
- blob_appendf(&sql,
1290
+ blob_append_sql(&sql,
12891291
" OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=cid"
12901292
" WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)",
12911293
tagid
12921294
);
12931295
if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1294
- blob_appendf(&sql,
1296
+ blob_append_sql(&sql,
12951297
" AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=cid"
12961298
" WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)",
12971299
TAG_HIDDEN
12981300
);
12991301
}
13001302
if( P("mionly")==0 ){
1301
- blob_appendf(&sql,
1303
+ blob_append_sql(&sql,
13021304
" OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=pid"
13031305
" WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
13041306
tagid
13051307
);
13061308
if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1307
- blob_appendf(&sql, " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid"
1308
- " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1309
- TAG_HIDDEN);
1309
+ blob_append_sql(&sql,
1310
+ " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid"
1311
+ " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1312
+ TAG_HIDDEN
1313
+ );
13101314
}
13111315
}else{
13121316
url_add_parameter(&url, "mionly", "1");
13131317
}
13141318
}else{
13151319
url_add_parameter(&url, "t", zTagName);
13161320
}
1317
- blob_appendf(&sql, ")");
1321
+ blob_append_sql(&sql, ")");
13181322
}
13191323
if( (zType[0]=='w' && !g.perm.RdWiki)
13201324
|| (zType[0]=='t' && !g.perm.RdTkt)
13211325
|| (zType[0]=='e' && !g.perm.RdWiki)
13221326
|| (zType[0]=='c' && !g.perm.Read)
@@ -1325,27 +1329,27 @@
13251329
zType = "all";
13261330
}
13271331
if( zType[0]=='a' ){
13281332
if( !g.perm.Read || !g.perm.RdWiki || !g.perm.RdTkt ){
13291333
char cSep = '(';
1330
- blob_appendf(&sql, " AND event.type IN ");
1334
+ blob_append_sql(&sql, " AND event.type IN ");
13311335
if( g.perm.Read ){
1332
- blob_appendf(&sql, "%c'ci','g'", cSep);
1336
+ blob_append_sql(&sql, "%c'ci','g'", cSep);
13331337
cSep = ',';
13341338
}
13351339
if( g.perm.RdWiki ){
1336
- blob_appendf(&sql, "%c'w','e'", cSep);
1340
+ blob_append_sql(&sql, "%c'w','e'", cSep);
13371341
cSep = ',';
13381342
}
13391343
if( g.perm.RdTkt ){
1340
- blob_appendf(&sql, "%c't'", cSep);
1344
+ blob_append_sql(&sql, "%c't'", cSep);
13411345
cSep = ',';
13421346
}
1343
- blob_appendf(&sql, ")");
1347
+ blob_append_sql(&sql, ")");
13441348
}
13451349
}else{ /* zType!="all" */
1346
- blob_appendf(&sql, " AND event.type=%Q", zType);
1350
+ blob_append_sql(&sql, " AND event.type=%Q", zType);
13471351
url_add_parameter(&url, "y", zType);
13481352
if( zType[0]=='c' ){
13491353
zEType = "checkin";
13501354
}else if( zType[0]=='w' ){
13511355
zEType = "wiki edit";
@@ -1356,64 +1360,64 @@
13561360
}else if( zType[0]=='g' ){
13571361
zEType = "tag";
13581362
}
13591363
}
13601364
if( zUser ){
1361
- blob_appendf(&sql, " AND (event.user=%Q OR event.euser=%Q)",
1365
+ blob_append_sql(&sql, " AND (event.user=%Q OR event.euser=%Q)",
13621366
zUser, zUser);
13631367
url_add_parameter(&url, "u", zUser);
13641368
zThisUser = zUser;
13651369
}
13661370
if( zSearch ){
1367
- blob_appendf(&sql,
1371
+ blob_append_sql(&sql,
13681372
" AND (event.comment LIKE '%%%q%%' OR event.brief LIKE '%%%q%%')",
13691373
zSearch, zSearch);
13701374
url_add_parameter(&url, "s", zSearch);
13711375
}
13721376
rBefore = symbolic_name_to_mtime(zBefore);
13731377
rAfter = symbolic_name_to_mtime(zAfter);
13741378
rCirca = symbolic_name_to_mtime(zCirca);
13751379
if( rAfter>0.0 ){
13761380
if( rBefore>0.0 ){
1377
- blob_appendf(&sql,
1381
+ blob_append_sql(&sql,
13781382
" AND event.mtime>=%.17g AND event.mtime<=%.17g"
13791383
" ORDER BY event.mtime ASC", rAfter-ONE_SECOND, rBefore+ONE_SECOND);
13801384
url_add_parameter(&url, "a", zAfter);
13811385
url_add_parameter(&url, "b", zBefore);
13821386
nEntry = 1000000;
13831387
}else{
1384
- blob_appendf(&sql,
1388
+ blob_append_sql(&sql,
13851389
" AND event.mtime>=%.17g ORDER BY event.mtime ASC",
13861390
rAfter-ONE_SECOND);
13871391
url_add_parameter(&url, "a", zAfter);
13881392
}
13891393
}else if( rBefore>0.0 ){
1390
- blob_appendf(&sql,
1394
+ blob_append_sql(&sql,
13911395
" AND event.mtime<=%.17g ORDER BY event.mtime DESC",
13921396
rBefore+ONE_SECOND);
13931397
url_add_parameter(&url, "b", zBefore);
13941398
}else if( rCirca>0.0 ){
13951399
Blob sql2;
1396
- blob_init(&sql2, blob_str(&sql), -1);
1397
- blob_appendf(&sql2,
1400
+ blob_init(&sql2, blob_sql_text(&sql), -1);
1401
+ blob_append_sql(&sql2,
13981402
" AND event.mtime<=%f ORDER BY event.mtime DESC LIMIT %d",
13991403
rCirca, (nEntry+1)/2
14001404
);
1401
- db_multi_exec("%s", blob_str(&sql2));
1405
+ db_multi_exec("%s", blob_sql_text(&sql2));
14021406
blob_reset(&sql2);
1403
- blob_appendf(&sql,
1407
+ blob_append_sql(&sql,
14041408
" AND event.mtime>=%f ORDER BY event.mtime ASC",
14051409
rCirca
14061410
);
14071411
nEntry -= (nEntry+1)/2;
14081412
if( useDividers ) timeline_add_dividers(rCirca, 0);
14091413
url_add_parameter(&url, "c", zCirca);
14101414
}else{
1411
- blob_appendf(&sql, " ORDER BY event.mtime DESC");
1415
+ blob_append_sql(&sql, " ORDER BY event.mtime DESC");
14121416
}
1413
- blob_appendf(&sql, " LIMIT %d", nEntry);
1414
- db_multi_exec("%s", blob_str(&sql));
1417
+ blob_append_sql(&sql, " LIMIT %d", nEntry);
1418
+ db_multi_exec("%s", blob_sql_text(&sql));
14151419
14161420
n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
14171421
if( zYearMonth ){
14181422
blob_appendf(&desc, "%s events for %h", zEType, zYearMonth);
14191423
}else if( zYearWeek ){
@@ -1506,11 +1510,11 @@
15061510
}
15071511
}
15081512
}
15091513
}
15101514
if( P("showsql") ){
1511
- @ <blockquote>%h(blob_str(&sql))</blockquote>
1515
+ @ <blockquote>%h(blob_sql_text(&sql))</blockquote>
15121516
}
15131517
blob_zero(&sql);
15141518
db_prepare(&q, "SELECT * FROM timeline ORDER BY sortby DESC /*scan*/");
15151519
@ <h2>%b(&desc)</h2>
15161520
blob_reset(&desc);
@@ -1655,11 +1659,10 @@
16551659
/*
16561660
** Return a pointer to a static string that forms the basis for
16571661
** a timeline query for display on a TTY.
16581662
*/
16591663
const char *timeline_query_for_tty(void){
1660
- static const char *zBase = 0;
16611664
static const char zBaseSql[] =
16621665
@ SELECT
16631666
@ blob.rid AS rid,
16641667
@ uuid,
16651668
@ datetime(event.mtime%s) AS mDateTime,
@@ -1675,20 +1678,17 @@
16751678
@ AS primPlinkCount,
16761679
@ (SELECT count(*) FROM plink WHERE cid=blob.rid) AS plinkCount,
16771680
@ event.mtime AS mtime,
16781681
@ tagxref.value AS branch
16791682
@ FROM tag CROSS JOIN event CROSS JOIN blob
1680
- @ LEFT JOIN tagxref ON tagxref.tagid=tag.tagid
1683
+ @ LEFT JOIN tagxref ON tagxref.tagid=tag.tagid
16811684
@ AND tagxref.tagtype>0
16821685
@ AND tagxref.rid=blob.rid
16831686
@ WHERE blob.rid=event.objid
16841687
@ AND tag.tagname='branch'
16851688
;
1686
- if( zBase==0 ){
1687
- zBase = mprintf(zBaseSql, timeline_utc());
1688
- }
1689
- return zBase;
1689
+ return mprintf(zBaseSql /*works-like: "%s"*/, timeline_utc());
16901690
}
16911691
16921692
/*
16931693
** Return true if the input string is a date in the ISO 8601 format:
16941694
** YYYY-MM-DD.
@@ -1739,11 +1739,11 @@
17391739
** -R REPO_FILE Specifies the repository db to use. Default is
17401740
** the current checkout's repository.
17411741
*/
17421742
void timeline_cmd(void){
17431743
Stmt q;
1744
- int n, k, width;
1744
+ int n, k, width, i;
17451745
const char *zLimit;
17461746
const char *zWidth;
17471747
const char *zOffset;
17481748
const char *zType;
17491749
char *zOrigin;
@@ -1752,10 +1752,12 @@
17521752
int objid = 0;
17531753
Blob uuid;
17541754
int mode = 0 ; /* 0:none 1: before 2:after 3:children 4:parents */
17551755
int verboseFlag = 0 ;
17561756
int iOffset;
1757
+ const char *zFilePattern = 0;
1758
+ Blob treeName;
17571759
17581760
verboseFlag = find_option("verbose","v", 0)!=0;
17591761
if( !verboseFlag){
17601762
verboseFlag = find_option("showfiles","f", 0)!=0; /* deprecated */
17611763
}
@@ -1783,37 +1785,39 @@
17831785
iOffset = zOffset ? atoi(zOffset) : 0;
17841786
17851787
/* We should be done with options.. */
17861788
verify_all_options();
17871789
1788
- if( g.argc>=4 ){
1789
- k = strlen(g.argv[2]);
1790
- if( strncmp(g.argv[2],"before",k)==0 ){
1791
- mode = 1;
1792
- }else if( strncmp(g.argv[2],"after",k)==0 && k>1 ){
1793
- mode = 2;
1794
- }else if( strncmp(g.argv[2],"descendants",k)==0 ){
1795
- mode = 3;
1796
- }else if( strncmp(g.argv[2],"children",k)==0 ){
1797
- mode = 3;
1798
- }else if( strncmp(g.argv[2],"ancestors",k)==0 && k>1 ){
1799
- mode = 4;
1800
- }else if( strncmp(g.argv[2],"parents",k)==0 ){
1801
- mode = 4;
1802
- }else if(!zType && !zLimit){
1803
- usage("?WHEN? ?BASELINE|DATETIME? ?-n|--limit #? ?-t|--type TYPE? "
1804
- "?-W|--width WIDTH?");
1805
- }
1806
- if( '-' != *g.argv[3] ){
1807
- zOrigin = g.argv[3];
1808
- }else{
1809
- zOrigin = "now";
1810
- }
1811
- }else if( g.argc==3 ){
1812
- zOrigin = g.argv[2];
1813
- }else{
1814
- zOrigin = "now";
1790
+ zOrigin = "now";
1791
+ zFilePattern = 0;
1792
+ for(i=2; i<g.argc; i++){
1793
+ char *zArg = g.argv[i];
1794
+ k = strlen(zArg);
1795
+ if( mode==0 ){
1796
+ if( strncmp(zArg,"before",k)==0 ){
1797
+ mode = 1;
1798
+ }else if( strncmp(zArg,"after",k)==0 && k>1 ){
1799
+ mode = 2;
1800
+ }else if( strncmp(zArg,"descendants",k)==0 ){
1801
+ mode = 3;
1802
+ }else if( strncmp(zArg,"children",k)==0 ){
1803
+ mode = 3;
1804
+ }else if( strncmp(zArg,"ancestors",k)==0 && k>1 ){
1805
+ mode = 4;
1806
+ }else if( strncmp(zArg,"parents",k)==0 ){
1807
+ mode = 4;
1808
+ }
1809
+ if( mode ){
1810
+ if( i<g.argc-1 ) zOrigin = g.argv[++i];
1811
+ continue;
1812
+ }
1813
+ }
1814
+ if( zFilePattern==0 ){
1815
+ zFilePattern = zArg;
1816
+ }else{
1817
+ usage("?WHEN? ?CHECKIN|DATETIME? ?FILE? ?OPTIONS?");
1818
+ }
18151819
}
18161820
k = strlen(zOrigin);
18171821
blob_zero(&uuid);
18181822
blob_append(&uuid, zOrigin, -1);
18191823
if( fossil_strcmp(zOrigin, "now")==0 ){
@@ -1838,37 +1842,72 @@
18381842
if( mode==0 ){
18391843
if( isIsoDate(zOrigin) ) zShift = ",'+1 day'";
18401844
}
18411845
zDate = mprintf("(SELECT julianday(%Q%s, 'utc'))", zOrigin, zShift);
18421846
}
1847
+
1848
+ if( zFilePattern ){
1849
+ if( zType==0 ){
1850
+ /* When zFilePattern is specified and type is not specified, only show
1851
+ * file checkins */
1852
+ zType="ci";
1853
+ }
1854
+ file_tree_name(zFilePattern, &treeName, 1);
1855
+ if( fossil_strcmp(blob_str(&treeName), ".")==0 ){
1856
+ /* When zTreeName refers to g.zLocalRoot, it's like not specifying
1857
+ * zFilePattern. */
1858
+ zFilePattern = 0;
1859
+ }
1860
+ }
1861
+
18431862
if( mode==0 ) mode = 1;
18441863
blob_zero(&sql);
18451864
blob_append(&sql, timeline_query_for_tty(), -1);
1846
- blob_appendf(&sql, " AND event.mtime %s %s",
1865
+ blob_append_sql(&sql, " AND event.mtime %s %s",
18471866
(mode==1 || mode==4) ? "<=" : ">=",
1848
- zDate
1867
+ zDate /*safe-for-%s*/
18491868
);
18501869
18511870
if( mode==3 || mode==4 ){
18521871
db_multi_exec("CREATE TEMP TABLE ok(rid INTEGER PRIMARY KEY)");
18531872
if( mode==3 ){
18541873
compute_descendants(objid, n);
18551874
}else{
18561875
compute_ancestors(objid, n, 0);
18571876
}
1858
- blob_appendf(&sql, " AND blob.rid IN ok");
1877
+ blob_append_sql(&sql, "\n AND blob.rid IN ok");
18591878
}
18601879
if( zType && (zType[0]!='a') ){
1861
- blob_appendf(&sql, " AND event.type=%Q ", zType);
1880
+ blob_append_sql(&sql, "\n AND event.type=%Q ", zType);
1881
+ }
1882
+ if( zFilePattern ){
1883
+ blob_append(&sql,
1884
+ "\n AND EXISTS(SELECT 1 FROM mlink\n"
1885
+ " WHERE mlink.mid=event.objid\n"
1886
+ " AND mlink.fnid IN ", -1);
1887
+ if( filenames_are_case_sensitive() ){
1888
+ blob_append_sql(&sql,
1889
+ "(SELECT fnid FROM filename"
1890
+ " WHERE name=%Q"
1891
+ " OR name GLOB '%q/*')",
1892
+ blob_str(&treeName), blob_str(&treeName));
1893
+ }else{
1894
+ blob_append_sql(&sql,
1895
+ "(SELECT fnid FROM filename"
1896
+ " WHERE name=%Q COLLATE nocase"
1897
+ " OR lower(name) GLOB lower('%q/*'))",
1898
+ blob_str(&treeName), blob_str(&treeName));
1899
+ }
1900
+ blob_append(&sql, ")", -1);
18621901
}
1863
- blob_appendf(&sql, " ORDER BY event.mtime DESC");
1902
+ blob_append_sql(&sql, "\nORDER BY event.mtime DESC");
18641903
if( iOffset>0 ){
18651904
/* Don't handle LIMIT here, otherwise print_timeline()
18661905
* will not determine the end-marker correctly! */
1867
- blob_appendf(&sql, " LIMIT -1 OFFSET %d", iOffset);
1906
+ blob_append_sql(&sql, "\n LIMIT -1 OFFSET %d", iOffset);
18681907
}
1869
- db_prepare(&q, blob_str(&sql));
1908
+ db_prepare(&q, "%s", blob_sql_text(&sql));
18701909
blob_reset(&sql);
18711910
print_timeline(&q, n, width, verboseFlag);
18721911
db_finalize(&q);
18731912
}
18741913
@@ -2178,24 +2217,24 @@
21782217
stats_report_init_view();
21792218
stats_report_event_types_menu( includeMonth ? "bymonth" : "byyear", NULL );
21802219
blob_appendf(&header, "Timeline Events (%s) by year%s",
21812220
stats_report_label_for_type(),
21822221
(includeMonth ? "/month" : ""));
2183
- blob_appendf(&sql,
2222
+ blob_append_sql(&sql,
21842223
"SELECT substr(date(mtime),1,%d) AS timeframe, "
21852224
"count(*) AS eventCount "
21862225
"FROM v_reports ",
21872226
includeMonth ? 7 : 4);
21882227
if(zUserName&&*zUserName){
2189
- blob_appendf(&sql, " WHERE user=%Q ", zUserName);
2228
+ blob_append_sql(&sql, " WHERE user=%Q ", zUserName);
21902229
blob_appendf(&header," for user %q", zUserName);
21912230
}
21922231
blob_append(&sql,
21932232
" GROUP BY timeframe"
21942233
" ORDER BY timeframe DESC",
21952234
-1);
2196
- db_prepare(&query, blob_str(&sql));
2235
+ db_prepare(&query, "%s", blob_sql_text(&sql));
21972236
blob_reset(&sql);
21982237
@ <h1>%b(&header)</h1>
21992238
@ <table class='statistics-report-table-events' border='0' cellpadding='2'
22002239
@ cellspacing='0' id='statsTable'>
22012240
@ <thead>
@@ -2321,23 +2360,19 @@
23212360
Stmt query = empty_Stmt;
23222361
int nRowNumber = 0; /* current TR number */
23232362
int nEventTotal = 0; /* Total event count */
23242363
int rowClass = 0; /* counter for alternating
23252364
row colors */
2326
- Blob sql = empty_blob; /* SQL */
23272365
int nMaxEvents = 1; /* max number of events for
23282366
all rows. */
23292367
stats_report_init_view();
23302368
stats_report_event_types_menu("byuser", NULL);
2331
- blob_append(&sql,
2369
+ db_prepare(&query,
23322370
"SELECT user, "
23332371
"COUNT(*) AS eventCount "
23342372
"FROM v_reports "
2335
- "GROUP BY user ORDER BY eventCount DESC",
2336
- -1);
2337
- db_prepare(&query, blob_str(&sql));
2338
- blob_reset(&sql);
2373
+ "GROUP BY user ORDER BY eventCount DESC");
23392374
@ <h1>Timeline Events
23402375
@ (%s(stats_report_label_for_type())) by User</h1>
23412376
@ <table class='statistics-report-table-events' border='0'
23422377
@ cellpadding='2' cellspacing='0' id='statsTable'>
23432378
@ <thead><tr>
@@ -2388,28 +2423,24 @@
23882423
Stmt query = empty_Stmt;
23892424
int nRowNumber = 0; /* current TR number */
23902425
int nEventTotal = 0; /* Total event count */
23912426
int rowClass = 0; /* counter for alternating
23922427
row colors */
2393
- Blob sql = empty_blob; /* SQL */
23942428
int nMaxEvents = 1; /* max number of events for
23952429
all rows. */
23962430
static const char *const daysOfWeek[] = {
23972431
"Monday", "Tuesday", "Wednesday", "Thursday",
23982432
"Friday", "Saturday", "Sunday"
23992433
};
24002434
24012435
stats_report_init_view();
24022436
stats_report_event_types_menu("byweekday", NULL);
2403
- blob_append(&sql,
2437
+ db_prepare(&query,
24042438
"SELECT cast(mtime %% 7 AS INTEGER) dow, "
24052439
"COUNT(*) AS eventCount "
24062440
"FROM v_reports "
2407
- "GROUP BY dow ORDER BY dow",
2408
- -1);
2409
- db_prepare(&query, blob_str(&sql));
2410
- blob_reset(&sql);
2441
+ "GROUP BY dow ORDER BY dow");
24112442
@ <h1>Timeline Events
24122443
@ (%s(stats_report_label_for_type())) by Day of the Week</h1>
24132444
@ <table class='statistics-report-table-events' border='0'
24142445
@ cellpadding='2' cellspacing='0' id='statsTable'>
24152446
@ <thead><tr>
@@ -2477,14 +2508,14 @@
24772508
}
24782509
blob_append(&sql,
24792510
"SELECT DISTINCT substr(date(mtime),1,4) AS y "
24802511
"FROM v_reports WHERE 1 ", -1);
24812512
if(zUserName&&*zUserName){
2482
- blob_appendf(&sql,"AND user=%Q ", zUserName);
2513
+ blob_append_sql(&sql,"AND user=%Q ", zUserName);
24832514
}
24842515
blob_append(&sql,"GROUP BY y ORDER BY y", -1);
2485
- db_prepare(&qYears, blob_str(&sql));
2516
+ db_prepare(&qYears, "%s", blob_sql_text(&sql));
24862517
blob_reset(&sql);
24872518
cgi_printf("Select year: ");
24882519
while( SQLITE_ROW == db_step(&qYears) ){
24892520
const char *zT = db_column_text(&qYears, 0);
24902521
if( i++ ){
@@ -2510,22 +2541,22 @@
25102541
int total = 0;
25112542
Blob header = empty_blob;
25122543
blob_appendf(&header, "Timeline events (%s) for the calendar weeks "
25132544
"of %h", stats_report_label_for_type(),
25142545
zYear);
2515
- blob_appendf(&sql,
2546
+ blob_append_sql(&sql,
25162547
"SELECT DISTINCT strftime('%%%%W',mtime) AS wk, "
25172548
"count(*) AS n "
25182549
"FROM v_reports "
25192550
"WHERE %Q=substr(date(mtime),1,4) "
25202551
"AND mtime < current_timestamp ",
25212552
zYear);
25222553
if(zUserName&&*zUserName){
2523
- blob_appendf(&sql, " AND user=%Q ", zUserName);
2554
+ blob_append_sql(&sql, " AND user=%Q ", zUserName);
25242555
blob_appendf(&header," for user %h", zUserName);
25252556
}
2526
- blob_appendf(&sql, "GROUP BY wk ORDER BY wk DESC");
2557
+ blob_append_sql(&sql, "GROUP BY wk ORDER BY wk DESC");
25272558
cgi_printf("<h1>%h</h1>", blob_str(&header));
25282559
blob_reset(&header);
25292560
cgi_printf("<table class='statistics-report-table-events' "
25302561
"border='0' cellpadding='2' width='100%%' "
25312562
"cellspacing='0' id='statsTable'>");
@@ -2533,11 +2564,11 @@
25332564
"<th>Week</th>"
25342565
"<th>Events</th>"
25352566
"<th width='90%%'><!-- relative commits graph --></th>"
25362567
"</tr></thead>"
25372568
"<tbody>");
2538
- db_prepare(&stWeek, blob_str(&sql));
2569
+ db_prepare(&stWeek, "%s", blob_sql_text(&sql));
25392570
blob_reset(&sql);
25402571
while( SQLITE_ROW == db_step(&stWeek) ){
25412572
const int nCount = db_column_int(&stWeek, 1);
25422573
if(nCount>nMaxEvents){
25432574
nMaxEvents = nCount;
25442575
--- src/timeline.c
+++ src/timeline.c
@@ -393,14 +393,14 @@
393 }else if( mxWikiLen>0 && blob_size(&comment)>mxWikiLen ){
394 Blob truncated;
395 blob_zero(&truncated);
396 blob_append(&truncated, blob_buffer(&comment), mxWikiLen);
397 blob_append(&truncated, "...", 3);
398 @ <span class="timelineComment">%w(blob_str(&truncated))</span>
399 blob_reset(&truncated);
400 }else{
401 @ <span class="timelineComment">%w(blob_str(&comment))</span>
402 }
403 blob_reset(&comment);
404
405 /* Generate the "user: USERNAME" at the end of the comment, together
406 ** with a hyperlink to another timeline for that user.
@@ -860,11 +860,11 @@
860 @ tagid INTEGER,
861 @ short TEXT,
862 @ sortby REAL
863 @ )
864 ;
865 db_multi_exec(zSql);
866 }
867
868 /*
869 ** Return a pointer to a constant string that forms the basis
870 ** for a timeline query for the WWW interface.
@@ -889,11 +889,11 @@
889 @ event.mtime AS mtime
890 @ FROM event CROSS JOIN blob
891 @ WHERE blob.rid=event.objid
892 ;
893 if( zBase==0 ){
894 zBase = mprintf(zBaseSql, timeline_utc());
895 }
896 return zBase;
897 }
898
899 /*
@@ -965,11 +965,11 @@
965 Stmt q;
966 Blob out;
967 const char *zSep = "";
968 db_prepare(&q,
969 "SELECT DISTINCT filename.name FROM mlink, filename"
970 " WHERE mlink.fid=(SELECT rid FROM blob WHERE uuid='%s')"
971 " AND filename.fnid=mlink.fnid",
972 zUuid
973 );
974 blob_zero(&out);
975 while( db_step(&q)==SQLITE_ROW ){
@@ -1129,13 +1129,15 @@
1129 if( P("fc")!=0 || P("v")!=0 || P("detail")!=0 ){
1130 tmFlags |= TIMELINE_FCHANGES;
1131 url_add_parameter(&url, "v", 0);
1132 }
1133 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1134 blob_appendf(&sql, " AND NOT EXISTS(SELECT 1 FROM tagxref"
1135 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)",
1136 TAG_HIDDEN);
 
 
1137 }
1138 if( !useDividers ) url_add_parameter(&url, "nd", 0);
1139 if( ((from_rid && to_rid) || (me_rid && you_rid)) && g.perm.Read ){
1140 /* If from= and to= are present, display all nodes on a path connecting
1141 ** the two */
@@ -1154,21 +1156,21 @@
1154 zFrom = P("me");
1155 zTo = P("you");
1156 }
1157 blob_append(&sql, " AND event.objid IN (0", -1);
1158 while( p ){
1159 blob_appendf(&sql, ",%d", p->rid);
1160 p = p->u.pTo;
1161 }
1162 blob_append(&sql, ")", -1);
1163 path_reset();
1164 blob_append(&desc, "All nodes on the path from ", -1);
1165 blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom);
1166 blob_append(&desc, " to ", -1);
1167 blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo);
1168 tmFlags |= TIMELINE_DISJOINT;
1169 db_multi_exec("%s", blob_str(&sql));
1170 }else if( (p_rid || d_rid) && g.perm.Read ){
1171 /* If p= or d= is present, ignore all other parameters other than n= */
1172 char *zUuid;
1173 int np, nd;
1174
@@ -1179,16 +1181,16 @@
1179 db_multi_exec(
1180 "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY)"
1181 );
1182 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d",
1183 p_rid ? p_rid : d_rid);
1184 blob_appendf(&sql, " AND event.objid IN ok");
1185 nd = 0;
1186 if( d_rid ){
1187 compute_descendants(d_rid, nEntry+1);
1188 nd = db_int(0, "SELECT count(*)-1 FROM ok");
1189 if( nd>=0 ) db_multi_exec("%s", blob_str(&sql));
1190 if( nd>0 ) blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s");
1191 if( useDividers ) timeline_add_dividers(0, d_rid);
1192 db_multi_exec("DELETE FROM ok");
1193 }
1194 if( p_rid ){
@@ -1195,11 +1197,11 @@
1195 compute_ancestors(p_rid, nEntry+1, 0);
1196 np = db_int(0, "SELECT count(*)-1 FROM ok");
1197 if( np>0 ){
1198 if( nd>0 ) blob_appendf(&desc, " and ");
1199 blob_appendf(&desc, "%d ancestors", np);
1200 db_multi_exec("%s", blob_str(&sql));
1201 }
1202 if( d_rid==0 && useDividers ) timeline_add_dividers(0, p_rid);
1203 }
1204 blob_appendf(&desc, " of %z[%S]</a>",
1205 href("%R/info/%s", zUuid), zUuid);
@@ -1235,12 +1237,12 @@
1235 "INSERT INTO ok VALUES(%d);"
1236 "INSERT OR IGNORE INTO ok SELECT pid FROM plink WHERE cid=%d;"
1237 "INSERT OR IGNORE INTO ok SELECT cid FROM plink WHERE pid=%d;",
1238 f_rid, f_rid, f_rid
1239 );
1240 blob_appendf(&sql, " AND event.objid IN ok");
1241 db_multi_exec("%s", blob_str(&sql));
1242 if( useDividers ) timeline_add_dividers(0, f_rid);
1243 blob_appendf(&desc, "Parents and children of check-in ");
1244 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid);
1245 blob_appendf(&desc, "%z[%S]</a>", href("%R/info/%s", zUuid), zUuid);
1246 tmFlags |= TIMELINE_DISJOINT;
@@ -1257,25 +1259,25 @@
1257 /* Otherwise, a timeline based on a span of time */
1258 int n;
1259 const char *zEType = "timeline item";
1260 char *zDate;
1261 if( zUses ){
1262 blob_appendf(&sql, " AND event.objid IN usesfile ");
1263 }
1264 if( renameOnly ){
1265 blob_appendf(&sql, " AND event.objid IN rnfile ");
1266 }
1267 if( zYearMonth ){
1268 blob_appendf(&sql, " AND %Q=strftime('%%Y-%%m',event.mtime) ",
1269 zYearMonth);
1270 }
1271 else if( zYearWeek ){
1272 blob_appendf(&sql, " AND %Q=strftime('%%Y-%%W',event.mtime) ",
1273 zYearWeek);
1274 }
1275 if( tagid>0 ){
1276 blob_appendf(&sql,
1277 "AND (EXISTS(SELECT 1 FROM tagxref"
1278 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", tagid);
1279
1280 if( zBrName ){
1281 url_add_parameter(&url, "r", zBrName);
@@ -1283,40 +1285,42 @@
1283 ** are not part of the branch which are parents or children of the
1284 ** branch to be included in the report. This related check-ins are
1285 ** useful in helping to visualize what has happened on a quiescent
1286 ** branch that is infrequently merged with a much more activate branch.
1287 */
1288 blob_appendf(&sql,
1289 " OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=cid"
1290 " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)",
1291 tagid
1292 );
1293 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1294 blob_appendf(&sql,
1295 " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=cid"
1296 " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)",
1297 TAG_HIDDEN
1298 );
1299 }
1300 if( P("mionly")==0 ){
1301 blob_appendf(&sql,
1302 " OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=pid"
1303 " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1304 tagid
1305 );
1306 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1307 blob_appendf(&sql, " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid"
1308 " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1309 TAG_HIDDEN);
 
 
1310 }
1311 }else{
1312 url_add_parameter(&url, "mionly", "1");
1313 }
1314 }else{
1315 url_add_parameter(&url, "t", zTagName);
1316 }
1317 blob_appendf(&sql, ")");
1318 }
1319 if( (zType[0]=='w' && !g.perm.RdWiki)
1320 || (zType[0]=='t' && !g.perm.RdTkt)
1321 || (zType[0]=='e' && !g.perm.RdWiki)
1322 || (zType[0]=='c' && !g.perm.Read)
@@ -1325,27 +1329,27 @@
1325 zType = "all";
1326 }
1327 if( zType[0]=='a' ){
1328 if( !g.perm.Read || !g.perm.RdWiki || !g.perm.RdTkt ){
1329 char cSep = '(';
1330 blob_appendf(&sql, " AND event.type IN ");
1331 if( g.perm.Read ){
1332 blob_appendf(&sql, "%c'ci','g'", cSep);
1333 cSep = ',';
1334 }
1335 if( g.perm.RdWiki ){
1336 blob_appendf(&sql, "%c'w','e'", cSep);
1337 cSep = ',';
1338 }
1339 if( g.perm.RdTkt ){
1340 blob_appendf(&sql, "%c't'", cSep);
1341 cSep = ',';
1342 }
1343 blob_appendf(&sql, ")");
1344 }
1345 }else{ /* zType!="all" */
1346 blob_appendf(&sql, " AND event.type=%Q", zType);
1347 url_add_parameter(&url, "y", zType);
1348 if( zType[0]=='c' ){
1349 zEType = "checkin";
1350 }else if( zType[0]=='w' ){
1351 zEType = "wiki edit";
@@ -1356,64 +1360,64 @@
1356 }else if( zType[0]=='g' ){
1357 zEType = "tag";
1358 }
1359 }
1360 if( zUser ){
1361 blob_appendf(&sql, " AND (event.user=%Q OR event.euser=%Q)",
1362 zUser, zUser);
1363 url_add_parameter(&url, "u", zUser);
1364 zThisUser = zUser;
1365 }
1366 if( zSearch ){
1367 blob_appendf(&sql,
1368 " AND (event.comment LIKE '%%%q%%' OR event.brief LIKE '%%%q%%')",
1369 zSearch, zSearch);
1370 url_add_parameter(&url, "s", zSearch);
1371 }
1372 rBefore = symbolic_name_to_mtime(zBefore);
1373 rAfter = symbolic_name_to_mtime(zAfter);
1374 rCirca = symbolic_name_to_mtime(zCirca);
1375 if( rAfter>0.0 ){
1376 if( rBefore>0.0 ){
1377 blob_appendf(&sql,
1378 " AND event.mtime>=%.17g AND event.mtime<=%.17g"
1379 " ORDER BY event.mtime ASC", rAfter-ONE_SECOND, rBefore+ONE_SECOND);
1380 url_add_parameter(&url, "a", zAfter);
1381 url_add_parameter(&url, "b", zBefore);
1382 nEntry = 1000000;
1383 }else{
1384 blob_appendf(&sql,
1385 " AND event.mtime>=%.17g ORDER BY event.mtime ASC",
1386 rAfter-ONE_SECOND);
1387 url_add_parameter(&url, "a", zAfter);
1388 }
1389 }else if( rBefore>0.0 ){
1390 blob_appendf(&sql,
1391 " AND event.mtime<=%.17g ORDER BY event.mtime DESC",
1392 rBefore+ONE_SECOND);
1393 url_add_parameter(&url, "b", zBefore);
1394 }else if( rCirca>0.0 ){
1395 Blob sql2;
1396 blob_init(&sql2, blob_str(&sql), -1);
1397 blob_appendf(&sql2,
1398 " AND event.mtime<=%f ORDER BY event.mtime DESC LIMIT %d",
1399 rCirca, (nEntry+1)/2
1400 );
1401 db_multi_exec("%s", blob_str(&sql2));
1402 blob_reset(&sql2);
1403 blob_appendf(&sql,
1404 " AND event.mtime>=%f ORDER BY event.mtime ASC",
1405 rCirca
1406 );
1407 nEntry -= (nEntry+1)/2;
1408 if( useDividers ) timeline_add_dividers(rCirca, 0);
1409 url_add_parameter(&url, "c", zCirca);
1410 }else{
1411 blob_appendf(&sql, " ORDER BY event.mtime DESC");
1412 }
1413 blob_appendf(&sql, " LIMIT %d", nEntry);
1414 db_multi_exec("%s", blob_str(&sql));
1415
1416 n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
1417 if( zYearMonth ){
1418 blob_appendf(&desc, "%s events for %h", zEType, zYearMonth);
1419 }else if( zYearWeek ){
@@ -1506,11 +1510,11 @@
1506 }
1507 }
1508 }
1509 }
1510 if( P("showsql") ){
1511 @ <blockquote>%h(blob_str(&sql))</blockquote>
1512 }
1513 blob_zero(&sql);
1514 db_prepare(&q, "SELECT * FROM timeline ORDER BY sortby DESC /*scan*/");
1515 @ <h2>%b(&desc)</h2>
1516 blob_reset(&desc);
@@ -1655,11 +1659,10 @@
1655 /*
1656 ** Return a pointer to a static string that forms the basis for
1657 ** a timeline query for display on a TTY.
1658 */
1659 const char *timeline_query_for_tty(void){
1660 static const char *zBase = 0;
1661 static const char zBaseSql[] =
1662 @ SELECT
1663 @ blob.rid AS rid,
1664 @ uuid,
1665 @ datetime(event.mtime%s) AS mDateTime,
@@ -1675,20 +1678,17 @@
1675 @ AS primPlinkCount,
1676 @ (SELECT count(*) FROM plink WHERE cid=blob.rid) AS plinkCount,
1677 @ event.mtime AS mtime,
1678 @ tagxref.value AS branch
1679 @ FROM tag CROSS JOIN event CROSS JOIN blob
1680 @ LEFT JOIN tagxref ON tagxref.tagid=tag.tagid
1681 @ AND tagxref.tagtype>0
1682 @ AND tagxref.rid=blob.rid
1683 @ WHERE blob.rid=event.objid
1684 @ AND tag.tagname='branch'
1685 ;
1686 if( zBase==0 ){
1687 zBase = mprintf(zBaseSql, timeline_utc());
1688 }
1689 return zBase;
1690 }
1691
1692 /*
1693 ** Return true if the input string is a date in the ISO 8601 format:
1694 ** YYYY-MM-DD.
@@ -1739,11 +1739,11 @@
1739 ** -R REPO_FILE Specifies the repository db to use. Default is
1740 ** the current checkout's repository.
1741 */
1742 void timeline_cmd(void){
1743 Stmt q;
1744 int n, k, width;
1745 const char *zLimit;
1746 const char *zWidth;
1747 const char *zOffset;
1748 const char *zType;
1749 char *zOrigin;
@@ -1752,10 +1752,12 @@
1752 int objid = 0;
1753 Blob uuid;
1754 int mode = 0 ; /* 0:none 1: before 2:after 3:children 4:parents */
1755 int verboseFlag = 0 ;
1756 int iOffset;
 
 
1757
1758 verboseFlag = find_option("verbose","v", 0)!=0;
1759 if( !verboseFlag){
1760 verboseFlag = find_option("showfiles","f", 0)!=0; /* deprecated */
1761 }
@@ -1783,37 +1785,39 @@
1783 iOffset = zOffset ? atoi(zOffset) : 0;
1784
1785 /* We should be done with options.. */
1786 verify_all_options();
1787
1788 if( g.argc>=4 ){
1789 k = strlen(g.argv[2]);
1790 if( strncmp(g.argv[2],"before",k)==0 ){
1791 mode = 1;
1792 }else if( strncmp(g.argv[2],"after",k)==0 && k>1 ){
1793 mode = 2;
1794 }else if( strncmp(g.argv[2],"descendants",k)==0 ){
1795 mode = 3;
1796 }else if( strncmp(g.argv[2],"children",k)==0 ){
1797 mode = 3;
1798 }else if( strncmp(g.argv[2],"ancestors",k)==0 && k>1 ){
1799 mode = 4;
1800 }else if( strncmp(g.argv[2],"parents",k)==0 ){
1801 mode = 4;
1802 }else if(!zType && !zLimit){
1803 usage("?WHEN? ?BASELINE|DATETIME? ?-n|--limit #? ?-t|--type TYPE? "
1804 "?-W|--width WIDTH?");
1805 }
1806 if( '-' != *g.argv[3] ){
1807 zOrigin = g.argv[3];
1808 }else{
1809 zOrigin = "now";
1810 }
1811 }else if( g.argc==3 ){
1812 zOrigin = g.argv[2];
1813 }else{
1814 zOrigin = "now";
 
 
1815 }
1816 k = strlen(zOrigin);
1817 blob_zero(&uuid);
1818 blob_append(&uuid, zOrigin, -1);
1819 if( fossil_strcmp(zOrigin, "now")==0 ){
@@ -1838,37 +1842,72 @@
1838 if( mode==0 ){
1839 if( isIsoDate(zOrigin) ) zShift = ",'+1 day'";
1840 }
1841 zDate = mprintf("(SELECT julianday(%Q%s, 'utc'))", zOrigin, zShift);
1842 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1843 if( mode==0 ) mode = 1;
1844 blob_zero(&sql);
1845 blob_append(&sql, timeline_query_for_tty(), -1);
1846 blob_appendf(&sql, " AND event.mtime %s %s",
1847 (mode==1 || mode==4) ? "<=" : ">=",
1848 zDate
1849 );
1850
1851 if( mode==3 || mode==4 ){
1852 db_multi_exec("CREATE TEMP TABLE ok(rid INTEGER PRIMARY KEY)");
1853 if( mode==3 ){
1854 compute_descendants(objid, n);
1855 }else{
1856 compute_ancestors(objid, n, 0);
1857 }
1858 blob_appendf(&sql, " AND blob.rid IN ok");
1859 }
1860 if( zType && (zType[0]!='a') ){
1861 blob_appendf(&sql, " AND event.type=%Q ", zType);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1862 }
1863 blob_appendf(&sql, " ORDER BY event.mtime DESC");
1864 if( iOffset>0 ){
1865 /* Don't handle LIMIT here, otherwise print_timeline()
1866 * will not determine the end-marker correctly! */
1867 blob_appendf(&sql, " LIMIT -1 OFFSET %d", iOffset);
1868 }
1869 db_prepare(&q, blob_str(&sql));
1870 blob_reset(&sql);
1871 print_timeline(&q, n, width, verboseFlag);
1872 db_finalize(&q);
1873 }
1874
@@ -2178,24 +2217,24 @@
2178 stats_report_init_view();
2179 stats_report_event_types_menu( includeMonth ? "bymonth" : "byyear", NULL );
2180 blob_appendf(&header, "Timeline Events (%s) by year%s",
2181 stats_report_label_for_type(),
2182 (includeMonth ? "/month" : ""));
2183 blob_appendf(&sql,
2184 "SELECT substr(date(mtime),1,%d) AS timeframe, "
2185 "count(*) AS eventCount "
2186 "FROM v_reports ",
2187 includeMonth ? 7 : 4);
2188 if(zUserName&&*zUserName){
2189 blob_appendf(&sql, " WHERE user=%Q ", zUserName);
2190 blob_appendf(&header," for user %q", zUserName);
2191 }
2192 blob_append(&sql,
2193 " GROUP BY timeframe"
2194 " ORDER BY timeframe DESC",
2195 -1);
2196 db_prepare(&query, blob_str(&sql));
2197 blob_reset(&sql);
2198 @ <h1>%b(&header)</h1>
2199 @ <table class='statistics-report-table-events' border='0' cellpadding='2'
2200 @ cellspacing='0' id='statsTable'>
2201 @ <thead>
@@ -2321,23 +2360,19 @@
2321 Stmt query = empty_Stmt;
2322 int nRowNumber = 0; /* current TR number */
2323 int nEventTotal = 0; /* Total event count */
2324 int rowClass = 0; /* counter for alternating
2325 row colors */
2326 Blob sql = empty_blob; /* SQL */
2327 int nMaxEvents = 1; /* max number of events for
2328 all rows. */
2329 stats_report_init_view();
2330 stats_report_event_types_menu("byuser", NULL);
2331 blob_append(&sql,
2332 "SELECT user, "
2333 "COUNT(*) AS eventCount "
2334 "FROM v_reports "
2335 "GROUP BY user ORDER BY eventCount DESC",
2336 -1);
2337 db_prepare(&query, blob_str(&sql));
2338 blob_reset(&sql);
2339 @ <h1>Timeline Events
2340 @ (%s(stats_report_label_for_type())) by User</h1>
2341 @ <table class='statistics-report-table-events' border='0'
2342 @ cellpadding='2' cellspacing='0' id='statsTable'>
2343 @ <thead><tr>
@@ -2388,28 +2423,24 @@
2388 Stmt query = empty_Stmt;
2389 int nRowNumber = 0; /* current TR number */
2390 int nEventTotal = 0; /* Total event count */
2391 int rowClass = 0; /* counter for alternating
2392 row colors */
2393 Blob sql = empty_blob; /* SQL */
2394 int nMaxEvents = 1; /* max number of events for
2395 all rows. */
2396 static const char *const daysOfWeek[] = {
2397 "Monday", "Tuesday", "Wednesday", "Thursday",
2398 "Friday", "Saturday", "Sunday"
2399 };
2400
2401 stats_report_init_view();
2402 stats_report_event_types_menu("byweekday", NULL);
2403 blob_append(&sql,
2404 "SELECT cast(mtime %% 7 AS INTEGER) dow, "
2405 "COUNT(*) AS eventCount "
2406 "FROM v_reports "
2407 "GROUP BY dow ORDER BY dow",
2408 -1);
2409 db_prepare(&query, blob_str(&sql));
2410 blob_reset(&sql);
2411 @ <h1>Timeline Events
2412 @ (%s(stats_report_label_for_type())) by Day of the Week</h1>
2413 @ <table class='statistics-report-table-events' border='0'
2414 @ cellpadding='2' cellspacing='0' id='statsTable'>
2415 @ <thead><tr>
@@ -2477,14 +2508,14 @@
2477 }
2478 blob_append(&sql,
2479 "SELECT DISTINCT substr(date(mtime),1,4) AS y "
2480 "FROM v_reports WHERE 1 ", -1);
2481 if(zUserName&&*zUserName){
2482 blob_appendf(&sql,"AND user=%Q ", zUserName);
2483 }
2484 blob_append(&sql,"GROUP BY y ORDER BY y", -1);
2485 db_prepare(&qYears, blob_str(&sql));
2486 blob_reset(&sql);
2487 cgi_printf("Select year: ");
2488 while( SQLITE_ROW == db_step(&qYears) ){
2489 const char *zT = db_column_text(&qYears, 0);
2490 if( i++ ){
@@ -2510,22 +2541,22 @@
2510 int total = 0;
2511 Blob header = empty_blob;
2512 blob_appendf(&header, "Timeline events (%s) for the calendar weeks "
2513 "of %h", stats_report_label_for_type(),
2514 zYear);
2515 blob_appendf(&sql,
2516 "SELECT DISTINCT strftime('%%%%W',mtime) AS wk, "
2517 "count(*) AS n "
2518 "FROM v_reports "
2519 "WHERE %Q=substr(date(mtime),1,4) "
2520 "AND mtime < current_timestamp ",
2521 zYear);
2522 if(zUserName&&*zUserName){
2523 blob_appendf(&sql, " AND user=%Q ", zUserName);
2524 blob_appendf(&header," for user %h", zUserName);
2525 }
2526 blob_appendf(&sql, "GROUP BY wk ORDER BY wk DESC");
2527 cgi_printf("<h1>%h</h1>", blob_str(&header));
2528 blob_reset(&header);
2529 cgi_printf("<table class='statistics-report-table-events' "
2530 "border='0' cellpadding='2' width='100%%' "
2531 "cellspacing='0' id='statsTable'>");
@@ -2533,11 +2564,11 @@
2533 "<th>Week</th>"
2534 "<th>Events</th>"
2535 "<th width='90%%'><!-- relative commits graph --></th>"
2536 "</tr></thead>"
2537 "<tbody>");
2538 db_prepare(&stWeek, blob_str(&sql));
2539 blob_reset(&sql);
2540 while( SQLITE_ROW == db_step(&stWeek) ){
2541 const int nCount = db_column_int(&stWeek, 1);
2542 if(nCount>nMaxEvents){
2543 nMaxEvents = nCount;
2544
--- src/timeline.c
+++ src/timeline.c
@@ -393,14 +393,14 @@
393 }else if( mxWikiLen>0 && blob_size(&comment)>mxWikiLen ){
394 Blob truncated;
395 blob_zero(&truncated);
396 blob_append(&truncated, blob_buffer(&comment), mxWikiLen);
397 blob_append(&truncated, "...", 3);
398 @ <span class="timelineComment">%W(blob_str(&truncated))</span>
399 blob_reset(&truncated);
400 }else{
401 @ <span class="timelineComment">%W(blob_str(&comment))</span>
402 }
403 blob_reset(&comment);
404
405 /* Generate the "user: USERNAME" at the end of the comment, together
406 ** with a hyperlink to another timeline for that user.
@@ -860,11 +860,11 @@
860 @ tagid INTEGER,
861 @ short TEXT,
862 @ sortby REAL
863 @ )
864 ;
865 db_multi_exec("%s", zSql/*safe-for-%s*/);
866 }
867
868 /*
869 ** Return a pointer to a constant string that forms the basis
870 ** for a timeline query for the WWW interface.
@@ -889,11 +889,11 @@
889 @ event.mtime AS mtime
890 @ FROM event CROSS JOIN blob
891 @ WHERE blob.rid=event.objid
892 ;
893 if( zBase==0 ){
894 zBase = mprintf(zBaseSql /*works-like: "%s"*/, timeline_utc());
895 }
896 return zBase;
897 }
898
899 /*
@@ -965,11 +965,11 @@
965 Stmt q;
966 Blob out;
967 const char *zSep = "";
968 db_prepare(&q,
969 "SELECT DISTINCT filename.name FROM mlink, filename"
970 " WHERE mlink.fid=(SELECT rid FROM blob WHERE uuid=%Q)"
971 " AND filename.fnid=mlink.fnid",
972 zUuid
973 );
974 blob_zero(&out);
975 while( db_step(&q)==SQLITE_ROW ){
@@ -1129,13 +1129,15 @@
1129 if( P("fc")!=0 || P("v")!=0 || P("detail")!=0 ){
1130 tmFlags |= TIMELINE_FCHANGES;
1131 url_add_parameter(&url, "v", 0);
1132 }
1133 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1134 blob_append_sql(&sql,
1135 " AND NOT EXISTS(SELECT 1 FROM tagxref"
1136 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)",
1137 TAG_HIDDEN
1138 );
1139 }
1140 if( !useDividers ) url_add_parameter(&url, "nd", 0);
1141 if( ((from_rid && to_rid) || (me_rid && you_rid)) && g.perm.Read ){
1142 /* If from= and to= are present, display all nodes on a path connecting
1143 ** the two */
@@ -1154,21 +1156,21 @@
1156 zFrom = P("me");
1157 zTo = P("you");
1158 }
1159 blob_append(&sql, " AND event.objid IN (0", -1);
1160 while( p ){
1161 blob_append_sql(&sql, ",%d", p->rid);
1162 p = p->u.pTo;
1163 }
1164 blob_append(&sql, ")", -1);
1165 path_reset();
1166 blob_append(&desc, "All nodes on the path from ", -1);
1167 blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom);
1168 blob_append(&desc, " to ", -1);
1169 blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo);
1170 tmFlags |= TIMELINE_DISJOINT;
1171 db_multi_exec("%s", blob_sql_text(&sql));
1172 }else if( (p_rid || d_rid) && g.perm.Read ){
1173 /* If p= or d= is present, ignore all other parameters other than n= */
1174 char *zUuid;
1175 int np, nd;
1176
@@ -1179,16 +1181,16 @@
1181 db_multi_exec(
1182 "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY)"
1183 );
1184 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d",
1185 p_rid ? p_rid : d_rid);
1186 blob_append_sql(&sql, " AND event.objid IN ok");
1187 nd = 0;
1188 if( d_rid ){
1189 compute_descendants(d_rid, nEntry+1);
1190 nd = db_int(0, "SELECT count(*)-1 FROM ok");
1191 if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql));
1192 if( nd>0 ) blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s");
1193 if( useDividers ) timeline_add_dividers(0, d_rid);
1194 db_multi_exec("DELETE FROM ok");
1195 }
1196 if( p_rid ){
@@ -1195,11 +1197,11 @@
1197 compute_ancestors(p_rid, nEntry+1, 0);
1198 np = db_int(0, "SELECT count(*)-1 FROM ok");
1199 if( np>0 ){
1200 if( nd>0 ) blob_appendf(&desc, " and ");
1201 blob_appendf(&desc, "%d ancestors", np);
1202 db_multi_exec("%s", blob_sql_text(&sql));
1203 }
1204 if( d_rid==0 && useDividers ) timeline_add_dividers(0, p_rid);
1205 }
1206 blob_appendf(&desc, " of %z[%S]</a>",
1207 href("%R/info/%s", zUuid), zUuid);
@@ -1235,12 +1237,12 @@
1237 "INSERT INTO ok VALUES(%d);"
1238 "INSERT OR IGNORE INTO ok SELECT pid FROM plink WHERE cid=%d;"
1239 "INSERT OR IGNORE INTO ok SELECT cid FROM plink WHERE pid=%d;",
1240 f_rid, f_rid, f_rid
1241 );
1242 blob_append_sql(&sql, " AND event.objid IN ok");
1243 db_multi_exec("%s", blob_sql_text(&sql));
1244 if( useDividers ) timeline_add_dividers(0, f_rid);
1245 blob_appendf(&desc, "Parents and children of check-in ");
1246 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid);
1247 blob_appendf(&desc, "%z[%S]</a>", href("%R/info/%s", zUuid), zUuid);
1248 tmFlags |= TIMELINE_DISJOINT;
@@ -1257,25 +1259,25 @@
1259 /* Otherwise, a timeline based on a span of time */
1260 int n;
1261 const char *zEType = "timeline item";
1262 char *zDate;
1263 if( zUses ){
1264 blob_append_sql(&sql, " AND event.objid IN usesfile ");
1265 }
1266 if( renameOnly ){
1267 blob_append_sql(&sql, " AND event.objid IN rnfile ");
1268 }
1269 if( zYearMonth ){
1270 blob_append_sql(&sql, " AND %Q=strftime('%%Y-%%m',event.mtime) ",
1271 zYearMonth);
1272 }
1273 else if( zYearWeek ){
1274 blob_append_sql(&sql, " AND %Q=strftime('%%Y-%%W',event.mtime) ",
1275 zYearWeek);
1276 }
1277 if( tagid>0 ){
1278 blob_append_sql(&sql,
1279 "AND (EXISTS(SELECT 1 FROM tagxref"
1280 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", tagid);
1281
1282 if( zBrName ){
1283 url_add_parameter(&url, "r", zBrName);
@@ -1283,40 +1285,42 @@
1285 ** are not part of the branch which are parents or children of the
1286 ** branch to be included in the report. This related check-ins are
1287 ** useful in helping to visualize what has happened on a quiescent
1288 ** branch that is infrequently merged with a much more activate branch.
1289 */
1290 blob_append_sql(&sql,
1291 " OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=cid"
1292 " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)",
1293 tagid
1294 );
1295 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1296 blob_append_sql(&sql,
1297 " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=cid"
1298 " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)",
1299 TAG_HIDDEN
1300 );
1301 }
1302 if( P("mionly")==0 ){
1303 blob_append_sql(&sql,
1304 " OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=pid"
1305 " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1306 tagid
1307 );
1308 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1309 blob_append_sql(&sql,
1310 " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid"
1311 " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1312 TAG_HIDDEN
1313 );
1314 }
1315 }else{
1316 url_add_parameter(&url, "mionly", "1");
1317 }
1318 }else{
1319 url_add_parameter(&url, "t", zTagName);
1320 }
1321 blob_append_sql(&sql, ")");
1322 }
1323 if( (zType[0]=='w' && !g.perm.RdWiki)
1324 || (zType[0]=='t' && !g.perm.RdTkt)
1325 || (zType[0]=='e' && !g.perm.RdWiki)
1326 || (zType[0]=='c' && !g.perm.Read)
@@ -1325,27 +1329,27 @@
1329 zType = "all";
1330 }
1331 if( zType[0]=='a' ){
1332 if( !g.perm.Read || !g.perm.RdWiki || !g.perm.RdTkt ){
1333 char cSep = '(';
1334 blob_append_sql(&sql, " AND event.type IN ");
1335 if( g.perm.Read ){
1336 blob_append_sql(&sql, "%c'ci','g'", cSep);
1337 cSep = ',';
1338 }
1339 if( g.perm.RdWiki ){
1340 blob_append_sql(&sql, "%c'w','e'", cSep);
1341 cSep = ',';
1342 }
1343 if( g.perm.RdTkt ){
1344 blob_append_sql(&sql, "%c't'", cSep);
1345 cSep = ',';
1346 }
1347 blob_append_sql(&sql, ")");
1348 }
1349 }else{ /* zType!="all" */
1350 blob_append_sql(&sql, " AND event.type=%Q", zType);
1351 url_add_parameter(&url, "y", zType);
1352 if( zType[0]=='c' ){
1353 zEType = "checkin";
1354 }else if( zType[0]=='w' ){
1355 zEType = "wiki edit";
@@ -1356,64 +1360,64 @@
1360 }else if( zType[0]=='g' ){
1361 zEType = "tag";
1362 }
1363 }
1364 if( zUser ){
1365 blob_append_sql(&sql, " AND (event.user=%Q OR event.euser=%Q)",
1366 zUser, zUser);
1367 url_add_parameter(&url, "u", zUser);
1368 zThisUser = zUser;
1369 }
1370 if( zSearch ){
1371 blob_append_sql(&sql,
1372 " AND (event.comment LIKE '%%%q%%' OR event.brief LIKE '%%%q%%')",
1373 zSearch, zSearch);
1374 url_add_parameter(&url, "s", zSearch);
1375 }
1376 rBefore = symbolic_name_to_mtime(zBefore);
1377 rAfter = symbolic_name_to_mtime(zAfter);
1378 rCirca = symbolic_name_to_mtime(zCirca);
1379 if( rAfter>0.0 ){
1380 if( rBefore>0.0 ){
1381 blob_append_sql(&sql,
1382 " AND event.mtime>=%.17g AND event.mtime<=%.17g"
1383 " ORDER BY event.mtime ASC", rAfter-ONE_SECOND, rBefore+ONE_SECOND);
1384 url_add_parameter(&url, "a", zAfter);
1385 url_add_parameter(&url, "b", zBefore);
1386 nEntry = 1000000;
1387 }else{
1388 blob_append_sql(&sql,
1389 " AND event.mtime>=%.17g ORDER BY event.mtime ASC",
1390 rAfter-ONE_SECOND);
1391 url_add_parameter(&url, "a", zAfter);
1392 }
1393 }else if( rBefore>0.0 ){
1394 blob_append_sql(&sql,
1395 " AND event.mtime<=%.17g ORDER BY event.mtime DESC",
1396 rBefore+ONE_SECOND);
1397 url_add_parameter(&url, "b", zBefore);
1398 }else if( rCirca>0.0 ){
1399 Blob sql2;
1400 blob_init(&sql2, blob_sql_text(&sql), -1);
1401 blob_append_sql(&sql2,
1402 " AND event.mtime<=%f ORDER BY event.mtime DESC LIMIT %d",
1403 rCirca, (nEntry+1)/2
1404 );
1405 db_multi_exec("%s", blob_sql_text(&sql2));
1406 blob_reset(&sql2);
1407 blob_append_sql(&sql,
1408 " AND event.mtime>=%f ORDER BY event.mtime ASC",
1409 rCirca
1410 );
1411 nEntry -= (nEntry+1)/2;
1412 if( useDividers ) timeline_add_dividers(rCirca, 0);
1413 url_add_parameter(&url, "c", zCirca);
1414 }else{
1415 blob_append_sql(&sql, " ORDER BY event.mtime DESC");
1416 }
1417 blob_append_sql(&sql, " LIMIT %d", nEntry);
1418 db_multi_exec("%s", blob_sql_text(&sql));
1419
1420 n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
1421 if( zYearMonth ){
1422 blob_appendf(&desc, "%s events for %h", zEType, zYearMonth);
1423 }else if( zYearWeek ){
@@ -1506,11 +1510,11 @@
1510 }
1511 }
1512 }
1513 }
1514 if( P("showsql") ){
1515 @ <blockquote>%h(blob_sql_text(&sql))</blockquote>
1516 }
1517 blob_zero(&sql);
1518 db_prepare(&q, "SELECT * FROM timeline ORDER BY sortby DESC /*scan*/");
1519 @ <h2>%b(&desc)</h2>
1520 blob_reset(&desc);
@@ -1655,11 +1659,10 @@
1659 /*
1660 ** Return a pointer to a static string that forms the basis for
1661 ** a timeline query for display on a TTY.
1662 */
1663 const char *timeline_query_for_tty(void){
 
1664 static const char zBaseSql[] =
1665 @ SELECT
1666 @ blob.rid AS rid,
1667 @ uuid,
1668 @ datetime(event.mtime%s) AS mDateTime,
@@ -1675,20 +1678,17 @@
1678 @ AS primPlinkCount,
1679 @ (SELECT count(*) FROM plink WHERE cid=blob.rid) AS plinkCount,
1680 @ event.mtime AS mtime,
1681 @ tagxref.value AS branch
1682 @ FROM tag CROSS JOIN event CROSS JOIN blob
1683 @ LEFT JOIN tagxref ON tagxref.tagid=tag.tagid
1684 @ AND tagxref.tagtype>0
1685 @ AND tagxref.rid=blob.rid
1686 @ WHERE blob.rid=event.objid
1687 @ AND tag.tagname='branch'
1688 ;
1689 return mprintf(zBaseSql /*works-like: "%s"*/, timeline_utc());
 
 
 
1690 }
1691
1692 /*
1693 ** Return true if the input string is a date in the ISO 8601 format:
1694 ** YYYY-MM-DD.
@@ -1739,11 +1739,11 @@
1739 ** -R REPO_FILE Specifies the repository db to use. Default is
1740 ** the current checkout's repository.
1741 */
1742 void timeline_cmd(void){
1743 Stmt q;
1744 int n, k, width, i;
1745 const char *zLimit;
1746 const char *zWidth;
1747 const char *zOffset;
1748 const char *zType;
1749 char *zOrigin;
@@ -1752,10 +1752,12 @@
1752 int objid = 0;
1753 Blob uuid;
1754 int mode = 0 ; /* 0:none 1: before 2:after 3:children 4:parents */
1755 int verboseFlag = 0 ;
1756 int iOffset;
1757 const char *zFilePattern = 0;
1758 Blob treeName;
1759
1760 verboseFlag = find_option("verbose","v", 0)!=0;
1761 if( !verboseFlag){
1762 verboseFlag = find_option("showfiles","f", 0)!=0; /* deprecated */
1763 }
@@ -1783,37 +1785,39 @@
1785 iOffset = zOffset ? atoi(zOffset) : 0;
1786
1787 /* We should be done with options.. */
1788 verify_all_options();
1789
1790 zOrigin = "now";
1791 zFilePattern = 0;
1792 for(i=2; i<g.argc; i++){
1793 char *zArg = g.argv[i];
1794 k = strlen(zArg);
1795 if( mode==0 ){
1796 if( strncmp(zArg,"before",k)==0 ){
1797 mode = 1;
1798 }else if( strncmp(zArg,"after",k)==0 && k>1 ){
1799 mode = 2;
1800 }else if( strncmp(zArg,"descendants",k)==0 ){
1801 mode = 3;
1802 }else if( strncmp(zArg,"children",k)==0 ){
1803 mode = 3;
1804 }else if( strncmp(zArg,"ancestors",k)==0 && k>1 ){
1805 mode = 4;
1806 }else if( strncmp(zArg,"parents",k)==0 ){
1807 mode = 4;
1808 }
1809 if( mode ){
1810 if( i<g.argc-1 ) zOrigin = g.argv[++i];
1811 continue;
1812 }
1813 }
1814 if( zFilePattern==0 ){
1815 zFilePattern = zArg;
1816 }else{
1817 usage("?WHEN? ?CHECKIN|DATETIME? ?FILE? ?OPTIONS?");
1818 }
1819 }
1820 k = strlen(zOrigin);
1821 blob_zero(&uuid);
1822 blob_append(&uuid, zOrigin, -1);
1823 if( fossil_strcmp(zOrigin, "now")==0 ){
@@ -1838,37 +1842,72 @@
1842 if( mode==0 ){
1843 if( isIsoDate(zOrigin) ) zShift = ",'+1 day'";
1844 }
1845 zDate = mprintf("(SELECT julianday(%Q%s, 'utc'))", zOrigin, zShift);
1846 }
1847
1848 if( zFilePattern ){
1849 if( zType==0 ){
1850 /* When zFilePattern is specified and type is not specified, only show
1851 * file checkins */
1852 zType="ci";
1853 }
1854 file_tree_name(zFilePattern, &treeName, 1);
1855 if( fossil_strcmp(blob_str(&treeName), ".")==0 ){
1856 /* When zTreeName refers to g.zLocalRoot, it's like not specifying
1857 * zFilePattern. */
1858 zFilePattern = 0;
1859 }
1860 }
1861
1862 if( mode==0 ) mode = 1;
1863 blob_zero(&sql);
1864 blob_append(&sql, timeline_query_for_tty(), -1);
1865 blob_append_sql(&sql, " AND event.mtime %s %s",
1866 (mode==1 || mode==4) ? "<=" : ">=",
1867 zDate /*safe-for-%s*/
1868 );
1869
1870 if( mode==3 || mode==4 ){
1871 db_multi_exec("CREATE TEMP TABLE ok(rid INTEGER PRIMARY KEY)");
1872 if( mode==3 ){
1873 compute_descendants(objid, n);
1874 }else{
1875 compute_ancestors(objid, n, 0);
1876 }
1877 blob_append_sql(&sql, "\n AND blob.rid IN ok");
1878 }
1879 if( zType && (zType[0]!='a') ){
1880 blob_append_sql(&sql, "\n AND event.type=%Q ", zType);
1881 }
1882 if( zFilePattern ){
1883 blob_append(&sql,
1884 "\n AND EXISTS(SELECT 1 FROM mlink\n"
1885 " WHERE mlink.mid=event.objid\n"
1886 " AND mlink.fnid IN ", -1);
1887 if( filenames_are_case_sensitive() ){
1888 blob_append_sql(&sql,
1889 "(SELECT fnid FROM filename"
1890 " WHERE name=%Q"
1891 " OR name GLOB '%q/*')",
1892 blob_str(&treeName), blob_str(&treeName));
1893 }else{
1894 blob_append_sql(&sql,
1895 "(SELECT fnid FROM filename"
1896 " WHERE name=%Q COLLATE nocase"
1897 " OR lower(name) GLOB lower('%q/*'))",
1898 blob_str(&treeName), blob_str(&treeName));
1899 }
1900 blob_append(&sql, ")", -1);
1901 }
1902 blob_append_sql(&sql, "\nORDER BY event.mtime DESC");
1903 if( iOffset>0 ){
1904 /* Don't handle LIMIT here, otherwise print_timeline()
1905 * will not determine the end-marker correctly! */
1906 blob_append_sql(&sql, "\n LIMIT -1 OFFSET %d", iOffset);
1907 }
1908 db_prepare(&q, "%s", blob_sql_text(&sql));
1909 blob_reset(&sql);
1910 print_timeline(&q, n, width, verboseFlag);
1911 db_finalize(&q);
1912 }
1913
@@ -2178,24 +2217,24 @@
2217 stats_report_init_view();
2218 stats_report_event_types_menu( includeMonth ? "bymonth" : "byyear", NULL );
2219 blob_appendf(&header, "Timeline Events (%s) by year%s",
2220 stats_report_label_for_type(),
2221 (includeMonth ? "/month" : ""));
2222 blob_append_sql(&sql,
2223 "SELECT substr(date(mtime),1,%d) AS timeframe, "
2224 "count(*) AS eventCount "
2225 "FROM v_reports ",
2226 includeMonth ? 7 : 4);
2227 if(zUserName&&*zUserName){
2228 blob_append_sql(&sql, " WHERE user=%Q ", zUserName);
2229 blob_appendf(&header," for user %q", zUserName);
2230 }
2231 blob_append(&sql,
2232 " GROUP BY timeframe"
2233 " ORDER BY timeframe DESC",
2234 -1);
2235 db_prepare(&query, "%s", blob_sql_text(&sql));
2236 blob_reset(&sql);
2237 @ <h1>%b(&header)</h1>
2238 @ <table class='statistics-report-table-events' border='0' cellpadding='2'
2239 @ cellspacing='0' id='statsTable'>
2240 @ <thead>
@@ -2321,23 +2360,19 @@
2360 Stmt query = empty_Stmt;
2361 int nRowNumber = 0; /* current TR number */
2362 int nEventTotal = 0; /* Total event count */
2363 int rowClass = 0; /* counter for alternating
2364 row colors */
 
2365 int nMaxEvents = 1; /* max number of events for
2366 all rows. */
2367 stats_report_init_view();
2368 stats_report_event_types_menu("byuser", NULL);
2369 db_prepare(&query,
2370 "SELECT user, "
2371 "COUNT(*) AS eventCount "
2372 "FROM v_reports "
2373 "GROUP BY user ORDER BY eventCount DESC");
 
 
 
2374 @ <h1>Timeline Events
2375 @ (%s(stats_report_label_for_type())) by User</h1>
2376 @ <table class='statistics-report-table-events' border='0'
2377 @ cellpadding='2' cellspacing='0' id='statsTable'>
2378 @ <thead><tr>
@@ -2388,28 +2423,24 @@
2423 Stmt query = empty_Stmt;
2424 int nRowNumber = 0; /* current TR number */
2425 int nEventTotal = 0; /* Total event count */
2426 int rowClass = 0; /* counter for alternating
2427 row colors */
 
2428 int nMaxEvents = 1; /* max number of events for
2429 all rows. */
2430 static const char *const daysOfWeek[] = {
2431 "Monday", "Tuesday", "Wednesday", "Thursday",
2432 "Friday", "Saturday", "Sunday"
2433 };
2434
2435 stats_report_init_view();
2436 stats_report_event_types_menu("byweekday", NULL);
2437 db_prepare(&query,
2438 "SELECT cast(mtime %% 7 AS INTEGER) dow, "
2439 "COUNT(*) AS eventCount "
2440 "FROM v_reports "
2441 "GROUP BY dow ORDER BY dow");
 
 
 
2442 @ <h1>Timeline Events
2443 @ (%s(stats_report_label_for_type())) by Day of the Week</h1>
2444 @ <table class='statistics-report-table-events' border='0'
2445 @ cellpadding='2' cellspacing='0' id='statsTable'>
2446 @ <thead><tr>
@@ -2477,14 +2508,14 @@
2508 }
2509 blob_append(&sql,
2510 "SELECT DISTINCT substr(date(mtime),1,4) AS y "
2511 "FROM v_reports WHERE 1 ", -1);
2512 if(zUserName&&*zUserName){
2513 blob_append_sql(&sql,"AND user=%Q ", zUserName);
2514 }
2515 blob_append(&sql,"GROUP BY y ORDER BY y", -1);
2516 db_prepare(&qYears, "%s", blob_sql_text(&sql));
2517 blob_reset(&sql);
2518 cgi_printf("Select year: ");
2519 while( SQLITE_ROW == db_step(&qYears) ){
2520 const char *zT = db_column_text(&qYears, 0);
2521 if( i++ ){
@@ -2510,22 +2541,22 @@
2541 int total = 0;
2542 Blob header = empty_blob;
2543 blob_appendf(&header, "Timeline events (%s) for the calendar weeks "
2544 "of %h", stats_report_label_for_type(),
2545 zYear);
2546 blob_append_sql(&sql,
2547 "SELECT DISTINCT strftime('%%%%W',mtime) AS wk, "
2548 "count(*) AS n "
2549 "FROM v_reports "
2550 "WHERE %Q=substr(date(mtime),1,4) "
2551 "AND mtime < current_timestamp ",
2552 zYear);
2553 if(zUserName&&*zUserName){
2554 blob_append_sql(&sql, " AND user=%Q ", zUserName);
2555 blob_appendf(&header," for user %h", zUserName);
2556 }
2557 blob_append_sql(&sql, "GROUP BY wk ORDER BY wk DESC");
2558 cgi_printf("<h1>%h</h1>", blob_str(&header));
2559 blob_reset(&header);
2560 cgi_printf("<table class='statistics-report-table-events' "
2561 "border='0' cellpadding='2' width='100%%' "
2562 "cellspacing='0' id='statsTable'>");
@@ -2533,11 +2564,11 @@
2564 "<th>Week</th>"
2565 "<th>Events</th>"
2566 "<th width='90%%'><!-- relative commits graph --></th>"
2567 "</tr></thead>"
2568 "<tbody>");
2569 db_prepare(&stWeek, "%s", blob_sql_text(&sql));
2570 blob_reset(&sql);
2571 while( SQLITE_ROW == db_step(&stWeek) ){
2572 const int nCount = db_column_int(&stWeek, 1);
2573 if(nCount>nMaxEvents){
2574 nMaxEvents = nCount;
2575
+21 -23
--- src/tkt.c
+++ src/tkt.c
@@ -203,13 +203,13 @@
203203
tktid = db_last_insert_rowid();
204204
}
205205
blob_zero(&sql1);
206206
blob_zero(&sql2);
207207
blob_zero(&sql3);
208
- blob_appendf(&sql1, "UPDATE OR REPLACE ticket SET tkt_mtime=:mtime");
208
+ blob_append_sql(&sql1, "UPDATE OR REPLACE ticket SET tkt_mtime=:mtime");
209209
if( haveTicketCTime ){
210
- blob_appendf(&sql1, ", tkt_ctime=coalesce(tkt_ctime,:mtime)");
210
+ blob_append_sql(&sql1, ", tkt_ctime=coalesce(tkt_ctime,:mtime)");
211211
}
212212
aUsed = fossil_malloc( nField );
213213
memset(aUsed, 0, nField);
214214
for(i=0; i<p->nField; i++){
215215
const char *zName = p->aField[i].zName;
@@ -218,55 +218,56 @@
218218
if( j<0 ) continue;
219219
aUsed[j] = 1;
220220
if( aField[j].mUsed & USEDBY_TICKET ){
221221
if( zName[0]=='+' ){
222222
zName++;
223
- blob_appendf(&sql1,", %s=coalesce(%s,'') || %Q",
223
+ blob_append_sql(&sql1,", \"%w\"=coalesce(\"%w\",'') || %Q",
224224
zName, zName, p->aField[i].zValue);
225225
}else{
226
- blob_appendf(&sql1,", %s=%Q", zName, p->aField[i].zValue);
226
+ blob_append_sql(&sql1,", \"%w\"=%Q", zName, p->aField[i].zValue);
227227
}
228228
}
229229
if( aField[j].mUsed & USEDBY_TICKETCHNG ){
230
- blob_appendf(&sql2, ",%s", zName);
231
- blob_appendf(&sql3, ",%Q", p->aField[i].zValue);
230
+ blob_append_sql(&sql2, ",\"%w\"", zName);
231
+ blob_append_sql(&sql3, ",%Q", p->aField[i].zValue);
232232
}
233233
if( rid>0 ){
234234
wiki_extract_links(p->aField[i].zValue, rid, 1, p->rDate, i==0, 0);
235235
}
236236
}
237
- blob_appendf(&sql1, " WHERE tkt_id=%d", tktid);
238
- db_prepare(&q, "%s", blob_str(&sql1));
237
+ blob_append_sql(&sql1, " WHERE tkt_id=%d", tktid);
238
+ db_prepare(&q, "%s", blob_sql_text(&sql1));
239239
db_bind_double(&q, ":mtime", p->rDate);
240240
db_step(&q);
241241
db_finalize(&q);
242242
blob_reset(&sql1);
243243
if( blob_size(&sql2)>0 || haveTicketChngRid ){
244244
int fromTkt = 0;
245245
if( haveTicketChngRid ){
246246
blob_append(&sql2, ",tkt_rid", -1);
247
- blob_appendf(&sql3, ",%d", rid);
247
+ blob_append_sql(&sql3, ",%d", rid);
248248
}
249249
for(i=0; i<nField; i++){
250250
if( aUsed[i]==0
251251
&& (aField[i].mUsed & USEDBY_BOTH)==USEDBY_BOTH
252252
){
253253
const char *z = aField[i].zName;
254254
if( z[0]=='+' ) z++;
255255
fromTkt = 1;
256
- blob_appendf(&sql2, ",%s", z);
257
- blob_appendf(&sql3, ",%s", z);
256
+ blob_append_sql(&sql2, ",\"%w\"", z);
257
+ blob_append_sql(&sql3, ",\"%w\"", z);
258258
}
259259
}
260260
if( fromTkt ){
261261
db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
262262
"SELECT %d,:mtime%s FROM ticket WHERE tkt_id=%d",
263
- blob_str(&sql2), tktid, blob_str(&sql3), tktid);
263
+ blob_sql_text(&sql2), tktid,
264
+ blob_sql_text(&sql3), tktid);
264265
}else{
265266
db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
266267
"VALUES(%d,:mtime%s)",
267
- blob_str(&sql2), tktid, blob_str(&sql3));
268
+ blob_sql_text(&sql2), tktid, blob_sql_text(&sql3));
268269
}
269270
db_bind_double(&q, ":mtime", p->rDate);
270271
db_step(&q);
271272
db_finalize(&q);
272273
}
@@ -368,11 +369,11 @@
368369
zSql = ticket_table_schema();
369370
if( separateConnection ){
370371
db_end_transaction(0);
371372
db_init_database(g.zRepositoryName, zSql, 0);
372373
}else{
373
- db_multi_exec("%s", zSql);
374
+ db_multi_exec("%s", zSql/*safe-for-%s*/);
374375
}
375376
}
376377
377378
/*
378379
** Repopulate the TICKET and TICKETCHNG tables from scratch using all
@@ -551,11 +552,11 @@
551552
fossil_fatal("trouble committing ticket: %s", g.zErrMsg);
552553
}
553554
if( needMod ){
554555
moderation_table_create();
555556
db_multi_exec(
556
- "INSERT INTO modreq(objid, tktid) VALUES(%d,'%s')",
557
+ "INSERT INTO modreq(objid, tktid) VALUES(%d,%Q)",
557558
rid, zTktId
558559
);
559560
}else{
560561
db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d);", rid);
561562
db_multi_exec("INSERT OR IGNORE INTO unclustered VALUES(%d);", rid);
@@ -855,12 +856,11 @@
855856
if( zType[0]=='c' ){
856857
zTitle = mprintf("Check-Ins Associated With Ticket %h", zUuid);
857858
}else{
858859
zTitle = mprintf("Timeline Of Ticket %h", zUuid);
859860
}
860
- style_header(zTitle);
861
- free(zTitle);
861
+ style_header("%z", zTitle);
862862
863863
sqlite3_snprintf(6, zGlobPattern, "%s", zUuid);
864864
canonical16(zGlobPattern, strlen(zGlobPattern));
865865
tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",zUuid);
866866
if( tagid==0 ){
@@ -889,12 +889,11 @@
889889
" WHERE target=%Q) "
890890
"ORDER BY mtime DESC",
891891
timeline_query_for_www(), tagid, zFullUuid, zFullUuid, zFullUuid
892892
);
893893
}
894
- db_prepare(&q, zSQL);
895
- free(zSQL);
894
+ db_prepare(&q, "%z", zSQL/*safe-for-%s*/);
896895
www_print_timeline(&q, TIMELINE_ARTID|TIMELINE_DISJOINT|TIMELINE_GRAPH,
897896
0, 0, 0);
898897
db_finalize(&q);
899898
style_footer();
900899
}
@@ -927,12 +926,11 @@
927926
"%R/tkthistory/%s", zUuid);
928927
}else{
929928
style_submenu_element("Plaintext", "Plaintext",
930929
"%R/tkthistory/%s?plaintext", zUuid);
931930
}
932
- style_header(zTitle);
933
- free(zTitle);
931
+ style_header("%z", zTitle);
934932
935933
tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",zUuid);
936934
if( tagid==0 ){
937935
@ No such ticket: %h(zUuid)
938936
style_footer();
@@ -1213,11 +1211,11 @@
12131211
}
12141212
if( g.argc==3 ){
12151213
usage("set|change|history TICKETUUID");
12161214
}
12171215
zTktUuid = db_text(0,
1218
- "SELECT tkt_uuid FROM ticket WHERE tkt_uuid GLOB '%s*'", g.argv[3]
1216
+ "SELECT tkt_uuid FROM ticket WHERE tkt_uuid GLOB '%q*'", g.argv[3]
12191217
);
12201218
if( !zTktUuid ){
12211219
fossil_fatal("unknown ticket: '%s'!",g.argv[3]);
12221220
}
12231221
i=4;
@@ -1292,11 +1290,11 @@
12921290
}else{
12931291
fossil_print(" Change ");
12941292
}
12951293
fossil_print("%h: ",z);
12961294
if( blob_size(&val)>50 || contains_newline(&val)) {
1297
- fossil_print("\n ",blob_str(&val));
1295
+ fossil_print("\n ");
12981296
comment_print(blob_str(&val),0,4,-1,g.comFmtFlags);
12991297
}else{
13001298
fossil_print("%s\n",blob_str(&val));
13011299
}
13021300
blob_reset(&val);
13031301
--- src/tkt.c
+++ src/tkt.c
@@ -203,13 +203,13 @@
203 tktid = db_last_insert_rowid();
204 }
205 blob_zero(&sql1);
206 blob_zero(&sql2);
207 blob_zero(&sql3);
208 blob_appendf(&sql1, "UPDATE OR REPLACE ticket SET tkt_mtime=:mtime");
209 if( haveTicketCTime ){
210 blob_appendf(&sql1, ", tkt_ctime=coalesce(tkt_ctime,:mtime)");
211 }
212 aUsed = fossil_malloc( nField );
213 memset(aUsed, 0, nField);
214 for(i=0; i<p->nField; i++){
215 const char *zName = p->aField[i].zName;
@@ -218,55 +218,56 @@
218 if( j<0 ) continue;
219 aUsed[j] = 1;
220 if( aField[j].mUsed & USEDBY_TICKET ){
221 if( zName[0]=='+' ){
222 zName++;
223 blob_appendf(&sql1,", %s=coalesce(%s,'') || %Q",
224 zName, zName, p->aField[i].zValue);
225 }else{
226 blob_appendf(&sql1,", %s=%Q", zName, p->aField[i].zValue);
227 }
228 }
229 if( aField[j].mUsed & USEDBY_TICKETCHNG ){
230 blob_appendf(&sql2, ",%s", zName);
231 blob_appendf(&sql3, ",%Q", p->aField[i].zValue);
232 }
233 if( rid>0 ){
234 wiki_extract_links(p->aField[i].zValue, rid, 1, p->rDate, i==0, 0);
235 }
236 }
237 blob_appendf(&sql1, " WHERE tkt_id=%d", tktid);
238 db_prepare(&q, "%s", blob_str(&sql1));
239 db_bind_double(&q, ":mtime", p->rDate);
240 db_step(&q);
241 db_finalize(&q);
242 blob_reset(&sql1);
243 if( blob_size(&sql2)>0 || haveTicketChngRid ){
244 int fromTkt = 0;
245 if( haveTicketChngRid ){
246 blob_append(&sql2, ",tkt_rid", -1);
247 blob_appendf(&sql3, ",%d", rid);
248 }
249 for(i=0; i<nField; i++){
250 if( aUsed[i]==0
251 && (aField[i].mUsed & USEDBY_BOTH)==USEDBY_BOTH
252 ){
253 const char *z = aField[i].zName;
254 if( z[0]=='+' ) z++;
255 fromTkt = 1;
256 blob_appendf(&sql2, ",%s", z);
257 blob_appendf(&sql3, ",%s", z);
258 }
259 }
260 if( fromTkt ){
261 db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
262 "SELECT %d,:mtime%s FROM ticket WHERE tkt_id=%d",
263 blob_str(&sql2), tktid, blob_str(&sql3), tktid);
 
264 }else{
265 db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
266 "VALUES(%d,:mtime%s)",
267 blob_str(&sql2), tktid, blob_str(&sql3));
268 }
269 db_bind_double(&q, ":mtime", p->rDate);
270 db_step(&q);
271 db_finalize(&q);
272 }
@@ -368,11 +369,11 @@
368 zSql = ticket_table_schema();
369 if( separateConnection ){
370 db_end_transaction(0);
371 db_init_database(g.zRepositoryName, zSql, 0);
372 }else{
373 db_multi_exec("%s", zSql);
374 }
375 }
376
377 /*
378 ** Repopulate the TICKET and TICKETCHNG tables from scratch using all
@@ -551,11 +552,11 @@
551 fossil_fatal("trouble committing ticket: %s", g.zErrMsg);
552 }
553 if( needMod ){
554 moderation_table_create();
555 db_multi_exec(
556 "INSERT INTO modreq(objid, tktid) VALUES(%d,'%s')",
557 rid, zTktId
558 );
559 }else{
560 db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d);", rid);
561 db_multi_exec("INSERT OR IGNORE INTO unclustered VALUES(%d);", rid);
@@ -855,12 +856,11 @@
855 if( zType[0]=='c' ){
856 zTitle = mprintf("Check-Ins Associated With Ticket %h", zUuid);
857 }else{
858 zTitle = mprintf("Timeline Of Ticket %h", zUuid);
859 }
860 style_header(zTitle);
861 free(zTitle);
862
863 sqlite3_snprintf(6, zGlobPattern, "%s", zUuid);
864 canonical16(zGlobPattern, strlen(zGlobPattern));
865 tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",zUuid);
866 if( tagid==0 ){
@@ -889,12 +889,11 @@
889 " WHERE target=%Q) "
890 "ORDER BY mtime DESC",
891 timeline_query_for_www(), tagid, zFullUuid, zFullUuid, zFullUuid
892 );
893 }
894 db_prepare(&q, zSQL);
895 free(zSQL);
896 www_print_timeline(&q, TIMELINE_ARTID|TIMELINE_DISJOINT|TIMELINE_GRAPH,
897 0, 0, 0);
898 db_finalize(&q);
899 style_footer();
900 }
@@ -927,12 +926,11 @@
927 "%R/tkthistory/%s", zUuid);
928 }else{
929 style_submenu_element("Plaintext", "Plaintext",
930 "%R/tkthistory/%s?plaintext", zUuid);
931 }
932 style_header(zTitle);
933 free(zTitle);
934
935 tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",zUuid);
936 if( tagid==0 ){
937 @ No such ticket: %h(zUuid)
938 style_footer();
@@ -1213,11 +1211,11 @@
1213 }
1214 if( g.argc==3 ){
1215 usage("set|change|history TICKETUUID");
1216 }
1217 zTktUuid = db_text(0,
1218 "SELECT tkt_uuid FROM ticket WHERE tkt_uuid GLOB '%s*'", g.argv[3]
1219 );
1220 if( !zTktUuid ){
1221 fossil_fatal("unknown ticket: '%s'!",g.argv[3]);
1222 }
1223 i=4;
@@ -1292,11 +1290,11 @@
1292 }else{
1293 fossil_print(" Change ");
1294 }
1295 fossil_print("%h: ",z);
1296 if( blob_size(&val)>50 || contains_newline(&val)) {
1297 fossil_print("\n ",blob_str(&val));
1298 comment_print(blob_str(&val),0,4,-1,g.comFmtFlags);
1299 }else{
1300 fossil_print("%s\n",blob_str(&val));
1301 }
1302 blob_reset(&val);
1303
--- src/tkt.c
+++ src/tkt.c
@@ -203,13 +203,13 @@
203 tktid = db_last_insert_rowid();
204 }
205 blob_zero(&sql1);
206 blob_zero(&sql2);
207 blob_zero(&sql3);
208 blob_append_sql(&sql1, "UPDATE OR REPLACE ticket SET tkt_mtime=:mtime");
209 if( haveTicketCTime ){
210 blob_append_sql(&sql1, ", tkt_ctime=coalesce(tkt_ctime,:mtime)");
211 }
212 aUsed = fossil_malloc( nField );
213 memset(aUsed, 0, nField);
214 for(i=0; i<p->nField; i++){
215 const char *zName = p->aField[i].zName;
@@ -218,55 +218,56 @@
218 if( j<0 ) continue;
219 aUsed[j] = 1;
220 if( aField[j].mUsed & USEDBY_TICKET ){
221 if( zName[0]=='+' ){
222 zName++;
223 blob_append_sql(&sql1,", \"%w\"=coalesce(\"%w\",'') || %Q",
224 zName, zName, p->aField[i].zValue);
225 }else{
226 blob_append_sql(&sql1,", \"%w\"=%Q", zName, p->aField[i].zValue);
227 }
228 }
229 if( aField[j].mUsed & USEDBY_TICKETCHNG ){
230 blob_append_sql(&sql2, ",\"%w\"", zName);
231 blob_append_sql(&sql3, ",%Q", p->aField[i].zValue);
232 }
233 if( rid>0 ){
234 wiki_extract_links(p->aField[i].zValue, rid, 1, p->rDate, i==0, 0);
235 }
236 }
237 blob_append_sql(&sql1, " WHERE tkt_id=%d", tktid);
238 db_prepare(&q, "%s", blob_sql_text(&sql1));
239 db_bind_double(&q, ":mtime", p->rDate);
240 db_step(&q);
241 db_finalize(&q);
242 blob_reset(&sql1);
243 if( blob_size(&sql2)>0 || haveTicketChngRid ){
244 int fromTkt = 0;
245 if( haveTicketChngRid ){
246 blob_append(&sql2, ",tkt_rid", -1);
247 blob_append_sql(&sql3, ",%d", rid);
248 }
249 for(i=0; i<nField; i++){
250 if( aUsed[i]==0
251 && (aField[i].mUsed & USEDBY_BOTH)==USEDBY_BOTH
252 ){
253 const char *z = aField[i].zName;
254 if( z[0]=='+' ) z++;
255 fromTkt = 1;
256 blob_append_sql(&sql2, ",\"%w\"", z);
257 blob_append_sql(&sql3, ",\"%w\"", z);
258 }
259 }
260 if( fromTkt ){
261 db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
262 "SELECT %d,:mtime%s FROM ticket WHERE tkt_id=%d",
263 blob_sql_text(&sql2), tktid,
264 blob_sql_text(&sql3), tktid);
265 }else{
266 db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
267 "VALUES(%d,:mtime%s)",
268 blob_sql_text(&sql2), tktid, blob_sql_text(&sql3));
269 }
270 db_bind_double(&q, ":mtime", p->rDate);
271 db_step(&q);
272 db_finalize(&q);
273 }
@@ -368,11 +369,11 @@
369 zSql = ticket_table_schema();
370 if( separateConnection ){
371 db_end_transaction(0);
372 db_init_database(g.zRepositoryName, zSql, 0);
373 }else{
374 db_multi_exec("%s", zSql/*safe-for-%s*/);
375 }
376 }
377
378 /*
379 ** Repopulate the TICKET and TICKETCHNG tables from scratch using all
@@ -551,11 +552,11 @@
552 fossil_fatal("trouble committing ticket: %s", g.zErrMsg);
553 }
554 if( needMod ){
555 moderation_table_create();
556 db_multi_exec(
557 "INSERT INTO modreq(objid, tktid) VALUES(%d,%Q)",
558 rid, zTktId
559 );
560 }else{
561 db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d);", rid);
562 db_multi_exec("INSERT OR IGNORE INTO unclustered VALUES(%d);", rid);
@@ -855,12 +856,11 @@
856 if( zType[0]=='c' ){
857 zTitle = mprintf("Check-Ins Associated With Ticket %h", zUuid);
858 }else{
859 zTitle = mprintf("Timeline Of Ticket %h", zUuid);
860 }
861 style_header("%z", zTitle);
 
862
863 sqlite3_snprintf(6, zGlobPattern, "%s", zUuid);
864 canonical16(zGlobPattern, strlen(zGlobPattern));
865 tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",zUuid);
866 if( tagid==0 ){
@@ -889,12 +889,11 @@
889 " WHERE target=%Q) "
890 "ORDER BY mtime DESC",
891 timeline_query_for_www(), tagid, zFullUuid, zFullUuid, zFullUuid
892 );
893 }
894 db_prepare(&q, "%z", zSQL/*safe-for-%s*/);
 
895 www_print_timeline(&q, TIMELINE_ARTID|TIMELINE_DISJOINT|TIMELINE_GRAPH,
896 0, 0, 0);
897 db_finalize(&q);
898 style_footer();
899 }
@@ -927,12 +926,11 @@
926 "%R/tkthistory/%s", zUuid);
927 }else{
928 style_submenu_element("Plaintext", "Plaintext",
929 "%R/tkthistory/%s?plaintext", zUuid);
930 }
931 style_header("%z", zTitle);
 
932
933 tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",zUuid);
934 if( tagid==0 ){
935 @ No such ticket: %h(zUuid)
936 style_footer();
@@ -1213,11 +1211,11 @@
1211 }
1212 if( g.argc==3 ){
1213 usage("set|change|history TICKETUUID");
1214 }
1215 zTktUuid = db_text(0,
1216 "SELECT tkt_uuid FROM ticket WHERE tkt_uuid GLOB '%q*'", g.argv[3]
1217 );
1218 if( !zTktUuid ){
1219 fossil_fatal("unknown ticket: '%s'!",g.argv[3]);
1220 }
1221 i=4;
@@ -1292,11 +1290,11 @@
1290 }else{
1291 fossil_print(" Change ");
1292 }
1293 fossil_print("%h: ",z);
1294 if( blob_size(&val)>50 || contains_newline(&val)) {
1295 fossil_print("\n ");
1296 comment_print(blob_str(&val),0,4,-1,g.comFmtFlags);
1297 }else{
1298 fossil_print("%s\n",blob_str(&val));
1299 }
1300 blob_reset(&val);
1301
+7 -7
--- src/translate.c
+++ src/translate.c
@@ -13,11 +13,11 @@
1313
** [email protected]
1414
** http://www.hwaci.com/drh/
1515
**
1616
*******************************************************************************
1717
**
18
-** SYNOPSIS:
18
+** SYNOPSIS:
1919
**
2020
** Input lines that begin with the "@" character are translated into
2121
** either cgi_printf() statements or string literals and the
2222
** translated code is written on standard output.
2323
**
@@ -34,22 +34,22 @@
3434
** punctuation.
3535
**
3636
** Enhancement #1:
3737
**
3838
** If the last non-whitespace character prior to the first "@" of a
39
-** @-block is "=" or "," then the @-block is a string literal initializer
39
+** @-block is "=" or "," then the @-block is a string literal initializer
4040
** rather than text that is to be output via cgi_printf(). Render it
4141
** as such.
4242
**
4343
** Enhancement #2:
4444
**
45
-** Comments of the form: "/* @-comment: CC" cause CC to become a
45
+** Comments of the form: "/* @-comment: CC" cause CC to become a
4646
** comment character for the @-substitution. Typical values for CC are
4747
** "--" (for SQL text) or "#" (for TCL script) or "//" (for C++ code).
4848
** Lines of subsequent @-blocks that begin with CC are omitted from the
4949
** output.
50
-**
50
+**
5151
*/
5252
#include <stdio.h>
5353
#include <ctype.h>
5454
#include <stdlib.h>
5555
#include <string.h>
@@ -122,11 +122,11 @@
122122
indent = i - 2;
123123
if( indent<0 ) indent = 0;
124124
omitline = 0;
125125
for(j=0; zLine[i] && zLine[i]!='\r' && zLine[i]!='\n'; i++){
126126
if( zLine[i]==c1 && (c2==' ' || zLine[i+1]==c2) ){
127
- omitline = 1; break;
127
+ omitline = 1; break;
128128
}
129129
if( zLine[i]=='"' || zLine[i]=='\\' ){ zOut[j++] = '\\'; }
130130
zOut[j++] = zLine[i];
131131
}
132132
while( j>0 && isspace(zOut[j-1]) ){ j--; }
@@ -137,11 +137,11 @@
137137
fprintf(out,"%*s\"%s\\n\"\n",indent, "", zOut);
138138
}
139139
}else{
140140
/* Otherwise (if the last non-whitespace was not '=') then generate
141141
** a cgi_printf() statement whose format is the text following the '@'.
142
- ** Substrings of the form "%C(...)" (where C is any sequence of
142
+ ** Substrings of the form "%C(...)" (where C is any sequence of
143143
** characters other than \000 and '(') will put "%C" in the
144144
** format and add the "(...)" as an argument to the cgi_printf call.
145145
*/
146146
int indent;
147147
int nC;
@@ -174,11 +174,11 @@
174174
fprintf(out,"%*scgi_printf(\"%s\\n\"",indent-2,"", zOut);
175175
inPrint = 1;
176176
}else{
177177
fprintf(out,"\n%*s\"%s\\n\"",indent+5, "", zOut);
178178
}
179
- }
179
+ }
180180
}
181181
}
182182
183183
int main(int argc, char **argv){
184184
if( argc==2 ){
185185
--- src/translate.c
+++ src/translate.c
@@ -13,11 +13,11 @@
13 ** [email protected]
14 ** http://www.hwaci.com/drh/
15 **
16 *******************************************************************************
17 **
18 ** SYNOPSIS:
19 **
20 ** Input lines that begin with the "@" character are translated into
21 ** either cgi_printf() statements or string literals and the
22 ** translated code is written on standard output.
23 **
@@ -34,22 +34,22 @@
34 ** punctuation.
35 **
36 ** Enhancement #1:
37 **
38 ** If the last non-whitespace character prior to the first "@" of a
39 ** @-block is "=" or "," then the @-block is a string literal initializer
40 ** rather than text that is to be output via cgi_printf(). Render it
41 ** as such.
42 **
43 ** Enhancement #2:
44 **
45 ** Comments of the form: "/* @-comment: CC" cause CC to become a
46 ** comment character for the @-substitution. Typical values for CC are
47 ** "--" (for SQL text) or "#" (for TCL script) or "//" (for C++ code).
48 ** Lines of subsequent @-blocks that begin with CC are omitted from the
49 ** output.
50 **
51 */
52 #include <stdio.h>
53 #include <ctype.h>
54 #include <stdlib.h>
55 #include <string.h>
@@ -122,11 +122,11 @@
122 indent = i - 2;
123 if( indent<0 ) indent = 0;
124 omitline = 0;
125 for(j=0; zLine[i] && zLine[i]!='\r' && zLine[i]!='\n'; i++){
126 if( zLine[i]==c1 && (c2==' ' || zLine[i+1]==c2) ){
127 omitline = 1; break;
128 }
129 if( zLine[i]=='"' || zLine[i]=='\\' ){ zOut[j++] = '\\'; }
130 zOut[j++] = zLine[i];
131 }
132 while( j>0 && isspace(zOut[j-1]) ){ j--; }
@@ -137,11 +137,11 @@
137 fprintf(out,"%*s\"%s\\n\"\n",indent, "", zOut);
138 }
139 }else{
140 /* Otherwise (if the last non-whitespace was not '=') then generate
141 ** a cgi_printf() statement whose format is the text following the '@'.
142 ** Substrings of the form "%C(...)" (where C is any sequence of
143 ** characters other than \000 and '(') will put "%C" in the
144 ** format and add the "(...)" as an argument to the cgi_printf call.
145 */
146 int indent;
147 int nC;
@@ -174,11 +174,11 @@
174 fprintf(out,"%*scgi_printf(\"%s\\n\"",indent-2,"", zOut);
175 inPrint = 1;
176 }else{
177 fprintf(out,"\n%*s\"%s\\n\"",indent+5, "", zOut);
178 }
179 }
180 }
181 }
182
183 int main(int argc, char **argv){
184 if( argc==2 ){
185
--- src/translate.c
+++ src/translate.c
@@ -13,11 +13,11 @@
13 ** [email protected]
14 ** http://www.hwaci.com/drh/
15 **
16 *******************************************************************************
17 **
18 ** SYNOPSIS:
19 **
20 ** Input lines that begin with the "@" character are translated into
21 ** either cgi_printf() statements or string literals and the
22 ** translated code is written on standard output.
23 **
@@ -34,22 +34,22 @@
34 ** punctuation.
35 **
36 ** Enhancement #1:
37 **
38 ** If the last non-whitespace character prior to the first "@" of a
39 ** @-block is "=" or "," then the @-block is a string literal initializer
40 ** rather than text that is to be output via cgi_printf(). Render it
41 ** as such.
42 **
43 ** Enhancement #2:
44 **
45 ** Comments of the form: "/* @-comment: CC" cause CC to become a
46 ** comment character for the @-substitution. Typical values for CC are
47 ** "--" (for SQL text) or "#" (for TCL script) or "//" (for C++ code).
48 ** Lines of subsequent @-blocks that begin with CC are omitted from the
49 ** output.
50 **
51 */
52 #include <stdio.h>
53 #include <ctype.h>
54 #include <stdlib.h>
55 #include <string.h>
@@ -122,11 +122,11 @@
122 indent = i - 2;
123 if( indent<0 ) indent = 0;
124 omitline = 0;
125 for(j=0; zLine[i] && zLine[i]!='\r' && zLine[i]!='\n'; i++){
126 if( zLine[i]==c1 && (c2==' ' || zLine[i+1]==c2) ){
127 omitline = 1; break;
128 }
129 if( zLine[i]=='"' || zLine[i]=='\\' ){ zOut[j++] = '\\'; }
130 zOut[j++] = zLine[i];
131 }
132 while( j>0 && isspace(zOut[j-1]) ){ j--; }
@@ -137,11 +137,11 @@
137 fprintf(out,"%*s\"%s\\n\"\n",indent, "", zOut);
138 }
139 }else{
140 /* Otherwise (if the last non-whitespace was not '=') then generate
141 ** a cgi_printf() statement whose format is the text following the '@'.
142 ** Substrings of the form "%C(...)" (where C is any sequence of
143 ** characters other than \000 and '(') will put "%C" in the
144 ** format and add the "(...)" as an argument to the cgi_printf call.
145 */
146 int indent;
147 int nC;
@@ -174,11 +174,11 @@
174 fprintf(out,"%*scgi_printf(\"%s\\n\"",indent-2,"", zOut);
175 inPrint = 1;
176 }else{
177 fprintf(out,"\n%*s\"%s\\n\"",indent+5, "", zOut);
178 }
179 }
180 }
181 }
182
183 int main(int argc, char **argv){
184 if( argc==2 ){
185
+9 -8
--- src/undo.c
+++ src/undo.c
@@ -143,11 +143,12 @@
143143
"INSERT INTO vmerge SELECT * FROM undo_vmerge;"
144144
"DELETE FROM undo_vmerge;"
145145
"INSERT INTO undo_vmerge SELECT * FROM undo_vmerge_2;"
146146
"DROP TABLE undo_vmerge_2;"
147147
);
148
- if(db_exists("SELECT 1 FROM %s.sqlite_master WHERE name='undo_stash'", zDb) ){
148
+ if(db_exists("SELECT 1 FROM \"%w\".sqlite_master"
149
+ " WHERE name='undo_stash'", zDb) ){
149150
if( redoFlag ){
150151
db_multi_exec(
151152
"DELETE FROM stash WHERE stashid IN (SELECT stashid FROM undo_stash);"
152153
"DELETE FROM stashfile"
153154
" WHERE stashid NOT IN (SELECT stashid FROM stash);"
@@ -174,11 +175,11 @@
174175
@ DROP TABLE IF EXISTS undo_vfile;
175176
@ DROP TABLE IF EXISTS undo_vmerge;
176177
@ DROP TABLE IF EXISTS undo_stash;
177178
@ DROP TABLE IF EXISTS undo_stashfile;
178179
;
179
- db_multi_exec(zSql);
180
+ db_multi_exec(zSql /*works-like:""*/);
180181
db_lset_int("undo_available", 0);
181182
db_lset_int("undo_checkout", 0);
182183
}
183184
184185
/*
@@ -219,24 +220,24 @@
219220
*/
220221
void undo_begin(void){
221222
int cid;
222223
const char *zDb = db_name("localdb");
223224
static const char zSql[] =
224
- @ CREATE TABLE %s.undo(
225
+ @ CREATE TABLE "%w".undo(
225226
@ pathname TEXT UNIQUE, -- Name of the file
226227
@ redoflag BOOLEAN, -- 0 for undoable. 1 for redoable
227228
@ existsflag BOOLEAN, -- True if the file exists
228229
@ isExe BOOLEAN, -- True if the file is executable
229230
@ isLink BOOLEAN, -- True if the file is symlink
230231
@ content BLOB -- Saved content
231232
@ );
232
- @ CREATE TABLE %s.undo_vfile AS SELECT * FROM vfile;
233
- @ CREATE TABLE %s.undo_vmerge AS SELECT * FROM vmerge;
233
+ @ CREATE TABLE "%w".undo_vfile AS SELECT * FROM vfile;
234
+ @ CREATE TABLE "%w".undo_vmerge AS SELECT * FROM vmerge;
234235
;
235236
if( undoDisable ) return;
236237
undo_reset();
237
- db_multi_exec(zSql, zDb, zDb, zDb);
238
+ db_multi_exec(zSql/*works-like:"%w,%w,%w"*/, zDb, zDb, zDb);
238239
cid = db_lget_int("checkout", 0);
239240
db_lset_int("undo_checkout", cid);
240241
db_lset_int("undo_available", 1);
241242
db_lset("undo_cmdline", undoCmd);
242243
undoActive = 1;
@@ -301,18 +302,18 @@
301302
** Make the current state of stashid undoable.
302303
*/
303304
void undo_save_stash(int stashid){
304305
const char *zDb = db_name("localdb");
305306
db_multi_exec(
306
- "CREATE TABLE IF NOT EXISTS %s.undo_stash"
307
+ "CREATE TABLE IF NOT EXISTS \"%w\".undo_stash"
307308
" AS SELECT * FROM stash WHERE 0;"
308309
"INSERT INTO undo_stash"
309310
" SELECT * FROM stash WHERE stashid=%d;",
310311
zDb, stashid
311312
);
312313
db_multi_exec(
313
- "CREATE TABLE IF NOT EXISTS %s.undo_stashfile"
314
+ "CREATE TABLE IF NOT EXISTS \"%w\".undo_stashfile"
314315
" AS SELECT * FROM stashfile WHERE 0;"
315316
"INSERT INTO undo_stashfile"
316317
" SELECT * FROM stashfile WHERE stashid=%d;",
317318
zDb, stashid
318319
);
319320
--- src/undo.c
+++ src/undo.c
@@ -143,11 +143,12 @@
143 "INSERT INTO vmerge SELECT * FROM undo_vmerge;"
144 "DELETE FROM undo_vmerge;"
145 "INSERT INTO undo_vmerge SELECT * FROM undo_vmerge_2;"
146 "DROP TABLE undo_vmerge_2;"
147 );
148 if(db_exists("SELECT 1 FROM %s.sqlite_master WHERE name='undo_stash'", zDb) ){
 
149 if( redoFlag ){
150 db_multi_exec(
151 "DELETE FROM stash WHERE stashid IN (SELECT stashid FROM undo_stash);"
152 "DELETE FROM stashfile"
153 " WHERE stashid NOT IN (SELECT stashid FROM stash);"
@@ -174,11 +175,11 @@
174 @ DROP TABLE IF EXISTS undo_vfile;
175 @ DROP TABLE IF EXISTS undo_vmerge;
176 @ DROP TABLE IF EXISTS undo_stash;
177 @ DROP TABLE IF EXISTS undo_stashfile;
178 ;
179 db_multi_exec(zSql);
180 db_lset_int("undo_available", 0);
181 db_lset_int("undo_checkout", 0);
182 }
183
184 /*
@@ -219,24 +220,24 @@
219 */
220 void undo_begin(void){
221 int cid;
222 const char *zDb = db_name("localdb");
223 static const char zSql[] =
224 @ CREATE TABLE %s.undo(
225 @ pathname TEXT UNIQUE, -- Name of the file
226 @ redoflag BOOLEAN, -- 0 for undoable. 1 for redoable
227 @ existsflag BOOLEAN, -- True if the file exists
228 @ isExe BOOLEAN, -- True if the file is executable
229 @ isLink BOOLEAN, -- True if the file is symlink
230 @ content BLOB -- Saved content
231 @ );
232 @ CREATE TABLE %s.undo_vfile AS SELECT * FROM vfile;
233 @ CREATE TABLE %s.undo_vmerge AS SELECT * FROM vmerge;
234 ;
235 if( undoDisable ) return;
236 undo_reset();
237 db_multi_exec(zSql, zDb, zDb, zDb);
238 cid = db_lget_int("checkout", 0);
239 db_lset_int("undo_checkout", cid);
240 db_lset_int("undo_available", 1);
241 db_lset("undo_cmdline", undoCmd);
242 undoActive = 1;
@@ -301,18 +302,18 @@
301 ** Make the current state of stashid undoable.
302 */
303 void undo_save_stash(int stashid){
304 const char *zDb = db_name("localdb");
305 db_multi_exec(
306 "CREATE TABLE IF NOT EXISTS %s.undo_stash"
307 " AS SELECT * FROM stash WHERE 0;"
308 "INSERT INTO undo_stash"
309 " SELECT * FROM stash WHERE stashid=%d;",
310 zDb, stashid
311 );
312 db_multi_exec(
313 "CREATE TABLE IF NOT EXISTS %s.undo_stashfile"
314 " AS SELECT * FROM stashfile WHERE 0;"
315 "INSERT INTO undo_stashfile"
316 " SELECT * FROM stashfile WHERE stashid=%d;",
317 zDb, stashid
318 );
319
--- src/undo.c
+++ src/undo.c
@@ -143,11 +143,12 @@
143 "INSERT INTO vmerge SELECT * FROM undo_vmerge;"
144 "DELETE FROM undo_vmerge;"
145 "INSERT INTO undo_vmerge SELECT * FROM undo_vmerge_2;"
146 "DROP TABLE undo_vmerge_2;"
147 );
148 if(db_exists("SELECT 1 FROM \"%w\".sqlite_master"
149 " WHERE name='undo_stash'", zDb) ){
150 if( redoFlag ){
151 db_multi_exec(
152 "DELETE FROM stash WHERE stashid IN (SELECT stashid FROM undo_stash);"
153 "DELETE FROM stashfile"
154 " WHERE stashid NOT IN (SELECT stashid FROM stash);"
@@ -174,11 +175,11 @@
175 @ DROP TABLE IF EXISTS undo_vfile;
176 @ DROP TABLE IF EXISTS undo_vmerge;
177 @ DROP TABLE IF EXISTS undo_stash;
178 @ DROP TABLE IF EXISTS undo_stashfile;
179 ;
180 db_multi_exec(zSql /*works-like:""*/);
181 db_lset_int("undo_available", 0);
182 db_lset_int("undo_checkout", 0);
183 }
184
185 /*
@@ -219,24 +220,24 @@
220 */
221 void undo_begin(void){
222 int cid;
223 const char *zDb = db_name("localdb");
224 static const char zSql[] =
225 @ CREATE TABLE "%w".undo(
226 @ pathname TEXT UNIQUE, -- Name of the file
227 @ redoflag BOOLEAN, -- 0 for undoable. 1 for redoable
228 @ existsflag BOOLEAN, -- True if the file exists
229 @ isExe BOOLEAN, -- True if the file is executable
230 @ isLink BOOLEAN, -- True if the file is symlink
231 @ content BLOB -- Saved content
232 @ );
233 @ CREATE TABLE "%w".undo_vfile AS SELECT * FROM vfile;
234 @ CREATE TABLE "%w".undo_vmerge AS SELECT * FROM vmerge;
235 ;
236 if( undoDisable ) return;
237 undo_reset();
238 db_multi_exec(zSql/*works-like:"%w,%w,%w"*/, zDb, zDb, zDb);
239 cid = db_lget_int("checkout", 0);
240 db_lset_int("undo_checkout", cid);
241 db_lset_int("undo_available", 1);
242 db_lset("undo_cmdline", undoCmd);
243 undoActive = 1;
@@ -301,18 +302,18 @@
302 ** Make the current state of stashid undoable.
303 */
304 void undo_save_stash(int stashid){
305 const char *zDb = db_name("localdb");
306 db_multi_exec(
307 "CREATE TABLE IF NOT EXISTS \"%w\".undo_stash"
308 " AS SELECT * FROM stash WHERE 0;"
309 "INSERT INTO undo_stash"
310 " SELECT * FROM stash WHERE stashid=%d;",
311 zDb, stashid
312 );
313 db_multi_exec(
314 "CREATE TABLE IF NOT EXISTS \"%w\".undo_stashfile"
315 " AS SELECT * FROM stashfile WHERE 0;"
316 "INSERT INTO undo_stashfile"
317 " SELECT * FROM stashfile WHERE stashid=%d;",
318 zDb, stashid
319 );
320
+5 -3
--- src/update.c
+++ src/update.c
@@ -357,22 +357,24 @@
357357
zSep = "";
358358
for(i=3; i<g.argc; i++){
359359
file_tree_name(g.argv[i], &treename, 1);
360360
if( file_wd_isdir(g.argv[i])==1 ){
361361
if( blob_size(&treename) != 1 || blob_str(&treename)[0] != '.' ){
362
- blob_appendf(&sql, "%sfn NOT GLOB '%b/*' ", zSep, &treename);
362
+ blob_append_sql(&sql, "%sfn NOT GLOB '%q/*' ",
363
+ zSep /*safe-for-%s*/, blob_str(&treename));
363364
}else{
364365
blob_reset(&sql);
365366
break;
366367
}
367368
}else{
368
- blob_appendf(&sql, "%sfn<>%B ", zSep, &treename);
369
+ blob_append_sql(&sql, "%sfn<>%Q ",
370
+ zSep /*safe-for-%s*/, blob_str(&treename));
369371
}
370372
zSep = "AND ";
371373
blob_reset(&treename);
372374
}
373
- db_multi_exec(blob_str(&sql));
375
+ db_multi_exec("%s", blob_sql_text(&sql));
374376
blob_reset(&sql);
375377
}
376378
377379
/*
378380
** Alter the content of the checkout so that it conforms with the
379381
--- src/update.c
+++ src/update.c
@@ -357,22 +357,24 @@
357 zSep = "";
358 for(i=3; i<g.argc; i++){
359 file_tree_name(g.argv[i], &treename, 1);
360 if( file_wd_isdir(g.argv[i])==1 ){
361 if( blob_size(&treename) != 1 || blob_str(&treename)[0] != '.' ){
362 blob_appendf(&sql, "%sfn NOT GLOB '%b/*' ", zSep, &treename);
 
363 }else{
364 blob_reset(&sql);
365 break;
366 }
367 }else{
368 blob_appendf(&sql, "%sfn<>%B ", zSep, &treename);
 
369 }
370 zSep = "AND ";
371 blob_reset(&treename);
372 }
373 db_multi_exec(blob_str(&sql));
374 blob_reset(&sql);
375 }
376
377 /*
378 ** Alter the content of the checkout so that it conforms with the
379
--- src/update.c
+++ src/update.c
@@ -357,22 +357,24 @@
357 zSep = "";
358 for(i=3; i<g.argc; i++){
359 file_tree_name(g.argv[i], &treename, 1);
360 if( file_wd_isdir(g.argv[i])==1 ){
361 if( blob_size(&treename) != 1 || blob_str(&treename)[0] != '.' ){
362 blob_append_sql(&sql, "%sfn NOT GLOB '%q/*' ",
363 zSep /*safe-for-%s*/, blob_str(&treename));
364 }else{
365 blob_reset(&sql);
366 break;
367 }
368 }else{
369 blob_append_sql(&sql, "%sfn<>%Q ",
370 zSep /*safe-for-%s*/, blob_str(&treename));
371 }
372 zSep = "AND ";
373 blob_reset(&treename);
374 }
375 db_multi_exec("%s", blob_sql_text(&sql));
376 blob_reset(&sql);
377 }
378
379 /*
380 ** Alter the content of the checkout so that it conforms with the
381
+3 -3
--- src/user.c
+++ src/user.c
@@ -451,26 +451,26 @@
451451
cgi_redirectf("%s/access_log?y=%d&n=%d", g.zTop, y, n);
452452
return;
453453
}
454454
style_header("Access Log");
455455
blob_zero(&sql);
456
- blob_appendf(&sql,
456
+ blob_append_sql(&sql,
457457
"SELECT uname, ipaddr, datetime(mtime%s), success"
458458
" FROM accesslog", timeline_utc()
459459
);
460460
if( y==1 ){
461461
blob_append(&sql, " WHERE success", -1);
462462
}else if( y==2 ){
463463
blob_append(&sql, " WHERE NOT success", -1);
464464
}
465
- blob_appendf(&sql," ORDER BY rowid DESC LIMIT %d OFFSET %d", n+1, skip);
465
+ blob_append_sql(&sql," ORDER BY rowid DESC LIMIT %d OFFSET %d", n+1, skip);
466466
if( skip ){
467467
style_submenu_element("Newer", "Newer entries",
468468
"%s/access_log?o=%d&n=%d&y=%d", g.zTop, skip>=n ? skip-n : 0,
469469
n, y);
470470
}
471
- rc = db_prepare_ignore_error(&q, blob_str(&sql));
471
+ rc = db_prepare_ignore_error(&q, "%s", blob_sql_text(&sql));
472472
@ <center><table border="1" cellpadding="5">
473473
@ <tr><th width="33%%">Date</th><th width="34%%">User</th>
474474
@ <th width="33%%">IP Address</th></tr>
475475
while( rc==SQLITE_OK && db_step(&q)==SQLITE_ROW ){
476476
const char *zName = db_column_text(&q, 0);
477477
--- src/user.c
+++ src/user.c
@@ -451,26 +451,26 @@
451 cgi_redirectf("%s/access_log?y=%d&n=%d", g.zTop, y, n);
452 return;
453 }
454 style_header("Access Log");
455 blob_zero(&sql);
456 blob_appendf(&sql,
457 "SELECT uname, ipaddr, datetime(mtime%s), success"
458 " FROM accesslog", timeline_utc()
459 );
460 if( y==1 ){
461 blob_append(&sql, " WHERE success", -1);
462 }else if( y==2 ){
463 blob_append(&sql, " WHERE NOT success", -1);
464 }
465 blob_appendf(&sql," ORDER BY rowid DESC LIMIT %d OFFSET %d", n+1, skip);
466 if( skip ){
467 style_submenu_element("Newer", "Newer entries",
468 "%s/access_log?o=%d&n=%d&y=%d", g.zTop, skip>=n ? skip-n : 0,
469 n, y);
470 }
471 rc = db_prepare_ignore_error(&q, blob_str(&sql));
472 @ <center><table border="1" cellpadding="5">
473 @ <tr><th width="33%%">Date</th><th width="34%%">User</th>
474 @ <th width="33%%">IP Address</th></tr>
475 while( rc==SQLITE_OK && db_step(&q)==SQLITE_ROW ){
476 const char *zName = db_column_text(&q, 0);
477
--- src/user.c
+++ src/user.c
@@ -451,26 +451,26 @@
451 cgi_redirectf("%s/access_log?y=%d&n=%d", g.zTop, y, n);
452 return;
453 }
454 style_header("Access Log");
455 blob_zero(&sql);
456 blob_append_sql(&sql,
457 "SELECT uname, ipaddr, datetime(mtime%s), success"
458 " FROM accesslog", timeline_utc()
459 );
460 if( y==1 ){
461 blob_append(&sql, " WHERE success", -1);
462 }else if( y==2 ){
463 blob_append(&sql, " WHERE NOT success", -1);
464 }
465 blob_append_sql(&sql," ORDER BY rowid DESC LIMIT %d OFFSET %d", n+1, skip);
466 if( skip ){
467 style_submenu_element("Newer", "Newer entries",
468 "%s/access_log?o=%d&n=%d&y=%d", g.zTop, skip>=n ? skip-n : 0,
469 n, y);
470 }
471 rc = db_prepare_ignore_error(&q, "%s", blob_sql_text(&sql));
472 @ <center><table border="1" cellpadding="5">
473 @ <tr><th width="33%%">Date</th><th width="34%%">User</th>
474 @ <th width="33%%">IP Address</th></tr>
475 while( rc==SQLITE_OK && db_step(&q)==SQLITE_ROW ){
476 const char *zName = db_column_text(&q, 0);
477
+5 -14
--- src/wiki.c
+++ src/wiki.c
@@ -292,11 +292,11 @@
292292
style_submenu_element("History", "History", "%s/whistory?name=%T",
293293
g.zTop, zPageName);
294294
}
295295
}
296296
style_set_current_page("%T?name=%T", g.zPath, zPageName);
297
- style_header(zPageName);
297
+ style_header("%s", zPageName);
298298
blob_init(&wiki, zBody, -1);
299299
wiki_render_by_mimetype(&wiki, zMimetype);
300300
blob_reset(&wiki);
301301
attachment_list(zPageName, "<hr /><h2>Attachments:</h2><ul>");
302302
manifest_destroy(pWiki);
@@ -649,11 +649,11 @@
649649
Blob wiki;
650650
Manifest *pWiki = 0;
651651
652652
blob_zero(&body);
653653
if( isSandbox ){
654
- blob_appendf(&body, db_get("sandbox",""));
654
+ blob_append(&body, db_get("sandbox",""), -1);
655655
appendRemark(&body, zMimetype);
656656
db_set("sandbox", blob_str(&body), 0);
657657
}else{
658658
login_verify_csrf_secret();
659659
pWiki = manifest_get(rid, CFTYPE_WIKI, 0);
@@ -746,29 +746,23 @@
746746
**
747747
** Show the complete change history for a single wiki page.
748748
*/
749749
void whistory_page(void){
750750
Stmt q;
751
- char *zTitle;
752
- char *zSQL;
753751
const char *zPageName;
754752
login_check_credentials();
755753
if( !g.perm.Hyperlink ){ login_needed(); return; }
756754
zPageName = PD("name","");
757
- zTitle = mprintf("History Of %s", zPageName);
758
- style_header(zTitle);
759
- free(zTitle);
755
+ style_header("History Of %s", zPageName);
760756
761
- zSQL = mprintf("%s AND event.objid IN "
757
+ db_prepare(&q, "%s AND event.objid IN "
762758
" (SELECT rid FROM tagxref WHERE tagid="
763759
"(SELECT tagid FROM tag WHERE tagname='wiki-%q')"
764760
" UNION SELECT attachid FROM attachment"
765761
" WHERE target=%Q)"
766762
"ORDER BY mtime DESC",
767763
timeline_query_for_www(), zPageName, zPageName);
768
- db_prepare(&q, zSQL);
769
- free(zSQL);
770764
zWikiPageName = zPageName;
771765
www_print_timeline(&q, TIMELINE_ARTID, 0, 0, wiki_history_extra);
772766
db_finalize(&q);
773767
style_footer();
774768
}
@@ -778,11 +772,10 @@
778772
** URL: /whistory?name=PAGENAME&a=RID1&b=RID2
779773
**
780774
** Show the difference between two wiki pages.
781775
*/
782776
void wdiff_page(void){
783
- char *zTitle;
784777
int rid1, rid2;
785778
const char *zPageName;
786779
Manifest *pW1, *pW2 = 0;
787780
Blob w1, w2, d;
788781
u64 diffFlags;
@@ -791,13 +784,11 @@
791784
rid1 = atoi(PD("a","0"));
792785
if( !g.perm.Hyperlink ){ login_needed(); return; }
793786
if( rid1==0 ) fossil_redirect_home();
794787
rid2 = atoi(PD("b","0"));
795788
zPageName = PD("name","");
796
- zTitle = mprintf("Changes To %s", zPageName);
797
- style_header(zTitle);
798
- free(zTitle);
789
+ style_header("Changes To %s", zPageName);
799790
800791
if( rid2==0 ){
801792
rid2 = db_int(0,
802793
"SELECT objid FROM event JOIN tagxref ON objid=rid AND tagxref.tagid="
803794
"(SELECT tagid FROM tag WHERE tagname='wiki-%q')"
804795
--- src/wiki.c
+++ src/wiki.c
@@ -292,11 +292,11 @@
292 style_submenu_element("History", "History", "%s/whistory?name=%T",
293 g.zTop, zPageName);
294 }
295 }
296 style_set_current_page("%T?name=%T", g.zPath, zPageName);
297 style_header(zPageName);
298 blob_init(&wiki, zBody, -1);
299 wiki_render_by_mimetype(&wiki, zMimetype);
300 blob_reset(&wiki);
301 attachment_list(zPageName, "<hr /><h2>Attachments:</h2><ul>");
302 manifest_destroy(pWiki);
@@ -649,11 +649,11 @@
649 Blob wiki;
650 Manifest *pWiki = 0;
651
652 blob_zero(&body);
653 if( isSandbox ){
654 blob_appendf(&body, db_get("sandbox",""));
655 appendRemark(&body, zMimetype);
656 db_set("sandbox", blob_str(&body), 0);
657 }else{
658 login_verify_csrf_secret();
659 pWiki = manifest_get(rid, CFTYPE_WIKI, 0);
@@ -746,29 +746,23 @@
746 **
747 ** Show the complete change history for a single wiki page.
748 */
749 void whistory_page(void){
750 Stmt q;
751 char *zTitle;
752 char *zSQL;
753 const char *zPageName;
754 login_check_credentials();
755 if( !g.perm.Hyperlink ){ login_needed(); return; }
756 zPageName = PD("name","");
757 zTitle = mprintf("History Of %s", zPageName);
758 style_header(zTitle);
759 free(zTitle);
760
761 zSQL = mprintf("%s AND event.objid IN "
762 " (SELECT rid FROM tagxref WHERE tagid="
763 "(SELECT tagid FROM tag WHERE tagname='wiki-%q')"
764 " UNION SELECT attachid FROM attachment"
765 " WHERE target=%Q)"
766 "ORDER BY mtime DESC",
767 timeline_query_for_www(), zPageName, zPageName);
768 db_prepare(&q, zSQL);
769 free(zSQL);
770 zWikiPageName = zPageName;
771 www_print_timeline(&q, TIMELINE_ARTID, 0, 0, wiki_history_extra);
772 db_finalize(&q);
773 style_footer();
774 }
@@ -778,11 +772,10 @@
778 ** URL: /whistory?name=PAGENAME&a=RID1&b=RID2
779 **
780 ** Show the difference between two wiki pages.
781 */
782 void wdiff_page(void){
783 char *zTitle;
784 int rid1, rid2;
785 const char *zPageName;
786 Manifest *pW1, *pW2 = 0;
787 Blob w1, w2, d;
788 u64 diffFlags;
@@ -791,13 +784,11 @@
791 rid1 = atoi(PD("a","0"));
792 if( !g.perm.Hyperlink ){ login_needed(); return; }
793 if( rid1==0 ) fossil_redirect_home();
794 rid2 = atoi(PD("b","0"));
795 zPageName = PD("name","");
796 zTitle = mprintf("Changes To %s", zPageName);
797 style_header(zTitle);
798 free(zTitle);
799
800 if( rid2==0 ){
801 rid2 = db_int(0,
802 "SELECT objid FROM event JOIN tagxref ON objid=rid AND tagxref.tagid="
803 "(SELECT tagid FROM tag WHERE tagname='wiki-%q')"
804
--- src/wiki.c
+++ src/wiki.c
@@ -292,11 +292,11 @@
292 style_submenu_element("History", "History", "%s/whistory?name=%T",
293 g.zTop, zPageName);
294 }
295 }
296 style_set_current_page("%T?name=%T", g.zPath, zPageName);
297 style_header("%s", zPageName);
298 blob_init(&wiki, zBody, -1);
299 wiki_render_by_mimetype(&wiki, zMimetype);
300 blob_reset(&wiki);
301 attachment_list(zPageName, "<hr /><h2>Attachments:</h2><ul>");
302 manifest_destroy(pWiki);
@@ -649,11 +649,11 @@
649 Blob wiki;
650 Manifest *pWiki = 0;
651
652 blob_zero(&body);
653 if( isSandbox ){
654 blob_append(&body, db_get("sandbox",""), -1);
655 appendRemark(&body, zMimetype);
656 db_set("sandbox", blob_str(&body), 0);
657 }else{
658 login_verify_csrf_secret();
659 pWiki = manifest_get(rid, CFTYPE_WIKI, 0);
@@ -746,29 +746,23 @@
746 **
747 ** Show the complete change history for a single wiki page.
748 */
749 void whistory_page(void){
750 Stmt q;
 
 
751 const char *zPageName;
752 login_check_credentials();
753 if( !g.perm.Hyperlink ){ login_needed(); return; }
754 zPageName = PD("name","");
755 style_header("History Of %s", zPageName);
 
 
756
757 db_prepare(&q, "%s AND event.objid IN "
758 " (SELECT rid FROM tagxref WHERE tagid="
759 "(SELECT tagid FROM tag WHERE tagname='wiki-%q')"
760 " UNION SELECT attachid FROM attachment"
761 " WHERE target=%Q)"
762 "ORDER BY mtime DESC",
763 timeline_query_for_www(), zPageName, zPageName);
 
 
764 zWikiPageName = zPageName;
765 www_print_timeline(&q, TIMELINE_ARTID, 0, 0, wiki_history_extra);
766 db_finalize(&q);
767 style_footer();
768 }
@@ -778,11 +772,10 @@
772 ** URL: /whistory?name=PAGENAME&a=RID1&b=RID2
773 **
774 ** Show the difference between two wiki pages.
775 */
776 void wdiff_page(void){
 
777 int rid1, rid2;
778 const char *zPageName;
779 Manifest *pW1, *pW2 = 0;
780 Blob w1, w2, d;
781 u64 diffFlags;
@@ -791,13 +784,11 @@
784 rid1 = atoi(PD("a","0"));
785 if( !g.perm.Hyperlink ){ login_needed(); return; }
786 if( rid1==0 ) fossil_redirect_home();
787 rid2 = atoi(PD("b","0"));
788 zPageName = PD("name","");
789 style_header("Changes To %s", zPageName);
 
 
790
791 if( rid2==0 ){
792 rid2 = db_int(0,
793 "SELECT objid FROM event JOIN tagxref ON objid=rid AND tagxref.tagid="
794 "(SELECT tagid FROM tag WHERE tagname='wiki-%q')"
795
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -1046,11 +1046,11 @@
10461046
*/
10471047
static void startAutoParagraph(Renderer *p){
10481048
if( p->wantAutoParagraph==0 ) return;
10491049
if( p->state & WIKI_LINKSONLY ) return;
10501050
if( p->wikiList==MARKUP_OL || p->wikiList==MARKUP_UL ) return;
1051
- blob_appendf(p->pOut, "<p>", -1);
1051
+ blob_append(p->pOut, "<p>", -1);
10521052
p->wantAutoParagraph = 0;
10531053
p->inAutoParagraph = 1;
10541054
}
10551055
10561056
/*
@@ -1121,11 +1121,11 @@
11211121
if( once ){
11221122
const char *zClosedExpr = db_get("ticket-closed-expr", "status='Closed'");
11231123
db_static_prepare(&q,
11241124
"SELECT %s FROM ticket "
11251125
" WHERE tkt_uuid>=:lwr AND tkt_uuid<:upr",
1126
- zClosedExpr
1126
+ zClosedExpr /*safe-for-%s*/
11271127
);
11281128
once = 0;
11291129
}
11301130
db_bind_text(&q, ":lwr", zLower);
11311131
db_bind_text(&q, ":upr", zUpper);
@@ -1243,11 +1243,11 @@
12431243
}
12441244
}else if( !in_this_repo(zTarget) ){
12451245
if( (p->state & (WIKI_LINKSONLY|WIKI_NOBADLINKS))!=0 ){
12461246
zTerm = "";
12471247
}else{
1248
- blob_appendf(p->pOut, "<span class=\"brokenlink\">[", zTarget);
1248
+ blob_appendf(p->pOut, "<span class=\"brokenlink\">[");
12491249
zTerm = "]</span>";
12501250
}
12511251
}else if( g.perm.Hyperlink ){
12521252
blob_appendf(p->pOut, "%z[",href("%R/info/%s", zTarget));
12531253
zTerm = "]</a>";
@@ -1328,11 +1328,11 @@
13281328
if( p->wikiList ){
13291329
popStackToTag(p, p->wikiList);
13301330
p->wikiList = 0;
13311331
}
13321332
endAutoParagraph(p);
1333
- blob_appendf(p->pOut, "\n\n", 1);
1333
+ blob_append(p->pOut, "\n\n", 1);
13341334
p->wantAutoParagraph = 1;
13351335
}
13361336
p->state |= AT_PARAGRAPH|AT_NEWLINE;
13371337
break;
13381338
}
13391339
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -1046,11 +1046,11 @@
1046 */
1047 static void startAutoParagraph(Renderer *p){
1048 if( p->wantAutoParagraph==0 ) return;
1049 if( p->state & WIKI_LINKSONLY ) return;
1050 if( p->wikiList==MARKUP_OL || p->wikiList==MARKUP_UL ) return;
1051 blob_appendf(p->pOut, "<p>", -1);
1052 p->wantAutoParagraph = 0;
1053 p->inAutoParagraph = 1;
1054 }
1055
1056 /*
@@ -1121,11 +1121,11 @@
1121 if( once ){
1122 const char *zClosedExpr = db_get("ticket-closed-expr", "status='Closed'");
1123 db_static_prepare(&q,
1124 "SELECT %s FROM ticket "
1125 " WHERE tkt_uuid>=:lwr AND tkt_uuid<:upr",
1126 zClosedExpr
1127 );
1128 once = 0;
1129 }
1130 db_bind_text(&q, ":lwr", zLower);
1131 db_bind_text(&q, ":upr", zUpper);
@@ -1243,11 +1243,11 @@
1243 }
1244 }else if( !in_this_repo(zTarget) ){
1245 if( (p->state & (WIKI_LINKSONLY|WIKI_NOBADLINKS))!=0 ){
1246 zTerm = "";
1247 }else{
1248 blob_appendf(p->pOut, "<span class=\"brokenlink\">[", zTarget);
1249 zTerm = "]</span>";
1250 }
1251 }else if( g.perm.Hyperlink ){
1252 blob_appendf(p->pOut, "%z[",href("%R/info/%s", zTarget));
1253 zTerm = "]</a>";
@@ -1328,11 +1328,11 @@
1328 if( p->wikiList ){
1329 popStackToTag(p, p->wikiList);
1330 p->wikiList = 0;
1331 }
1332 endAutoParagraph(p);
1333 blob_appendf(p->pOut, "\n\n", 1);
1334 p->wantAutoParagraph = 1;
1335 }
1336 p->state |= AT_PARAGRAPH|AT_NEWLINE;
1337 break;
1338 }
1339
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -1046,11 +1046,11 @@
1046 */
1047 static void startAutoParagraph(Renderer *p){
1048 if( p->wantAutoParagraph==0 ) return;
1049 if( p->state & WIKI_LINKSONLY ) return;
1050 if( p->wikiList==MARKUP_OL || p->wikiList==MARKUP_UL ) return;
1051 blob_append(p->pOut, "<p>", -1);
1052 p->wantAutoParagraph = 0;
1053 p->inAutoParagraph = 1;
1054 }
1055
1056 /*
@@ -1121,11 +1121,11 @@
1121 if( once ){
1122 const char *zClosedExpr = db_get("ticket-closed-expr", "status='Closed'");
1123 db_static_prepare(&q,
1124 "SELECT %s FROM ticket "
1125 " WHERE tkt_uuid>=:lwr AND tkt_uuid<:upr",
1126 zClosedExpr /*safe-for-%s*/
1127 );
1128 once = 0;
1129 }
1130 db_bind_text(&q, ":lwr", zLower);
1131 db_bind_text(&q, ":upr", zUpper);
@@ -1243,11 +1243,11 @@
1243 }
1244 }else if( !in_this_repo(zTarget) ){
1245 if( (p->state & (WIKI_LINKSONLY|WIKI_NOBADLINKS))!=0 ){
1246 zTerm = "";
1247 }else{
1248 blob_appendf(p->pOut, "<span class=\"brokenlink\">[");
1249 zTerm = "]</span>";
1250 }
1251 }else if( g.perm.Hyperlink ){
1252 blob_appendf(p->pOut, "%z[",href("%R/info/%s", zTarget));
1253 zTerm = "]</a>";
@@ -1328,11 +1328,11 @@
1328 if( p->wikiList ){
1329 popStackToTag(p, p->wikiList);
1330 p->wikiList = 0;
1331 }
1332 endAutoParagraph(p);
1333 blob_append(p->pOut, "\n\n", 1);
1334 p->wantAutoParagraph = 1;
1335 }
1336 p->state |= AT_PARAGRAPH|AT_NEWLINE;
1337 break;
1338 }
1339
+33 -27
--- src/winhttp.c
+++ src/winhttp.c
@@ -58,10 +58,21 @@
5858
}
5959
zHdr++;
6060
}
6161
return 0;
6262
}
63
+
64
+/*
65
+** Issue a fatal error.
66
+*/
67
+static NORETURN void winhttp_fatal(
68
+ const char *zOp,
69
+ const char *zService,
70
+ const char *zErr
71
+){
72
+ fossil_fatal("unable to %s service '%s': %s", zOp, zService, zErr);
73
+}
6374
6475
/*
6576
** Process a single incoming HTTP request.
6677
*/
6778
static void win32_http_request(void *pAppData){
@@ -297,11 +308,11 @@
297308
zTempPrefix = mprintf("%sfossil_server_P%d_",
298309
fossil_unicode_to_utf8(zTmpPath), iPort);
299310
fossil_print("Listening for %s requests on TCP port %d\n",
300311
(flags&HTTP_SERVER_SCGI)!=0?"SCGI":"HTTP", iPort);
301312
if( zBrowser ){
302
- zBrowser = mprintf(zBrowser, iPort);
313
+ zBrowser = mprintf(zBrowser /*works-like:"%d"*/, iPort);
303314
fossil_print("Launch webbrowser: %s\n", zBrowser);
304315
fossil_system(zBrowser);
305316
}
306317
fossil_print("Type Ctrl-C to stop the HTTP server\n");
307318
/* Set the service status to running and pass the listener socket to the
@@ -679,11 +690,10 @@
679690
if( strncmp(zMethod, "create", n)==0 ){
680691
SC_HANDLE hScm;
681692
SC_HANDLE hSvc;
682693
SERVICE_DESCRIPTIONW
683694
svcDescr = {L"Fossil - Distributed Software Configuration Management"};
684
- char *zErrFmt = "unable to create service '%s': %s";
685695
DWORD dwStartType = SERVICE_DEMAND_START;
686696
const char *zDisplay = find_option("display", "D", 1);
687697
const char *zStart = find_option("start", "S", 1);
688698
const char *zUsername = find_option("username", "U", 1);
689699
const char *zPassword = find_option("password", "W", 1);
@@ -714,17 +724,17 @@
714724
if( strncmp(zStart, "auto", strlen(zStart))==0 ){
715725
dwStartType = SERVICE_AUTO_START;
716726
}else if( strncmp(zStart, "manual", strlen(zStart))==0 ){
717727
dwStartType = SERVICE_DEMAND_START;
718728
}else{
719
- fossil_fatal(zErrFmt, zSvcName,
729
+ winhttp_fatal("create", zSvcName,
720730
"specify 'auto' or 'manual' for the '-S|--start' option");
721731
}
722732
}
723733
/* Process options for Fossil running as server. */
724734
if( zPort && (atoi(zPort)<=0) ){
725
- fossil_fatal(zErrFmt, zSvcName,
735
+ winhttp_fatal("create", zSvcName,
726736
"port number must be in the range 1 - 65535.");
727737
}
728738
if( !zRepository ){
729739
db_must_be_within_tree();
730740
}else if( file_isdir(zRepository)==1 ){
@@ -743,11 +753,11 @@
743753
if( zFileGlob ) blob_appendf(&binPath, " --files-urlenc %T", zFileGlob);
744754
if( zLocalAuth ) blob_append(&binPath, " --localauth", -1);
745755
blob_appendf(&binPath, " \"%s\"", g.zRepositoryName);
746756
/* Create the service. */
747757
hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
748
- if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
758
+ if( !hScm ) winhttp_fatal("create", zSvcName, win32_get_last_errmsg());
749759
hSvc = CreateServiceW(
750760
hScm, /* Handle to the SCM */
751761
fossil_utf8_to_unicode(zSvcName), /* Name of the service */
752762
fossil_utf8_to_unicode(zDisplay), /* Display name */
753763
SERVICE_ALL_ACCESS, /* Desired access */
@@ -759,11 +769,11 @@
759769
NULL, /* Tag value */
760770
NULL, /* Service dependencies */
761771
zUsername ? fossil_utf8_to_unicode(zUsername) : 0, /* Account */
762772
fossil_utf8_to_unicode(zPassword) /* Account password */
763773
);
764
- if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
774
+ if( !hSvc ) winhttp_fatal("create", zSvcName, win32_get_last_errmsg());
765775
/* Set the service description. */
766776
ChangeServiceConfig2W(hSvc, SERVICE_CONFIG_DESCRIPTION, &svcDescr);
767777
fossil_print("Service '%s' successfully created.\n", zSvcName);
768778
CloseServiceHandle(hSvc);
769779
CloseServiceHandle(hScm);
@@ -770,29 +780,28 @@
770780
}else
771781
if( strncmp(zMethod, "delete", n)==0 ){
772782
SC_HANDLE hScm;
773783
SC_HANDLE hSvc;
774784
SERVICE_STATUS sstat;
775
- char *zErrFmt = "unable to delete service '%s': %s";
776785
777786
verify_all_options();
778787
if( g.argc==4 ){
779788
zSvcName = g.argv[3];
780789
}else if( g.argc>4 ){
781790
fossil_fatal("too many arguments for delete method.");
782791
}
783792
hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
784
- if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
793
+ if( !hScm ) winhttp_fatal("delete", zSvcName, win32_get_last_errmsg());
785794
hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName),
786795
SERVICE_ALL_ACCESS);
787
- if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
796
+ if( !hSvc ) winhttp_fatal("delete", zSvcName, win32_get_last_errmsg());
788797
QueryServiceStatus(hSvc, &sstat);
789798
if( sstat.dwCurrentState!=SERVICE_STOPPED ){
790799
fossil_print("Stopping service '%s'", zSvcName);
791800
if( sstat.dwCurrentState!=SERVICE_STOP_PENDING ){
792801
if( !ControlService(hSvc, SERVICE_CONTROL_STOP, &sstat) ){
793
- fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
802
+ winhttp_fatal("delete", zSvcName, win32_get_last_errmsg());
794803
}
795804
}
796805
while( sstat.dwCurrentState!=SERVICE_STOPPED ){
797806
Sleep(100);
798807
fossil_print(".");
@@ -802,11 +811,11 @@
802811
}
803812
if( !DeleteService(hSvc) ){
804813
if( GetLastError()==ERROR_SERVICE_MARKED_FOR_DELETE ){
805814
fossil_warning("Service '%s' already marked for delete.\n", zSvcName);
806815
}else{
807
- fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
816
+ winhttp_fatal("delete", zSvcName, win32_get_last_errmsg());
808817
}
809818
}else{
810819
fossil_print("Service '%s' successfully deleted.\n", zSvcName);
811820
}
812821
CloseServiceHandle(hSvc);
@@ -818,11 +827,10 @@
818827
SERVICE_STATUS sstat;
819828
LPQUERY_SERVICE_CONFIGW pSvcConfig;
820829
LPSERVICE_DESCRIPTIONW pSvcDescr;
821830
BOOL bStatus;
822831
DWORD nRequired;
823
- const char *zErrFmt = "unable to show service '%s': %s";
824832
static const char *const zSvcTypes[] = {
825833
"Driver service",
826834
"File system driver service",
827835
"Service runs in its own process",
828836
"Service shares a process with other services",
@@ -848,21 +856,21 @@
848856
zSvcName = g.argv[3];
849857
}else if( g.argc>4 ){
850858
fossil_fatal("too many arguments for show method.");
851859
}
852860
hScm = OpenSCManagerW(NULL, NULL, GENERIC_READ);
853
- if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
861
+ if( !hScm ) winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
854862
hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName), GENERIC_READ);
855
- if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
863
+ if( !hSvc ) winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
856864
/* Get the service configuration */
857865
bStatus = QueryServiceConfigW(hSvc, NULL, 0, &nRequired);
858866
if( !bStatus && GetLastError()!=ERROR_INSUFFICIENT_BUFFER ){
859
- fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
867
+ winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
860868
}
861869
pSvcConfig = fossil_malloc(nRequired);
862870
bStatus = QueryServiceConfigW(hSvc, pSvcConfig, nRequired, &nRequired);
863
- if( !bStatus ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
871
+ if( !bStatus ) winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
864872
/* Translate the service type */
865873
switch( pSvcConfig->dwServiceType ){
866874
case SERVICE_KERNEL_DRIVER: zSvcType = zSvcTypes[0]; break;
867875
case SERVICE_FILE_SYSTEM_DRIVER: zSvcType = zSvcTypes[1]; break;
868876
case SERVICE_WIN32_OWN_PROCESS: zSvcType = zSvcTypes[2]; break;
@@ -879,19 +887,19 @@
879887
}
880888
/* Get the service description. */
881889
bStatus = QueryServiceConfig2W(hSvc, SERVICE_CONFIG_DESCRIPTION,
882890
NULL, 0, &nRequired);
883891
if( !bStatus && GetLastError()!=ERROR_INSUFFICIENT_BUFFER ){
884
- fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
892
+ winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
885893
}
886894
pSvcDescr = fossil_malloc(nRequired);
887895
bStatus = QueryServiceConfig2W(hSvc, SERVICE_CONFIG_DESCRIPTION,
888896
(LPBYTE)pSvcDescr, nRequired, &nRequired);
889
- if( !bStatus ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
897
+ if( !bStatus ) winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
890898
/* Retrieves the current status of the specified service. */
891899
bStatus = QueryServiceStatus(hSvc, &sstat);
892
- if( !bStatus ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
900
+ if( !bStatus ) winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
893901
/* Translate the current state. */
894902
switch( sstat.dwCurrentState ){
895903
case SERVICE_STOPPED: zSvcState = zSvcStates[0]; break;
896904
case SERVICE_START_PENDING: zSvcState = zSvcStates[1]; break;
897905
case SERVICE_STOP_PENDING: zSvcState = zSvcStates[2]; break;
@@ -921,29 +929,28 @@
921929
}else
922930
if( strncmp(zMethod, "start", n)==0 ){
923931
SC_HANDLE hScm;
924932
SC_HANDLE hSvc;
925933
SERVICE_STATUS sstat;
926
- char *zErrFmt = "unable to start service '%s': %s";
927934
928935
verify_all_options();
929936
if( g.argc==4 ){
930937
zSvcName = g.argv[3];
931938
}else if( g.argc>4 ){
932939
fossil_fatal("too many arguments for start method.");
933940
}
934941
hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
935
- if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
942
+ if( !hScm ) winhttp_fatal("start", zSvcName, win32_get_last_errmsg());
936943
hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName),
937944
SERVICE_ALL_ACCESS);
938
- if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
945
+ if( !hSvc ) winhttp_fatal("start", zSvcName, win32_get_last_errmsg());
939946
QueryServiceStatus(hSvc, &sstat);
940947
if( sstat.dwCurrentState!=SERVICE_RUNNING ){
941948
fossil_print("Starting service '%s'", zSvcName);
942949
if( sstat.dwCurrentState!=SERVICE_START_PENDING ){
943950
if( !StartServiceW(hSvc, 0, NULL) ){
944
- fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
951
+ winhttp_fatal("start", zSvcName, win32_get_last_errmsg());
945952
}
946953
}
947954
while( sstat.dwCurrentState!=SERVICE_RUNNING ){
948955
Sleep(100);
949956
fossil_print(".");
@@ -958,29 +965,28 @@
958965
}else
959966
if( strncmp(zMethod, "stop", n)==0 ){
960967
SC_HANDLE hScm;
961968
SC_HANDLE hSvc;
962969
SERVICE_STATUS sstat;
963
- char *zErrFmt = "unable to stop service '%s': %s";
964970
965971
verify_all_options();
966972
if( g.argc==4 ){
967973
zSvcName = g.argv[3];
968974
}else if( g.argc>4 ){
969975
fossil_fatal("too many arguments for stop method.");
970976
}
971977
hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
972
- if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
978
+ if( !hScm ) winhttp_fatal("stop", zSvcName, win32_get_last_errmsg());
973979
hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName),
974980
SERVICE_ALL_ACCESS);
975
- if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
981
+ if( !hSvc ) winhttp_fatal("stop", zSvcName, win32_get_last_errmsg());
976982
QueryServiceStatus(hSvc, &sstat);
977983
if( sstat.dwCurrentState!=SERVICE_STOPPED ){
978984
fossil_print("Stopping service '%s'", zSvcName);
979985
if( sstat.dwCurrentState!=SERVICE_STOP_PENDING ){
980986
if( !ControlService(hSvc, SERVICE_CONTROL_STOP, &sstat) ){
981
- fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
987
+ winhttp_fatal("stop", zSvcName, win32_get_last_errmsg());
982988
}
983989
}
984990
while( sstat.dwCurrentState!=SERVICE_STOPPED ){
985991
Sleep(100);
986992
fossil_print(".");
987993
--- src/winhttp.c
+++ src/winhttp.c
@@ -58,10 +58,21 @@
58 }
59 zHdr++;
60 }
61 return 0;
62 }
 
 
 
 
 
 
 
 
 
 
 
63
64 /*
65 ** Process a single incoming HTTP request.
66 */
67 static void win32_http_request(void *pAppData){
@@ -297,11 +308,11 @@
297 zTempPrefix = mprintf("%sfossil_server_P%d_",
298 fossil_unicode_to_utf8(zTmpPath), iPort);
299 fossil_print("Listening for %s requests on TCP port %d\n",
300 (flags&HTTP_SERVER_SCGI)!=0?"SCGI":"HTTP", iPort);
301 if( zBrowser ){
302 zBrowser = mprintf(zBrowser, iPort);
303 fossil_print("Launch webbrowser: %s\n", zBrowser);
304 fossil_system(zBrowser);
305 }
306 fossil_print("Type Ctrl-C to stop the HTTP server\n");
307 /* Set the service status to running and pass the listener socket to the
@@ -679,11 +690,10 @@
679 if( strncmp(zMethod, "create", n)==0 ){
680 SC_HANDLE hScm;
681 SC_HANDLE hSvc;
682 SERVICE_DESCRIPTIONW
683 svcDescr = {L"Fossil - Distributed Software Configuration Management"};
684 char *zErrFmt = "unable to create service '%s': %s";
685 DWORD dwStartType = SERVICE_DEMAND_START;
686 const char *zDisplay = find_option("display", "D", 1);
687 const char *zStart = find_option("start", "S", 1);
688 const char *zUsername = find_option("username", "U", 1);
689 const char *zPassword = find_option("password", "W", 1);
@@ -714,17 +724,17 @@
714 if( strncmp(zStart, "auto", strlen(zStart))==0 ){
715 dwStartType = SERVICE_AUTO_START;
716 }else if( strncmp(zStart, "manual", strlen(zStart))==0 ){
717 dwStartType = SERVICE_DEMAND_START;
718 }else{
719 fossil_fatal(zErrFmt, zSvcName,
720 "specify 'auto' or 'manual' for the '-S|--start' option");
721 }
722 }
723 /* Process options for Fossil running as server. */
724 if( zPort && (atoi(zPort)<=0) ){
725 fossil_fatal(zErrFmt, zSvcName,
726 "port number must be in the range 1 - 65535.");
727 }
728 if( !zRepository ){
729 db_must_be_within_tree();
730 }else if( file_isdir(zRepository)==1 ){
@@ -743,11 +753,11 @@
743 if( zFileGlob ) blob_appendf(&binPath, " --files-urlenc %T", zFileGlob);
744 if( zLocalAuth ) blob_append(&binPath, " --localauth", -1);
745 blob_appendf(&binPath, " \"%s\"", g.zRepositoryName);
746 /* Create the service. */
747 hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
748 if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
749 hSvc = CreateServiceW(
750 hScm, /* Handle to the SCM */
751 fossil_utf8_to_unicode(zSvcName), /* Name of the service */
752 fossil_utf8_to_unicode(zDisplay), /* Display name */
753 SERVICE_ALL_ACCESS, /* Desired access */
@@ -759,11 +769,11 @@
759 NULL, /* Tag value */
760 NULL, /* Service dependencies */
761 zUsername ? fossil_utf8_to_unicode(zUsername) : 0, /* Account */
762 fossil_utf8_to_unicode(zPassword) /* Account password */
763 );
764 if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
765 /* Set the service description. */
766 ChangeServiceConfig2W(hSvc, SERVICE_CONFIG_DESCRIPTION, &svcDescr);
767 fossil_print("Service '%s' successfully created.\n", zSvcName);
768 CloseServiceHandle(hSvc);
769 CloseServiceHandle(hScm);
@@ -770,29 +780,28 @@
770 }else
771 if( strncmp(zMethod, "delete", n)==0 ){
772 SC_HANDLE hScm;
773 SC_HANDLE hSvc;
774 SERVICE_STATUS sstat;
775 char *zErrFmt = "unable to delete service '%s': %s";
776
777 verify_all_options();
778 if( g.argc==4 ){
779 zSvcName = g.argv[3];
780 }else if( g.argc>4 ){
781 fossil_fatal("too many arguments for delete method.");
782 }
783 hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
784 if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
785 hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName),
786 SERVICE_ALL_ACCESS);
787 if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
788 QueryServiceStatus(hSvc, &sstat);
789 if( sstat.dwCurrentState!=SERVICE_STOPPED ){
790 fossil_print("Stopping service '%s'", zSvcName);
791 if( sstat.dwCurrentState!=SERVICE_STOP_PENDING ){
792 if( !ControlService(hSvc, SERVICE_CONTROL_STOP, &sstat) ){
793 fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
794 }
795 }
796 while( sstat.dwCurrentState!=SERVICE_STOPPED ){
797 Sleep(100);
798 fossil_print(".");
@@ -802,11 +811,11 @@
802 }
803 if( !DeleteService(hSvc) ){
804 if( GetLastError()==ERROR_SERVICE_MARKED_FOR_DELETE ){
805 fossil_warning("Service '%s' already marked for delete.\n", zSvcName);
806 }else{
807 fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
808 }
809 }else{
810 fossil_print("Service '%s' successfully deleted.\n", zSvcName);
811 }
812 CloseServiceHandle(hSvc);
@@ -818,11 +827,10 @@
818 SERVICE_STATUS sstat;
819 LPQUERY_SERVICE_CONFIGW pSvcConfig;
820 LPSERVICE_DESCRIPTIONW pSvcDescr;
821 BOOL bStatus;
822 DWORD nRequired;
823 const char *zErrFmt = "unable to show service '%s': %s";
824 static const char *const zSvcTypes[] = {
825 "Driver service",
826 "File system driver service",
827 "Service runs in its own process",
828 "Service shares a process with other services",
@@ -848,21 +856,21 @@
848 zSvcName = g.argv[3];
849 }else if( g.argc>4 ){
850 fossil_fatal("too many arguments for show method.");
851 }
852 hScm = OpenSCManagerW(NULL, NULL, GENERIC_READ);
853 if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
854 hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName), GENERIC_READ);
855 if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
856 /* Get the service configuration */
857 bStatus = QueryServiceConfigW(hSvc, NULL, 0, &nRequired);
858 if( !bStatus && GetLastError()!=ERROR_INSUFFICIENT_BUFFER ){
859 fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
860 }
861 pSvcConfig = fossil_malloc(nRequired);
862 bStatus = QueryServiceConfigW(hSvc, pSvcConfig, nRequired, &nRequired);
863 if( !bStatus ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
864 /* Translate the service type */
865 switch( pSvcConfig->dwServiceType ){
866 case SERVICE_KERNEL_DRIVER: zSvcType = zSvcTypes[0]; break;
867 case SERVICE_FILE_SYSTEM_DRIVER: zSvcType = zSvcTypes[1]; break;
868 case SERVICE_WIN32_OWN_PROCESS: zSvcType = zSvcTypes[2]; break;
@@ -879,19 +887,19 @@
879 }
880 /* Get the service description. */
881 bStatus = QueryServiceConfig2W(hSvc, SERVICE_CONFIG_DESCRIPTION,
882 NULL, 0, &nRequired);
883 if( !bStatus && GetLastError()!=ERROR_INSUFFICIENT_BUFFER ){
884 fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
885 }
886 pSvcDescr = fossil_malloc(nRequired);
887 bStatus = QueryServiceConfig2W(hSvc, SERVICE_CONFIG_DESCRIPTION,
888 (LPBYTE)pSvcDescr, nRequired, &nRequired);
889 if( !bStatus ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
890 /* Retrieves the current status of the specified service. */
891 bStatus = QueryServiceStatus(hSvc, &sstat);
892 if( !bStatus ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
893 /* Translate the current state. */
894 switch( sstat.dwCurrentState ){
895 case SERVICE_STOPPED: zSvcState = zSvcStates[0]; break;
896 case SERVICE_START_PENDING: zSvcState = zSvcStates[1]; break;
897 case SERVICE_STOP_PENDING: zSvcState = zSvcStates[2]; break;
@@ -921,29 +929,28 @@
921 }else
922 if( strncmp(zMethod, "start", n)==0 ){
923 SC_HANDLE hScm;
924 SC_HANDLE hSvc;
925 SERVICE_STATUS sstat;
926 char *zErrFmt = "unable to start service '%s': %s";
927
928 verify_all_options();
929 if( g.argc==4 ){
930 zSvcName = g.argv[3];
931 }else if( g.argc>4 ){
932 fossil_fatal("too many arguments for start method.");
933 }
934 hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
935 if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
936 hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName),
937 SERVICE_ALL_ACCESS);
938 if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
939 QueryServiceStatus(hSvc, &sstat);
940 if( sstat.dwCurrentState!=SERVICE_RUNNING ){
941 fossil_print("Starting service '%s'", zSvcName);
942 if( sstat.dwCurrentState!=SERVICE_START_PENDING ){
943 if( !StartServiceW(hSvc, 0, NULL) ){
944 fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
945 }
946 }
947 while( sstat.dwCurrentState!=SERVICE_RUNNING ){
948 Sleep(100);
949 fossil_print(".");
@@ -958,29 +965,28 @@
958 }else
959 if( strncmp(zMethod, "stop", n)==0 ){
960 SC_HANDLE hScm;
961 SC_HANDLE hSvc;
962 SERVICE_STATUS sstat;
963 char *zErrFmt = "unable to stop service '%s': %s";
964
965 verify_all_options();
966 if( g.argc==4 ){
967 zSvcName = g.argv[3];
968 }else if( g.argc>4 ){
969 fossil_fatal("too many arguments for stop method.");
970 }
971 hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
972 if( !hScm ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
973 hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName),
974 SERVICE_ALL_ACCESS);
975 if( !hSvc ) fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
976 QueryServiceStatus(hSvc, &sstat);
977 if( sstat.dwCurrentState!=SERVICE_STOPPED ){
978 fossil_print("Stopping service '%s'", zSvcName);
979 if( sstat.dwCurrentState!=SERVICE_STOP_PENDING ){
980 if( !ControlService(hSvc, SERVICE_CONTROL_STOP, &sstat) ){
981 fossil_fatal(zErrFmt, zSvcName, win32_get_last_errmsg());
982 }
983 }
984 while( sstat.dwCurrentState!=SERVICE_STOPPED ){
985 Sleep(100);
986 fossil_print(".");
987
--- src/winhttp.c
+++ src/winhttp.c
@@ -58,10 +58,21 @@
58 }
59 zHdr++;
60 }
61 return 0;
62 }
63
64 /*
65 ** Issue a fatal error.
66 */
67 static NORETURN void winhttp_fatal(
68 const char *zOp,
69 const char *zService,
70 const char *zErr
71 ){
72 fossil_fatal("unable to %s service '%s': %s", zOp, zService, zErr);
73 }
74
75 /*
76 ** Process a single incoming HTTP request.
77 */
78 static void win32_http_request(void *pAppData){
@@ -297,11 +308,11 @@
308 zTempPrefix = mprintf("%sfossil_server_P%d_",
309 fossil_unicode_to_utf8(zTmpPath), iPort);
310 fossil_print("Listening for %s requests on TCP port %d\n",
311 (flags&HTTP_SERVER_SCGI)!=0?"SCGI":"HTTP", iPort);
312 if( zBrowser ){
313 zBrowser = mprintf(zBrowser /*works-like:"%d"*/, iPort);
314 fossil_print("Launch webbrowser: %s\n", zBrowser);
315 fossil_system(zBrowser);
316 }
317 fossil_print("Type Ctrl-C to stop the HTTP server\n");
318 /* Set the service status to running and pass the listener socket to the
@@ -679,11 +690,10 @@
690 if( strncmp(zMethod, "create", n)==0 ){
691 SC_HANDLE hScm;
692 SC_HANDLE hSvc;
693 SERVICE_DESCRIPTIONW
694 svcDescr = {L"Fossil - Distributed Software Configuration Management"};
 
695 DWORD dwStartType = SERVICE_DEMAND_START;
696 const char *zDisplay = find_option("display", "D", 1);
697 const char *zStart = find_option("start", "S", 1);
698 const char *zUsername = find_option("username", "U", 1);
699 const char *zPassword = find_option("password", "W", 1);
@@ -714,17 +724,17 @@
724 if( strncmp(zStart, "auto", strlen(zStart))==0 ){
725 dwStartType = SERVICE_AUTO_START;
726 }else if( strncmp(zStart, "manual", strlen(zStart))==0 ){
727 dwStartType = SERVICE_DEMAND_START;
728 }else{
729 winhttp_fatal("create", zSvcName,
730 "specify 'auto' or 'manual' for the '-S|--start' option");
731 }
732 }
733 /* Process options for Fossil running as server. */
734 if( zPort && (atoi(zPort)<=0) ){
735 winhttp_fatal("create", zSvcName,
736 "port number must be in the range 1 - 65535.");
737 }
738 if( !zRepository ){
739 db_must_be_within_tree();
740 }else if( file_isdir(zRepository)==1 ){
@@ -743,11 +753,11 @@
753 if( zFileGlob ) blob_appendf(&binPath, " --files-urlenc %T", zFileGlob);
754 if( zLocalAuth ) blob_append(&binPath, " --localauth", -1);
755 blob_appendf(&binPath, " \"%s\"", g.zRepositoryName);
756 /* Create the service. */
757 hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
758 if( !hScm ) winhttp_fatal("create", zSvcName, win32_get_last_errmsg());
759 hSvc = CreateServiceW(
760 hScm, /* Handle to the SCM */
761 fossil_utf8_to_unicode(zSvcName), /* Name of the service */
762 fossil_utf8_to_unicode(zDisplay), /* Display name */
763 SERVICE_ALL_ACCESS, /* Desired access */
@@ -759,11 +769,11 @@
769 NULL, /* Tag value */
770 NULL, /* Service dependencies */
771 zUsername ? fossil_utf8_to_unicode(zUsername) : 0, /* Account */
772 fossil_utf8_to_unicode(zPassword) /* Account password */
773 );
774 if( !hSvc ) winhttp_fatal("create", zSvcName, win32_get_last_errmsg());
775 /* Set the service description. */
776 ChangeServiceConfig2W(hSvc, SERVICE_CONFIG_DESCRIPTION, &svcDescr);
777 fossil_print("Service '%s' successfully created.\n", zSvcName);
778 CloseServiceHandle(hSvc);
779 CloseServiceHandle(hScm);
@@ -770,29 +780,28 @@
780 }else
781 if( strncmp(zMethod, "delete", n)==0 ){
782 SC_HANDLE hScm;
783 SC_HANDLE hSvc;
784 SERVICE_STATUS sstat;
 
785
786 verify_all_options();
787 if( g.argc==4 ){
788 zSvcName = g.argv[3];
789 }else if( g.argc>4 ){
790 fossil_fatal("too many arguments for delete method.");
791 }
792 hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
793 if( !hScm ) winhttp_fatal("delete", zSvcName, win32_get_last_errmsg());
794 hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName),
795 SERVICE_ALL_ACCESS);
796 if( !hSvc ) winhttp_fatal("delete", zSvcName, win32_get_last_errmsg());
797 QueryServiceStatus(hSvc, &sstat);
798 if( sstat.dwCurrentState!=SERVICE_STOPPED ){
799 fossil_print("Stopping service '%s'", zSvcName);
800 if( sstat.dwCurrentState!=SERVICE_STOP_PENDING ){
801 if( !ControlService(hSvc, SERVICE_CONTROL_STOP, &sstat) ){
802 winhttp_fatal("delete", zSvcName, win32_get_last_errmsg());
803 }
804 }
805 while( sstat.dwCurrentState!=SERVICE_STOPPED ){
806 Sleep(100);
807 fossil_print(".");
@@ -802,11 +811,11 @@
811 }
812 if( !DeleteService(hSvc) ){
813 if( GetLastError()==ERROR_SERVICE_MARKED_FOR_DELETE ){
814 fossil_warning("Service '%s' already marked for delete.\n", zSvcName);
815 }else{
816 winhttp_fatal("delete", zSvcName, win32_get_last_errmsg());
817 }
818 }else{
819 fossil_print("Service '%s' successfully deleted.\n", zSvcName);
820 }
821 CloseServiceHandle(hSvc);
@@ -818,11 +827,10 @@
827 SERVICE_STATUS sstat;
828 LPQUERY_SERVICE_CONFIGW pSvcConfig;
829 LPSERVICE_DESCRIPTIONW pSvcDescr;
830 BOOL bStatus;
831 DWORD nRequired;
 
832 static const char *const zSvcTypes[] = {
833 "Driver service",
834 "File system driver service",
835 "Service runs in its own process",
836 "Service shares a process with other services",
@@ -848,21 +856,21 @@
856 zSvcName = g.argv[3];
857 }else if( g.argc>4 ){
858 fossil_fatal("too many arguments for show method.");
859 }
860 hScm = OpenSCManagerW(NULL, NULL, GENERIC_READ);
861 if( !hScm ) winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
862 hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName), GENERIC_READ);
863 if( !hSvc ) winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
864 /* Get the service configuration */
865 bStatus = QueryServiceConfigW(hSvc, NULL, 0, &nRequired);
866 if( !bStatus && GetLastError()!=ERROR_INSUFFICIENT_BUFFER ){
867 winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
868 }
869 pSvcConfig = fossil_malloc(nRequired);
870 bStatus = QueryServiceConfigW(hSvc, pSvcConfig, nRequired, &nRequired);
871 if( !bStatus ) winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
872 /* Translate the service type */
873 switch( pSvcConfig->dwServiceType ){
874 case SERVICE_KERNEL_DRIVER: zSvcType = zSvcTypes[0]; break;
875 case SERVICE_FILE_SYSTEM_DRIVER: zSvcType = zSvcTypes[1]; break;
876 case SERVICE_WIN32_OWN_PROCESS: zSvcType = zSvcTypes[2]; break;
@@ -879,19 +887,19 @@
887 }
888 /* Get the service description. */
889 bStatus = QueryServiceConfig2W(hSvc, SERVICE_CONFIG_DESCRIPTION,
890 NULL, 0, &nRequired);
891 if( !bStatus && GetLastError()!=ERROR_INSUFFICIENT_BUFFER ){
892 winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
893 }
894 pSvcDescr = fossil_malloc(nRequired);
895 bStatus = QueryServiceConfig2W(hSvc, SERVICE_CONFIG_DESCRIPTION,
896 (LPBYTE)pSvcDescr, nRequired, &nRequired);
897 if( !bStatus ) winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
898 /* Retrieves the current status of the specified service. */
899 bStatus = QueryServiceStatus(hSvc, &sstat);
900 if( !bStatus ) winhttp_fatal("show", zSvcName, win32_get_last_errmsg());
901 /* Translate the current state. */
902 switch( sstat.dwCurrentState ){
903 case SERVICE_STOPPED: zSvcState = zSvcStates[0]; break;
904 case SERVICE_START_PENDING: zSvcState = zSvcStates[1]; break;
905 case SERVICE_STOP_PENDING: zSvcState = zSvcStates[2]; break;
@@ -921,29 +929,28 @@
929 }else
930 if( strncmp(zMethod, "start", n)==0 ){
931 SC_HANDLE hScm;
932 SC_HANDLE hSvc;
933 SERVICE_STATUS sstat;
 
934
935 verify_all_options();
936 if( g.argc==4 ){
937 zSvcName = g.argv[3];
938 }else if( g.argc>4 ){
939 fossil_fatal("too many arguments for start method.");
940 }
941 hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
942 if( !hScm ) winhttp_fatal("start", zSvcName, win32_get_last_errmsg());
943 hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName),
944 SERVICE_ALL_ACCESS);
945 if( !hSvc ) winhttp_fatal("start", zSvcName, win32_get_last_errmsg());
946 QueryServiceStatus(hSvc, &sstat);
947 if( sstat.dwCurrentState!=SERVICE_RUNNING ){
948 fossil_print("Starting service '%s'", zSvcName);
949 if( sstat.dwCurrentState!=SERVICE_START_PENDING ){
950 if( !StartServiceW(hSvc, 0, NULL) ){
951 winhttp_fatal("start", zSvcName, win32_get_last_errmsg());
952 }
953 }
954 while( sstat.dwCurrentState!=SERVICE_RUNNING ){
955 Sleep(100);
956 fossil_print(".");
@@ -958,29 +965,28 @@
965 }else
966 if( strncmp(zMethod, "stop", n)==0 ){
967 SC_HANDLE hScm;
968 SC_HANDLE hSvc;
969 SERVICE_STATUS sstat;
 
970
971 verify_all_options();
972 if( g.argc==4 ){
973 zSvcName = g.argv[3];
974 }else if( g.argc>4 ){
975 fossil_fatal("too many arguments for stop method.");
976 }
977 hScm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
978 if( !hScm ) winhttp_fatal("stop", zSvcName, win32_get_last_errmsg());
979 hSvc = OpenServiceW(hScm, fossil_utf8_to_unicode(zSvcName),
980 SERVICE_ALL_ACCESS);
981 if( !hSvc ) winhttp_fatal("stop", zSvcName, win32_get_last_errmsg());
982 QueryServiceStatus(hSvc, &sstat);
983 if( sstat.dwCurrentState!=SERVICE_STOPPED ){
984 fossil_print("Stopping service '%s'", zSvcName);
985 if( sstat.dwCurrentState!=SERVICE_STOP_PENDING ){
986 if( !ControlService(hSvc, SERVICE_CONTROL_STOP, &sstat) ){
987 winhttp_fatal("stop", zSvcName, win32_get_last_errmsg());
988 }
989 }
990 while( sstat.dwCurrentState!=SERVICE_STOPPED ){
991 Sleep(100);
992 fossil_print(".");
993
+14 -11
--- src/xfer.c
+++ src/xfer.c
@@ -311,11 +311,11 @@
311311
Blob src, delta;
312312
int size = 0;
313313
int srcId = 0;
314314
315315
for(i=0; srcId==0 && i<count(azQuery); i++){
316
- srcId = db_int(0, azQuery[i], rid);
316
+ srcId = db_int(0, azQuery[i] /*works-like:"%d"*/, rid);
317317
}
318318
if( srcId>0
319319
&& (pXfer->syncPrivate || !content_is_private(srcId))
320320
&& content_get(srcId, &src)
321321
){
@@ -422,11 +422,11 @@
422422
return;
423423
}
424424
if( (pXfer->maxTime != -1 && time(NULL) >= pXfer->maxTime) ||
425425
pXfer->mxSend<=blob_size(pXfer->pOut) ){
426426
const char *zFormat = isPriv ? "igot %b 1\n" : "igot %b\n";
427
- blob_appendf(pXfer->pOut, zFormat, pUuid);
427
+ blob_appendf(pXfer->pOut, zFormat /*works-like:"%b"*/, pUuid);
428428
pXfer->nIGotSent++;
429429
blob_reset(&uuid);
430430
return;
431431
}
432432
if( nativeDelta ){
@@ -454,11 +454,11 @@
454454
}
455455
remote_has(rid);
456456
blob_reset(&uuid);
457457
#if 0
458458
if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){
459
- blob_appendf(pXfer->pOut, "\n", 1);
459
+ blob_append(pXfer->pOut, "\n", 1);
460460
}
461461
#endif
462462
}
463463
464464
/*
@@ -514,11 +514,11 @@
514514
pXfer->nFileSent++;
515515
}
516516
blob_appendf(pXfer->pOut, "%d %d\n", szU, szC);
517517
blob_append(pXfer->pOut, zContent, szC);
518518
if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){
519
- blob_appendf(pXfer->pOut, "\n", 1);
519
+ blob_append(pXfer->pOut, "\n", 1);
520520
}
521521
if( !isPrivate && srcIsPrivate ){
522522
blob_reset(&fullContent);
523523
}
524524
}
@@ -711,18 +711,18 @@
711711
blob_reset(&cksum);
712712
rid = content_put(&cluster);
713713
blob_reset(&cluster);
714714
nUncl -= nRow;
715715
nRow = 0;
716
- blob_appendf(&deleteWhere, ",%d", rid);
716
+ blob_append_sql(&deleteWhere, ",%d", rid);
717717
}
718718
}
719719
db_finalize(&q);
720720
db_multi_exec(
721721
"DELETE FROM unclustered WHERE rid NOT IN (0 %s)"
722722
" AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=unclustered.rid)",
723
- blob_str(&deleteWhere)
723
+ blob_sql_text(&deleteWhere)
724724
);
725725
blob_reset(&deleteWhere);
726726
if( nRow>0 ){
727727
md5sum_blob(&cluster, &cksum);
728728
blob_appendf(&cluster, "Z %b\n", &cksum);
@@ -1496,11 +1496,12 @@
14961496
nCardSent++;
14971497
if( (syncFlags & SYNC_PULL)==0 ) zOpType = "Push";
14981498
if( (syncFlags & SYNC_RESYNC)!=0 ) xfer.resync = 0x7fffffff;
14991499
}
15001500
if( syncFlags & SYNC_VERBOSE ){
1501
- fossil_print(zLabelFormat, "", "Bytes", "Cards", "Artifacts", "Deltas");
1501
+ fossil_print(zLabelFormat /*works-like:"%s%s%s%s%d"*/,
1502
+ "", "Bytes", "Cards", "Artifacts", "Deltas");
15021503
}
15031504
15041505
while( go ){
15051506
int newPhantom = 0;
15061507
char *zRandomness;
@@ -1593,17 +1594,18 @@
15931594
break;
15941595
}
15951596
15961597
/* Output current stats */
15971598
if( syncFlags & SYNC_VERBOSE ){
1598
- fossil_print(zValueFormat, "Sent:",
1599
+ fossil_print(zValueFormat /*works-like:"%s%d%d%d%d"*/, "Sent:",
15991600
blob_size(&send), nCardSent+xfer.nGimmeSent+xfer.nIGotSent,
16001601
xfer.nFileSent, xfer.nDeltaSent);
16011602
}else{
16021603
nRoundtrip++;
16031604
nArtifactSent += xfer.nFileSent + xfer.nDeltaSent;
1604
- fossil_print(zBriefFormat, nRoundtrip, nArtifactSent, nArtifactRcvd);
1605
+ fossil_print(zBriefFormat /*works-like:"%d%d%d"*/,
1606
+ nRoundtrip, nArtifactSent, nArtifactRcvd);
16051607
}
16061608
nCardSent = 0;
16071609
nCardRcvd = 0;
16081610
xfer.nFileSent = 0;
16091611
xfer.nDeltaSent = 0;
@@ -1900,15 +1902,16 @@
19001902
){
19011903
configure_finalize_receive();
19021904
}
19031905
origConfigRcvMask = 0;
19041906
if( nCardRcvd>0 && (syncFlags & SYNC_VERBOSE) ){
1905
- fossil_print(zValueFormat, "Received:",
1907
+ fossil_print(zValueFormat /*works-like:"%s%d%d%d%d"*/, "Received:",
19061908
blob_size(&recv), nCardRcvd,
19071909
xfer.nFileRcvd, xfer.nDeltaRcvd + xfer.nDanglingFile);
19081910
}else{
1909
- fossil_print(zBriefFormat, nRoundtrip, nArtifactSent, nArtifactRcvd);
1911
+ fossil_print(zBriefFormat /*works-like:"%d%d%d"*/,
1912
+ nRoundtrip, nArtifactSent, nArtifactRcvd);
19101913
}
19111914
blob_reset(&recv);
19121915
nCycle++;
19131916
19141917
/* If we received one or more files on the previous exchange but
19151918
--- src/xfer.c
+++ src/xfer.c
@@ -311,11 +311,11 @@
311 Blob src, delta;
312 int size = 0;
313 int srcId = 0;
314
315 for(i=0; srcId==0 && i<count(azQuery); i++){
316 srcId = db_int(0, azQuery[i], rid);
317 }
318 if( srcId>0
319 && (pXfer->syncPrivate || !content_is_private(srcId))
320 && content_get(srcId, &src)
321 ){
@@ -422,11 +422,11 @@
422 return;
423 }
424 if( (pXfer->maxTime != -1 && time(NULL) >= pXfer->maxTime) ||
425 pXfer->mxSend<=blob_size(pXfer->pOut) ){
426 const char *zFormat = isPriv ? "igot %b 1\n" : "igot %b\n";
427 blob_appendf(pXfer->pOut, zFormat, pUuid);
428 pXfer->nIGotSent++;
429 blob_reset(&uuid);
430 return;
431 }
432 if( nativeDelta ){
@@ -454,11 +454,11 @@
454 }
455 remote_has(rid);
456 blob_reset(&uuid);
457 #if 0
458 if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){
459 blob_appendf(pXfer->pOut, "\n", 1);
460 }
461 #endif
462 }
463
464 /*
@@ -514,11 +514,11 @@
514 pXfer->nFileSent++;
515 }
516 blob_appendf(pXfer->pOut, "%d %d\n", szU, szC);
517 blob_append(pXfer->pOut, zContent, szC);
518 if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){
519 blob_appendf(pXfer->pOut, "\n", 1);
520 }
521 if( !isPrivate && srcIsPrivate ){
522 blob_reset(&fullContent);
523 }
524 }
@@ -711,18 +711,18 @@
711 blob_reset(&cksum);
712 rid = content_put(&cluster);
713 blob_reset(&cluster);
714 nUncl -= nRow;
715 nRow = 0;
716 blob_appendf(&deleteWhere, ",%d", rid);
717 }
718 }
719 db_finalize(&q);
720 db_multi_exec(
721 "DELETE FROM unclustered WHERE rid NOT IN (0 %s)"
722 " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=unclustered.rid)",
723 blob_str(&deleteWhere)
724 );
725 blob_reset(&deleteWhere);
726 if( nRow>0 ){
727 md5sum_blob(&cluster, &cksum);
728 blob_appendf(&cluster, "Z %b\n", &cksum);
@@ -1496,11 +1496,12 @@
1496 nCardSent++;
1497 if( (syncFlags & SYNC_PULL)==0 ) zOpType = "Push";
1498 if( (syncFlags & SYNC_RESYNC)!=0 ) xfer.resync = 0x7fffffff;
1499 }
1500 if( syncFlags & SYNC_VERBOSE ){
1501 fossil_print(zLabelFormat, "", "Bytes", "Cards", "Artifacts", "Deltas");
 
1502 }
1503
1504 while( go ){
1505 int newPhantom = 0;
1506 char *zRandomness;
@@ -1593,17 +1594,18 @@
1593 break;
1594 }
1595
1596 /* Output current stats */
1597 if( syncFlags & SYNC_VERBOSE ){
1598 fossil_print(zValueFormat, "Sent:",
1599 blob_size(&send), nCardSent+xfer.nGimmeSent+xfer.nIGotSent,
1600 xfer.nFileSent, xfer.nDeltaSent);
1601 }else{
1602 nRoundtrip++;
1603 nArtifactSent += xfer.nFileSent + xfer.nDeltaSent;
1604 fossil_print(zBriefFormat, nRoundtrip, nArtifactSent, nArtifactRcvd);
 
1605 }
1606 nCardSent = 0;
1607 nCardRcvd = 0;
1608 xfer.nFileSent = 0;
1609 xfer.nDeltaSent = 0;
@@ -1900,15 +1902,16 @@
1900 ){
1901 configure_finalize_receive();
1902 }
1903 origConfigRcvMask = 0;
1904 if( nCardRcvd>0 && (syncFlags & SYNC_VERBOSE) ){
1905 fossil_print(zValueFormat, "Received:",
1906 blob_size(&recv), nCardRcvd,
1907 xfer.nFileRcvd, xfer.nDeltaRcvd + xfer.nDanglingFile);
1908 }else{
1909 fossil_print(zBriefFormat, nRoundtrip, nArtifactSent, nArtifactRcvd);
 
1910 }
1911 blob_reset(&recv);
1912 nCycle++;
1913
1914 /* If we received one or more files on the previous exchange but
1915
--- src/xfer.c
+++ src/xfer.c
@@ -311,11 +311,11 @@
311 Blob src, delta;
312 int size = 0;
313 int srcId = 0;
314
315 for(i=0; srcId==0 && i<count(azQuery); i++){
316 srcId = db_int(0, azQuery[i] /*works-like:"%d"*/, rid);
317 }
318 if( srcId>0
319 && (pXfer->syncPrivate || !content_is_private(srcId))
320 && content_get(srcId, &src)
321 ){
@@ -422,11 +422,11 @@
422 return;
423 }
424 if( (pXfer->maxTime != -1 && time(NULL) >= pXfer->maxTime) ||
425 pXfer->mxSend<=blob_size(pXfer->pOut) ){
426 const char *zFormat = isPriv ? "igot %b 1\n" : "igot %b\n";
427 blob_appendf(pXfer->pOut, zFormat /*works-like:"%b"*/, pUuid);
428 pXfer->nIGotSent++;
429 blob_reset(&uuid);
430 return;
431 }
432 if( nativeDelta ){
@@ -454,11 +454,11 @@
454 }
455 remote_has(rid);
456 blob_reset(&uuid);
457 #if 0
458 if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){
459 blob_append(pXfer->pOut, "\n", 1);
460 }
461 #endif
462 }
463
464 /*
@@ -514,11 +514,11 @@
514 pXfer->nFileSent++;
515 }
516 blob_appendf(pXfer->pOut, "%d %d\n", szU, szC);
517 blob_append(pXfer->pOut, zContent, szC);
518 if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){
519 blob_append(pXfer->pOut, "\n", 1);
520 }
521 if( !isPrivate && srcIsPrivate ){
522 blob_reset(&fullContent);
523 }
524 }
@@ -711,18 +711,18 @@
711 blob_reset(&cksum);
712 rid = content_put(&cluster);
713 blob_reset(&cluster);
714 nUncl -= nRow;
715 nRow = 0;
716 blob_append_sql(&deleteWhere, ",%d", rid);
717 }
718 }
719 db_finalize(&q);
720 db_multi_exec(
721 "DELETE FROM unclustered WHERE rid NOT IN (0 %s)"
722 " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=unclustered.rid)",
723 blob_sql_text(&deleteWhere)
724 );
725 blob_reset(&deleteWhere);
726 if( nRow>0 ){
727 md5sum_blob(&cluster, &cksum);
728 blob_appendf(&cluster, "Z %b\n", &cksum);
@@ -1496,11 +1496,12 @@
1496 nCardSent++;
1497 if( (syncFlags & SYNC_PULL)==0 ) zOpType = "Push";
1498 if( (syncFlags & SYNC_RESYNC)!=0 ) xfer.resync = 0x7fffffff;
1499 }
1500 if( syncFlags & SYNC_VERBOSE ){
1501 fossil_print(zLabelFormat /*works-like:"%s%s%s%s%d"*/,
1502 "", "Bytes", "Cards", "Artifacts", "Deltas");
1503 }
1504
1505 while( go ){
1506 int newPhantom = 0;
1507 char *zRandomness;
@@ -1593,17 +1594,18 @@
1594 break;
1595 }
1596
1597 /* Output current stats */
1598 if( syncFlags & SYNC_VERBOSE ){
1599 fossil_print(zValueFormat /*works-like:"%s%d%d%d%d"*/, "Sent:",
1600 blob_size(&send), nCardSent+xfer.nGimmeSent+xfer.nIGotSent,
1601 xfer.nFileSent, xfer.nDeltaSent);
1602 }else{
1603 nRoundtrip++;
1604 nArtifactSent += xfer.nFileSent + xfer.nDeltaSent;
1605 fossil_print(zBriefFormat /*works-like:"%d%d%d"*/,
1606 nRoundtrip, nArtifactSent, nArtifactRcvd);
1607 }
1608 nCardSent = 0;
1609 nCardRcvd = 0;
1610 xfer.nFileSent = 0;
1611 xfer.nDeltaSent = 0;
@@ -1900,15 +1902,16 @@
1902 ){
1903 configure_finalize_receive();
1904 }
1905 origConfigRcvMask = 0;
1906 if( nCardRcvd>0 && (syncFlags & SYNC_VERBOSE) ){
1907 fossil_print(zValueFormat /*works-like:"%s%d%d%d%d"*/, "Received:",
1908 blob_size(&recv), nCardRcvd,
1909 xfer.nFileRcvd, xfer.nDeltaRcvd + xfer.nDanglingFile);
1910 }else{
1911 fossil_print(zBriefFormat /*works-like:"%d%d%d"*/,
1912 nRoundtrip, nArtifactSent, nArtifactRcvd);
1913 }
1914 blob_reset(&recv);
1915 nCycle++;
1916
1917 /* If we received one or more files on the previous exchange but
1918
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -40,12 +40,13 @@
4040
4141
APPNAME = $(OBJDIR)\fossil$(E)
4242
4343
all: $(APPNAME)
4444
45
-$(APPNAME) : translate$E mkindex$E headers $(OBJ) $(OBJDIR)\link
45
+$(APPNAME) : translate$E mkindex$E codecheck1$E headers $(OBJ) $(OBJDIR)\link
4646
cd $(OBJDIR)
47
+ codecheck1$E $(SRC)
4748
$(DMDIR)\bin\link @link
4849
4950
$(OBJDIR)\fossil.res: $B\win\fossil.rc
5051
$(RC) $(RCFLAGS) -o$@ $**
5152
@@ -64,11 +65,14 @@
6465
$(BCC) -o$@ $**
6566
6667
mkindex$E: $(SRCDIR)\mkindex.c
6768
$(BCC) -o$@ $**
6869
69
-version$E: $B\src\mkversion.c
70
+mkversion$E: $(SRCDIR)\mkversion.c
71
+ $(BCC) -o$@ $**
72
+
73
+codecheck1$E: $(SRCDIR)\codecheck1.c
7074
$(BCC) -o$@ $**
7175
7276
$(OBJDIR)\shell$O : $(SRCDIR)\shell.c
7377
$(TCC) -o$@ -c $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) $**
7478
@@ -82,11 +86,11 @@
8286
$(TCC) -o$@ -c $**
8387
8488
$(OBJDIR)\cson_amalgamation.h : $(SRCDIR)\cson_amalgamation.h
8589
cp $@ $@
8690
87
-VERSION.h : version$E $B\manifest.uuid $B\manifest $B\VERSION
91
+VERSION.h : mkversion$E $B\manifest.uuid $B\manifest $B\VERSION
8892
+$** > $@
8993
9094
page_index.h: mkindex$E $(SRC)
9195
+$** > $@
9296
@@ -93,11 +97,11 @@
9397
clean:
9498
-del $(OBJDIR)\*.obj
9599
-del *.obj *_.c *.h *.map
96100
97101
realclean:
98
- -del $(APPNAME) translate$E mkindex$E makeheaders$E mkversion$E
102
+ -del $(APPNAME) translate$E mkindex$E makeheaders$E mkversion$E codecheck1$E
99103
100104
$(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
101105
$(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
102106
$(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
103107
$(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
104108
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -40,12 +40,13 @@
40
41 APPNAME = $(OBJDIR)\fossil$(E)
42
43 all: $(APPNAME)
44
45 $(APPNAME) : translate$E mkindex$E headers $(OBJ) $(OBJDIR)\link
46 cd $(OBJDIR)
 
47 $(DMDIR)\bin\link @link
48
49 $(OBJDIR)\fossil.res: $B\win\fossil.rc
50 $(RC) $(RCFLAGS) -o$@ $**
51
@@ -64,11 +65,14 @@
64 $(BCC) -o$@ $**
65
66 mkindex$E: $(SRCDIR)\mkindex.c
67 $(BCC) -o$@ $**
68
69 version$E: $B\src\mkversion.c
 
 
 
70 $(BCC) -o$@ $**
71
72 $(OBJDIR)\shell$O : $(SRCDIR)\shell.c
73 $(TCC) -o$@ -c $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) $**
74
@@ -82,11 +86,11 @@
82 $(TCC) -o$@ -c $**
83
84 $(OBJDIR)\cson_amalgamation.h : $(SRCDIR)\cson_amalgamation.h
85 cp $@ $@
86
87 VERSION.h : version$E $B\manifest.uuid $B\manifest $B\VERSION
88 +$** > $@
89
90 page_index.h: mkindex$E $(SRC)
91 +$** > $@
92
@@ -93,11 +97,11 @@
93 clean:
94 -del $(OBJDIR)\*.obj
95 -del *.obj *_.c *.h *.map
96
97 realclean:
98 -del $(APPNAME) translate$E mkindex$E makeheaders$E mkversion$E
99
100 $(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
101 $(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
102 $(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
103 $(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
104
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -40,12 +40,13 @@
40
41 APPNAME = $(OBJDIR)\fossil$(E)
42
43 all: $(APPNAME)
44
45 $(APPNAME) : translate$E mkindex$E codecheck1$E headers $(OBJ) $(OBJDIR)\link
46 cd $(OBJDIR)
47 codecheck1$E $(SRC)
48 $(DMDIR)\bin\link @link
49
50 $(OBJDIR)\fossil.res: $B\win\fossil.rc
51 $(RC) $(RCFLAGS) -o$@ $**
52
@@ -64,11 +65,14 @@
65 $(BCC) -o$@ $**
66
67 mkindex$E: $(SRCDIR)\mkindex.c
68 $(BCC) -o$@ $**
69
70 mkversion$E: $(SRCDIR)\mkversion.c
71 $(BCC) -o$@ $**
72
73 codecheck1$E: $(SRCDIR)\codecheck1.c
74 $(BCC) -o$@ $**
75
76 $(OBJDIR)\shell$O : $(SRCDIR)\shell.c
77 $(TCC) -o$@ -c $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) $**
78
@@ -82,11 +86,11 @@
86 $(TCC) -o$@ -c $**
87
88 $(OBJDIR)\cson_amalgamation.h : $(SRCDIR)\cson_amalgamation.h
89 cp $@ $@
90
91 VERSION.h : mkversion$E $B\manifest.uuid $B\manifest $B\VERSION
92 +$** > $@
93
94 page_index.h: mkindex$E $(SRC)
95 +$** > $@
96
@@ -93,11 +97,11 @@
97 clean:
98 -del $(OBJDIR)\*.obj
99 -del *.obj *_.c *.h *.map
100
101 realclean:
102 -del $(APPNAME) translate$E mkindex$E makeheaders$E mkversion$E codecheck1$E
103
104 $(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
105 $(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
106 $(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
107 $(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
108
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -685,10 +685,11 @@
685685
ifdef USE_WINDOWS
686686
TRANSLATE = $(subst /,\,$(OBJDIR)/translate.exe)
687687
MAKEHEADERS = $(subst /,\,$(OBJDIR)/makeheaders.exe)
688688
MKINDEX = $(subst /,\,$(OBJDIR)/mkindex.exe)
689689
VERSION = $(subst /,\,$(OBJDIR)/version.exe)
690
+CODECHECK1 = $(subst /,\,$(OBJDIR)/codecheck1.exe)
690691
CAT = type
691692
CP = copy
692693
GREP = find
693694
MV = copy
694695
RM = del /Q
@@ -697,10 +698,11 @@
697698
else
698699
TRANSLATE = $(OBJDIR)/translate.exe
699700
MAKEHEADERS = $(OBJDIR)/makeheaders.exe
700701
MKINDEX = $(OBJDIR)/mkindex.exe
701702
VERSION = $(OBJDIR)/version.exe
703
+CODECHECK1 = $(OBJDIR)/codecheck1.exe
702704
CAT = cat
703705
CP = cp
704706
GREP = grep
705707
MV = mv
706708
RM = rm -f
@@ -750,10 +752,13 @@
750752
$(BCC) -o $(MKINDEX) $(SRCDIR)/mkindex.c
751753
752754
$(VERSION): $(SRCDIR)/mkversion.c
753755
$(BCC) -o $(VERSION) $(SRCDIR)/mkversion.c
754756
757
+$(CODECHECK1): $(SRCDIR)/codecheck1.c
758
+ $(BCC) -o $(CODECHECK1) $(SRCDIR)/codecheck1.c
759
+
755760
# WARNING. DANGER. Running the test suite modifies the repository the
756761
# build is done from, i.e. the checkout belongs to. Do not sync/push
757762
# the repository after running the tests.
758763
test: $(OBJDIR) $(APPNAME)
759764
$(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -815,11 +820,12 @@
815820
816821
ifdef FOSSIL_BUILD_SSL
817822
APPTARGETS += openssl
818823
endif
819824
820
-$(APPNAME): $(OBJDIR)/headers $(OBJ) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
825
+$(APPNAME): $(OBJDIR)/headers $(CODECHECK1) $(OBJ) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
826
+ $(CODECHECK1) $(TRANS_SRC)
821827
$(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) $(OBJDIR)/fossil.o
822828
823829
# This rule prevents make from using its default rules to try build
824830
# an executable named "manifest" out of the file named "manifest.c"
825831
#
826832
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -685,10 +685,11 @@
685 ifdef USE_WINDOWS
686 TRANSLATE = $(subst /,\,$(OBJDIR)/translate.exe)
687 MAKEHEADERS = $(subst /,\,$(OBJDIR)/makeheaders.exe)
688 MKINDEX = $(subst /,\,$(OBJDIR)/mkindex.exe)
689 VERSION = $(subst /,\,$(OBJDIR)/version.exe)
 
690 CAT = type
691 CP = copy
692 GREP = find
693 MV = copy
694 RM = del /Q
@@ -697,10 +698,11 @@
697 else
698 TRANSLATE = $(OBJDIR)/translate.exe
699 MAKEHEADERS = $(OBJDIR)/makeheaders.exe
700 MKINDEX = $(OBJDIR)/mkindex.exe
701 VERSION = $(OBJDIR)/version.exe
 
702 CAT = cat
703 CP = cp
704 GREP = grep
705 MV = mv
706 RM = rm -f
@@ -750,10 +752,13 @@
750 $(BCC) -o $(MKINDEX) $(SRCDIR)/mkindex.c
751
752 $(VERSION): $(SRCDIR)/mkversion.c
753 $(BCC) -o $(VERSION) $(SRCDIR)/mkversion.c
754
 
 
 
755 # WARNING. DANGER. Running the test suite modifies the repository the
756 # build is done from, i.e. the checkout belongs to. Do not sync/push
757 # the repository after running the tests.
758 test: $(OBJDIR) $(APPNAME)
759 $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -815,11 +820,12 @@
815
816 ifdef FOSSIL_BUILD_SSL
817 APPTARGETS += openssl
818 endif
819
820 $(APPNAME): $(OBJDIR)/headers $(OBJ) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
 
821 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) $(OBJDIR)/fossil.o
822
823 # This rule prevents make from using its default rules to try build
824 # an executable named "manifest" out of the file named "manifest.c"
825 #
826
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -685,10 +685,11 @@
685 ifdef USE_WINDOWS
686 TRANSLATE = $(subst /,\,$(OBJDIR)/translate.exe)
687 MAKEHEADERS = $(subst /,\,$(OBJDIR)/makeheaders.exe)
688 MKINDEX = $(subst /,\,$(OBJDIR)/mkindex.exe)
689 VERSION = $(subst /,\,$(OBJDIR)/version.exe)
690 CODECHECK1 = $(subst /,\,$(OBJDIR)/codecheck1.exe)
691 CAT = type
692 CP = copy
693 GREP = find
694 MV = copy
695 RM = del /Q
@@ -697,10 +698,11 @@
698 else
699 TRANSLATE = $(OBJDIR)/translate.exe
700 MAKEHEADERS = $(OBJDIR)/makeheaders.exe
701 MKINDEX = $(OBJDIR)/mkindex.exe
702 VERSION = $(OBJDIR)/version.exe
703 CODECHECK1 = $(OBJDIR)/codecheck1.exe
704 CAT = cat
705 CP = cp
706 GREP = grep
707 MV = mv
708 RM = rm -f
@@ -750,10 +752,13 @@
752 $(BCC) -o $(MKINDEX) $(SRCDIR)/mkindex.c
753
754 $(VERSION): $(SRCDIR)/mkversion.c
755 $(BCC) -o $(VERSION) $(SRCDIR)/mkversion.c
756
757 $(CODECHECK1): $(SRCDIR)/codecheck1.c
758 $(BCC) -o $(CODECHECK1) $(SRCDIR)/codecheck1.c
759
760 # WARNING. DANGER. Running the test suite modifies the repository the
761 # build is done from, i.e. the checkout belongs to. Do not sync/push
762 # the repository after running the tests.
763 test: $(OBJDIR) $(APPNAME)
764 $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -815,11 +820,12 @@
820
821 ifdef FOSSIL_BUILD_SSL
822 APPTARGETS += openssl
823 endif
824
825 $(APPNAME): $(OBJDIR)/headers $(CODECHECK1) $(OBJ) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
826 $(CODECHECK1) $(TRANS_SRC)
827 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) $(OBJDIR)/fossil.o
828
829 # This rule prevents make from using its default rules to try build
830 # an executable named "manifest" out of the file named "manifest.c"
831 #
832
--- win/Makefile.mingw.mistachkin
+++ win/Makefile.mingw.mistachkin
@@ -685,10 +685,11 @@
685685
ifdef USE_WINDOWS
686686
TRANSLATE = $(subst /,\,$(OBJDIR)/translate.exe)
687687
MAKEHEADERS = $(subst /,\,$(OBJDIR)/makeheaders.exe)
688688
MKINDEX = $(subst /,\,$(OBJDIR)/mkindex.exe)
689689
VERSION = $(subst /,\,$(OBJDIR)/version.exe)
690
+CODECHECK1 = $(subst /,\,$(OBJDIR)/codecheck1.exe)
690691
CAT = type
691692
CP = copy
692693
GREP = find
693694
MV = copy
694695
RM = del /Q
@@ -697,10 +698,11 @@
697698
else
698699
TRANSLATE = $(OBJDIR)/translate.exe
699700
MAKEHEADERS = $(OBJDIR)/makeheaders.exe
700701
MKINDEX = $(OBJDIR)/mkindex.exe
701702
VERSION = $(OBJDIR)/version.exe
703
+CODECHECK1 = $(OBJDIR)/codecheck1.exe
702704
CAT = cat
703705
CP = cp
704706
GREP = grep
705707
MV = mv
706708
RM = rm -f
@@ -750,10 +752,13 @@
750752
$(BCC) -o $(MKINDEX) $(SRCDIR)/mkindex.c
751753
752754
$(VERSION): $(SRCDIR)/mkversion.c
753755
$(BCC) -o $(VERSION) $(SRCDIR)/mkversion.c
754756
757
+$(CODECHECK1): $(SRCDIR)/codecheck1.c
758
+ $(BCC) -o $(CODECHECK1) $(SRCDIR)/codecheck1.c
759
+
755760
# WARNING. DANGER. Running the test suite modifies the repository the
756761
# build is done from, i.e. the checkout belongs to. Do not sync/push
757762
# the repository after running the tests.
758763
test: $(OBJDIR) $(APPNAME)
759764
$(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -815,11 +820,12 @@
815820
816821
ifdef FOSSIL_BUILD_SSL
817822
APPTARGETS += openssl
818823
endif
819824
820
-$(APPNAME): $(OBJDIR)/headers $(OBJ) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
825
+$(APPNAME): $(OBJDIR)/headers $(CODECHECK1) $(OBJ) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
826
+ $(CODECHECK1) $(TRANS_SRC)
821827
$(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) $(OBJDIR)/fossil.o
822828
823829
# This rule prevents make from using its default rules to try build
824830
# an executable named "manifest" out of the file named "manifest.c"
825831
#
826832
--- win/Makefile.mingw.mistachkin
+++ win/Makefile.mingw.mistachkin
@@ -685,10 +685,11 @@
685 ifdef USE_WINDOWS
686 TRANSLATE = $(subst /,\,$(OBJDIR)/translate.exe)
687 MAKEHEADERS = $(subst /,\,$(OBJDIR)/makeheaders.exe)
688 MKINDEX = $(subst /,\,$(OBJDIR)/mkindex.exe)
689 VERSION = $(subst /,\,$(OBJDIR)/version.exe)
 
690 CAT = type
691 CP = copy
692 GREP = find
693 MV = copy
694 RM = del /Q
@@ -697,10 +698,11 @@
697 else
698 TRANSLATE = $(OBJDIR)/translate.exe
699 MAKEHEADERS = $(OBJDIR)/makeheaders.exe
700 MKINDEX = $(OBJDIR)/mkindex.exe
701 VERSION = $(OBJDIR)/version.exe
 
702 CAT = cat
703 CP = cp
704 GREP = grep
705 MV = mv
706 RM = rm -f
@@ -750,10 +752,13 @@
750 $(BCC) -o $(MKINDEX) $(SRCDIR)/mkindex.c
751
752 $(VERSION): $(SRCDIR)/mkversion.c
753 $(BCC) -o $(VERSION) $(SRCDIR)/mkversion.c
754
 
 
 
755 # WARNING. DANGER. Running the test suite modifies the repository the
756 # build is done from, i.e. the checkout belongs to. Do not sync/push
757 # the repository after running the tests.
758 test: $(OBJDIR) $(APPNAME)
759 $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -815,11 +820,12 @@
815
816 ifdef FOSSIL_BUILD_SSL
817 APPTARGETS += openssl
818 endif
819
820 $(APPNAME): $(OBJDIR)/headers $(OBJ) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
 
821 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) $(OBJDIR)/fossil.o
822
823 # This rule prevents make from using its default rules to try build
824 # an executable named "manifest" out of the file named "manifest.c"
825 #
826
--- win/Makefile.mingw.mistachkin
+++ win/Makefile.mingw.mistachkin
@@ -685,10 +685,11 @@
685 ifdef USE_WINDOWS
686 TRANSLATE = $(subst /,\,$(OBJDIR)/translate.exe)
687 MAKEHEADERS = $(subst /,\,$(OBJDIR)/makeheaders.exe)
688 MKINDEX = $(subst /,\,$(OBJDIR)/mkindex.exe)
689 VERSION = $(subst /,\,$(OBJDIR)/version.exe)
690 CODECHECK1 = $(subst /,\,$(OBJDIR)/codecheck1.exe)
691 CAT = type
692 CP = copy
693 GREP = find
694 MV = copy
695 RM = del /Q
@@ -697,10 +698,11 @@
698 else
699 TRANSLATE = $(OBJDIR)/translate.exe
700 MAKEHEADERS = $(OBJDIR)/makeheaders.exe
701 MKINDEX = $(OBJDIR)/mkindex.exe
702 VERSION = $(OBJDIR)/version.exe
703 CODECHECK1 = $(OBJDIR)/codecheck1.exe
704 CAT = cat
705 CP = cp
706 GREP = grep
707 MV = mv
708 RM = rm -f
@@ -750,10 +752,13 @@
752 $(BCC) -o $(MKINDEX) $(SRCDIR)/mkindex.c
753
754 $(VERSION): $(SRCDIR)/mkversion.c
755 $(BCC) -o $(VERSION) $(SRCDIR)/mkversion.c
756
757 $(CODECHECK1): $(SRCDIR)/codecheck1.c
758 $(BCC) -o $(CODECHECK1) $(SRCDIR)/codecheck1.c
759
760 # WARNING. DANGER. Running the test suite modifies the repository the
761 # build is done from, i.e. the checkout belongs to. Do not sync/push
762 # the repository after running the tests.
763 test: $(OBJDIR) $(APPNAME)
764 $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME)
@@ -815,11 +820,12 @@
820
821 ifdef FOSSIL_BUILD_SSL
822 APPTARGETS += openssl
823 endif
824
825 $(APPNAME): $(OBJDIR)/headers $(CODECHECK1) $(OBJ) $(EXTRAOBJ) $(OBJDIR)/fossil.o $(APPTARGETS)
826 $(CODECHECK1) $(TRANS_SRC)
827 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) $(OBJDIR)/fossil.o
828
829 # This rule prevents make from using its default rules to try build
830 # an executable named "manifest" out of the file named "manifest.c"
831 #
832
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -469,12 +469,13 @@
469469
!ifdef FOSSIL_BUILD_SSL
470470
APPTARGETS = $(APPTARGETS) openssl
471471
!endif
472472
!endif
473473
474
-$(APPNAME) : $(APPTARGETS) translate$E mkindex$E headers $(OBJ) $(OX)\linkopts
474
+$(APPNAME) : $(APPTARGETS) translate$E mkindex$E codecheck1$E headers $(OBJ) $(OX)\linkopts
475475
cd $(OX)
476
+ codecheck1$E $(SRC)
476477
link $(LDFLAGS) /OUT:$@ $(LIBDIR) Wsetargv.obj fossil.res @linkopts
477478
478479
$(OX)\linkopts: $B\win\Makefile.msc
479480
echo $(OX)\add.obj > $@
480481
echo $(OX)\allrepo.obj >> $@
@@ -608,11 +609,14 @@
608609
$(BCC) $**
609610
610611
mkindex$E: $(SRCDIR)\mkindex.c
611612
$(BCC) $**
612613
613
-mkversion$E: $B\src\mkversion.c
614
+mkversion$E: $(SRCDIR)\mkversion.c
615
+ $(BCC) $**
616
+
617
+codecheck1$E: $(SRCDIR)\codecheck1.c
614618
$(BCC) $**
615619
616620
$(OX)\shell$O : $(SRCDIR)\shell.c $B\win\Makefile.msc
617621
$(TCC) /Fo$@ $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) -c $(SRCDIR)\shell.c
618622
@@ -660,10 +664,12 @@
660664
-del mkindex$P
661665
-del makeheaders$E
662666
-del makeheaders$P
663667
-del mkversion$E
664668
-del mkversion$P
669
+ -del codecheck1$E
670
+ -del codecheck1$P
665671
666672
$(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
667673
$(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
668674
$(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
669675
$(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
670676
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -469,12 +469,13 @@
469 !ifdef FOSSIL_BUILD_SSL
470 APPTARGETS = $(APPTARGETS) openssl
471 !endif
472 !endif
473
474 $(APPNAME) : $(APPTARGETS) translate$E mkindex$E headers $(OBJ) $(OX)\linkopts
475 cd $(OX)
 
476 link $(LDFLAGS) /OUT:$@ $(LIBDIR) Wsetargv.obj fossil.res @linkopts
477
478 $(OX)\linkopts: $B\win\Makefile.msc
479 echo $(OX)\add.obj > $@
480 echo $(OX)\allrepo.obj >> $@
@@ -608,11 +609,14 @@
608 $(BCC) $**
609
610 mkindex$E: $(SRCDIR)\mkindex.c
611 $(BCC) $**
612
613 mkversion$E: $B\src\mkversion.c
 
 
 
614 $(BCC) $**
615
616 $(OX)\shell$O : $(SRCDIR)\shell.c $B\win\Makefile.msc
617 $(TCC) /Fo$@ $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) -c $(SRCDIR)\shell.c
618
@@ -660,10 +664,12 @@
660 -del mkindex$P
661 -del makeheaders$E
662 -del makeheaders$P
663 -del mkversion$E
664 -del mkversion$P
 
 
665
666 $(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
667 $(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
668 $(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
669 $(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
670
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -469,12 +469,13 @@
469 !ifdef FOSSIL_BUILD_SSL
470 APPTARGETS = $(APPTARGETS) openssl
471 !endif
472 !endif
473
474 $(APPNAME) : $(APPTARGETS) translate$E mkindex$E codecheck1$E headers $(OBJ) $(OX)\linkopts
475 cd $(OX)
476 codecheck1$E $(SRC)
477 link $(LDFLAGS) /OUT:$@ $(LIBDIR) Wsetargv.obj fossil.res @linkopts
478
479 $(OX)\linkopts: $B\win\Makefile.msc
480 echo $(OX)\add.obj > $@
481 echo $(OX)\allrepo.obj >> $@
@@ -608,11 +609,14 @@
609 $(BCC) $**
610
611 mkindex$E: $(SRCDIR)\mkindex.c
612 $(BCC) $**
613
614 mkversion$E: $(SRCDIR)\mkversion.c
615 $(BCC) $**
616
617 codecheck1$E: $(SRCDIR)\codecheck1.c
618 $(BCC) $**
619
620 $(OX)\shell$O : $(SRCDIR)\shell.c $B\win\Makefile.msc
621 $(TCC) /Fo$@ $(SHELL_OPTIONS) $(SQLITE_OPTIONS) $(SHELL_CFLAGS) -c $(SRCDIR)\shell.c
622
@@ -660,10 +664,12 @@
664 -del mkindex$P
665 -del makeheaders$E
666 -del makeheaders$P
667 -del mkversion$E
668 -del mkversion$P
669 -del codecheck1$E
670 -del codecheck1$P
671
672 $(OBJDIR)\json$O : $(SRCDIR)\json_detail.h
673 $(OBJDIR)\json_artifact$O : $(SRCDIR)\json_detail.h
674 $(OBJDIR)\json_branch$O : $(SRCDIR)\json_detail.h
675 $(OBJDIR)\json_config$O : $(SRCDIR)\json_detail.h
676

Keyboard Shortcuts

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