@@ -34,12 +34,14 @@
34 34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zAppend; /* Value to append */
35 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned mUsed; /* 01: TICKET 02: TICKETCHNG */
36 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} *aField;
37 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define USEDBY_TICKET 01
38 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define USEDBY_TICKETCHNG 02
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define USEDBY_BOTH 03
39 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int haveTicket = 0; /* True if the TICKET table exists */
40 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int haveTicketChng = 0; /* True if the TICKETCHNG table exists */
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int haveTicketChngRid = 0; /* True if TICKETCHNG.TKT_RID exists */
41 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
42 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
43 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Compare two entries in aField[] for sorting purposes
44 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
45 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int nameCmpr(const void *a, const void *b){
@@ -87,10 +89,11 @@
87 89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
88 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q, "PRAGMA table_info(ticketchng)");
89 91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( db_step(&q)==SQLITE_ROW ){
90 92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFieldName = db_column_text(&q, 1);
91 93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
haveTicketChng = 1;
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strcmp(zFieldName,"tkt_rid")==0 ) haveTicketChngRid = 1;
92 95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( memcmp(zFieldName,"tkt_",4)==0 ) continue;
93 96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (i = fieldId(zFieldName))>=0 ){
94 97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aField[i].mUsed |= USEDBY_TICKETCHNG;
95 98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
96 99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -183,10 +186,11 @@
183 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
184 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int ticket_insert(const Manifest *p, int rid, int tktid){
185 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob sql1, sql2, sql3;
186 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
187 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i, j;
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aUsed;
188 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
189 193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( tktid==0 ){
190 194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec("INSERT INTO ticket(tkt_uuid, tkt_mtime) "
191 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"VALUES(%Q, 0)", p->zTicketUuid);
192 196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tktid = db_last_insert_rowid();
@@ -193,22 +197,22 @@
193 197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
194 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&sql1);
195 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&sql2);
196 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&sql3);
197 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&sql1, "UPDATE OR REPLACE ticket SET tkt_mtime=:mtime");
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aUsed = fossil_malloc( nField );
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(aUsed, 0, nField);
198 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<p->nField; i++){
199 205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName = p->aField[i].zName;
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zName[0]=='+' ){
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zName++;
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (j = fieldId(zName))<0 ) continue;
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aField[j].mUsed & USEDBY_TICKET ){
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (j = fieldId(zName))<0 ) continue;
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aUsed[j] = 1;
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aField[j].mUsed & USEDBY_TICKET ){
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zName[0]=='+' ){
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zName++;
204 211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&sql1,", %s=coalesce(%s,'') || %Q",
205 212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zName, zName, p->aField[i].zValue);
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (j = fieldId(zName))<0 ) continue;
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aField[j].mUsed & USEDBY_TICKET ){
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
210 214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&sql1,", %s=%Q", zName, p->aField[i].zValue);
211 215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
212 216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
213 217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( aField[j].mUsed & USEDBY_TICKETCHNG ){
214 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&sql2, ",%s", zName);
@@ -223,19 +227,40 @@
223 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_double(&q, ":mtime", p->rDate);
224 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_step(&q);
225 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
226 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&sql1);
227 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_size(&sql2)>0 ){
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "VALUES(%d,:mtime%s)",
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_str(&sql2), tktid, blob_str(&sql3));
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fromTkt = 0;
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( haveTicketChngRid ){
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&sql2, ",tkt_rid", -1);
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql3, ",%d", rid);
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<nField; i++){
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aUsed[i]==0
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (aField[i].mUsed & USEDBY_BOTH)==USEDBY_BOTH
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fromTkt = 1;
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql2, ",%s", aField[i].zName);
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql3, ",%s", aField[i].zName);
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fromTkt ){
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT %d,:mtime%s FROM ticket WHERE tkt_id=%d",
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_str(&sql2), tktid, blob_str(&sql3), tktid);
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "VALUES(%d,:mtime%s)",
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_str(&sql2), tktid, blob_str(&sql3));
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
231 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_double(&q, ":mtime", p->rDate);
232 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_step(&q);
233 257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
234 258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
235 259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&sql2);
236 260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&sql3);
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(aUsed);
237 262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return tktid;
238 263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
239 264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
240 265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
241 266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Rebuild an entire entry in the TICKET table
@@ -268,10 +293,11 @@
268 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
269 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
createFlag = 0;
270 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
271 296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
272 297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
273 299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
274 300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
275 301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Create the TH1 interpreter and load the "common" code.
276 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
277 303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void ticket_init(void){
@@ -328,10 +354,32 @@
328 354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ticket_rebuild_entry(zName);
329 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
330 356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
331 357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_end_transaction(0);
332 358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: test-ticket-rebuild
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil test-ticket-rebuild TICKETID|all
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Rebuild the TICKET and TICKETCHNG tables for the given ticket ID
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or for ALL.
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void test_ticket_rebuild(void){
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_find_and_open_repository(0, 0);
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc!=3 ) usage("TICKETID|all");
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strcmp(g.argv[2], "all")==0 ){
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ticket_rebuild();
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zUuid;
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUuid = db_text(0, "SELECT substr(tagname,5) FROM tag"
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE tagname GLOB 'tkt-%q*'", g.argv[2]);
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zUuid==0 ) fossil_fatal("no such ticket: %s", g.argv[2]);
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ticket_rebuild_entry(zUuid);
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
333 381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
334 382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
335 383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** For trouble-shooting purposes, render a dump of the aField[] table to
336 384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the webpage currently under construction.
337 385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
338 386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!