@@ -40,10 +40,13 @@
40 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static u8 haveTicket = 0; /* True if the TICKET table exists */
41 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static u8 haveTicketCTime = 0; /* True if TICKET.TKT_CTIME exists */
42 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static u8 haveTicketChng = 0; /* True if the TICKETCHNG table exists */
43 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static u8 haveTicketChngRid = 0; /* True if TICKETCHNG.TKT_RID exists */
44 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static u8 haveTicketChngUser = 0;/* True if TICKETCHNG.TKT_USER exists */
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static u8 useTicketGenMt = 0; /* use generated TICKET.MIMETYPE */
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static u8 useTicketChngGenMt = 0;/* use generated TICKETCHNG.MIMETYPE */
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
45 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
46 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
47 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Compare two entries in aField[] for sorting purposes
48 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
49 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int nameCmpr(const void *a, const void *b){
@@ -70,11 +73,11 @@
70 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The haveTicket and haveTicketChng variables are set to 1 if the TICKET and
71 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** TICKETCHANGE tables exist, respectively.
72 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
73 76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void getAllTicketFields(void){
74 77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, noRegularMimetype;
76 79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int once = 0;
77 80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( once ) return;
78 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
once = 1;
79 82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q, "PRAGMA table_info(ticket)");
80 83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( db_step(&q)==SQLITE_ROW ){
@@ -115,13 +118,25 @@
115 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aField[nField].mUsed = USEDBY_TICKETCHNG;
116 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nField++;
117 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
118 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
119 122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
qsort(aField, nField, sizeof(aField[0]), nameCmpr);
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ noRegularMimetype = 1;
120 124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nField; i++){
121 125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aField[i].zValue = "";
122 126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aField[i].zAppend = 0;
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strcmp(aField[i].zName,"mimetype")==0 ){
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ noRegularMimetype = 0;
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( noRegularMimetype ){ /* check for generated "mimetype" columns */
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ useTicketGenMt = db_exists(
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT 1 FROM pragma_table_xinfo('ticket') "
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "WHERE name = 'mimetype'");
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ useTicketChngGenMt = db_exists(
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT 1 FROM pragma_table_xinfo('ticketchng') "
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "WHERE name = 'mimetype'");
123 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
124 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
125 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
126 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
127 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Query the database for all TICKET fields for the specific
@@ -194,18 +209,18 @@
194 209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
195 210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Parameter rid is the recordID for the ticket artifact in the BLOB table.
196 211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
197 212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the new rowid of the TICKET table entry.
198 213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int ticket_insert(const Manifest *p, int rid, int tktid){
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int ticket_insert(const Manifest *p, const int rid, int tktid){
200 215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob sql1; /* update or replace TICKET ... */
201 216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob sql2; /* list of TICKETCHNG's fields that are in the manifest */
202 217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob sql3; /* list of values which correspond to the previous list */
203 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
204 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i, j;
205 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aUsed;
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zMimetype = 0;
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mimetype_tkt = MT_NONE, mimetype_tktchng = MT_NONE;
207 222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
208 223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( tktid==0 ){
209 224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec("INSERT INTO ticket(tkt_uuid, tkt_mtime) "
210 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"VALUES(%Q, 0)", p->zTicketUuid);
211 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tktid = db_last_insert_rowid();
@@ -236,27 +251,30 @@
236 251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( aField[j].mUsed & USEDBY_TICKETCHNG ){
237 252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql2, ",\"%w\"", zBaseName);
238 253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql3, ",%Q", p->aField[i].zValue);
239 254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
240 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strcmp(zBaseName,"mimetype")==0 ){
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zMimetype = p->aField[i].zValue;
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rid>0 ){
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<p->nField; i++){
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zName = p->aField[i].zName;
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zBaseName = zName[0]=='+' ? zName+1 : zName;
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- j = fieldId(zBaseName);
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( j<0 ) continue;
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- backlink_extract(p->aField[i].zValue, zMimetype, rid, BKLNK_TICKET,
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->rDate, i==0);
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zMimetype = p->aField[i].zValue;
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* "mimetype" is a regular column => these two flags must be 0 */
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert(!useTicketGenMt);
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert(!useTicketChngGenMt);
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype_tkt = mimetype_tktchng = parse_mimetype( zMimetype );
252 261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
253 262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
254 263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql1, " WHERE tkt_id=%d", tktid);
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( useTicketGenMt ){
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_literal(&sql1, " RETURNING mimetype");
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
255 267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q, "%s", blob_sql_text(&sql1));
256 268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_double(&q, ":mtime", p->rDate);
257 269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_step(&q);
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( useTicketGenMt ){
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype_tkt = parse_mimetype( db_column_text(&q,0) );
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !useTicketChngGenMt ){
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype_tktchng = mimetype_tkt;
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
258 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
259 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&sql1);
260 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_size(&sql2)>0 || haveTicketChngRid || haveTicketChngUser ){
261 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fromTkt = 0;
262 280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( haveTicketChngRid ){
@@ -278,25 +296,55 @@
278 296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql3, ",\"%w\"", z);
279 297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
280 298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
281 299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fromTkt ){
282 300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT %d,:mtime%s FROM ticket WHERE tkt_id=%d",
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT %d,:mtime%s FROM ticket WHERE tkt_id=%d%s",
284 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_sql_text(&sql2), tktid,
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_sql_text(&sql3), tktid);
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_sql_text(&sql3), tktid,
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ useTicketChngGenMt ? " RETURNING mimetype" : "");
286 305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
287 306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q, "INSERT INTO ticketchng(tkt_id,tkt_mtime%s)"
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "VALUES(%d,:mtime%s)",
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_sql_text(&sql2), tktid, blob_sql_text(&sql3));
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "VALUES(%d,:mtime%s)%s",
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_sql_text(&sql2), tktid, blob_sql_text(&sql3),
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ useTicketChngGenMt ? " RETURNING mimetype" : "");
290 310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
291 311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_double(&q, ":mtime", p->rDate);
292 312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_step(&q);
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( useTicketChngGenMt ){
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype_tktchng = parse_mimetype( db_column_text(&q, 0) );
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* substitute NULL with a value generated within another table */
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !useTicketGenMt ){
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype_tkt = mimetype_tktchng;
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( mimetype_tktchng==MT_NONE ){
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype_tktchng = mimetype_tkt;
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( mimetype_tkt==MT_NONE ){
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype_tkt = mimetype_tktchng;
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
293 324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
294 325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
295 326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&sql2);
296 327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&sql3);
297 328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(aUsed);
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rid>0 ){ /* extract backlinks */
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bReplace = 1, mimetype;
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->nField; i++){
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zName = p->aField[i].zName;
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zBaseName = zName[0]=='+' ? zName+1 : zName;
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ j = fieldId(zBaseName);
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( j<0 ) continue;
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aField[j].mUsed & USEDBY_TICKETCHNG ){
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype = mimetype_tktchng;
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype = mimetype_tkt;
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ backlink_extract(p->aField[i].zValue, mimetype, rid, BKLNK_TICKET,
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->rDate, bReplace);
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bReplace = 0;
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
298 346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return tktid;
299 347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
300 348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
301 349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
302 350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Returns non-zero if moderation is required for ticket changes and ticket
303 351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!