@@ -23,11 +23,11 @@
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <assert.h>
24 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
26 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The list of database user-defined fields in the TICKET table.
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The real table also contains some addition fields for internal
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** used. The internal-use fields begin with "tkt_".
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** use. The internal-use fields begin with "tkt_".
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int nField = 0;
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static struct tktFieldInfo {
32 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zName; /* Name of the database field */
33 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zValue; /* Value to store */
@@ -39,10 +39,11 @@
39 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define USEDBY_BOTH 03
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 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static u8 haveTicketChngUser = 0;/* True if TICKETCHNG.TKT_USER exists */
44 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
45 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
46 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Compare two entries in aField[] for sorting purposes
47 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
48 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int nameCmpr(const void *a, const void *b){
@@ -94,11 +95,15 @@
94 95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q, "PRAGMA table_info(ticketchng)");
95 96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( db_step(&q)==SQLITE_ROW ){
96 97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFieldName = db_column_text(&q, 1);
97 98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
haveTicketChng = 1;
98 99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( memcmp(zFieldName,"tkt_",4)==0 ){
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strcmp(zFieldName,"tkt_rid")==0 ) haveTicketChngRid = 1;
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strcmp(zFieldName+4,"rid")==0 ){
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ haveTicketChngRid = 1; /* tkt_rid */
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( strcmp(zFieldName+4,"user")==0 ){
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ haveTicketChngUser = 1; /* tkt_user */
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100 105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
101 106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
102 107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (i = fieldId(zFieldName))>=0 ){
103 108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aField[i].mUsed |= USEDBY_TICKETCHNG;
104 109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
@@ -190,11 +195,13 @@
190 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Parameter rid is the recordID for the ticket artifact in the BLOB table.
191 196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
192 197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the new rowid of the TICKET table entry.
193 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
194 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int ticket_insert(const Manifest *p, int rid, int tktid){
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob sql1, sql2, sql3;
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob sql1; /* update or replace TICKET ... */
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob sql2; /* list of TICKETCHNG's fields that are in the manifest */
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob sql3; /* list of values which correspond to the previous list */
196 203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
197 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i, j;
198 205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aUsed;
199 206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zMimetype = 0;
200 207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -211,31 +218,25 @@
211 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql1, ", tkt_ctime=coalesce(tkt_ctime,:mtime)");
212 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
213 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aUsed = fossil_malloc( nField );
214 221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(aUsed, 0, nField);
215 222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<p->nField; i++){
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zName = p->aField[i].zName;
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zBaseName = zName[0]=='+' ? zName+1 : zName;
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * const zName = p->aField[i].zName;
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * const zBaseName = zName[0]=='+' ? zName+1 : zName;
218 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
j = fieldId(zBaseName);
219 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( j<0 ) continue;
220 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aUsed[j] = 1;
221 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( aField[j].mUsed & USEDBY_TICKET ){
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zUsedByName = zName;
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zUsedByName[0]=='+' ){
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zUsedByName++;
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zName[0]=='+' ){
225 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql1,", \"%w\"=coalesce(\"%w\",'') || %Q",
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zUsedByName, zUsedByName, p->aField[i].zValue);
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zBaseName, zBaseName, p->aField[i].zValue);
227 232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_sql(&sql1,", \"%w\"=%Q", zUsedByName, p->aField[i].zValue);
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql1,", \"%w\"=%Q", zBaseName, p->aField[i].zValue);
229 234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
230 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
231 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( aField[j].mUsed & USEDBY_TICKETCHNG ){
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zUsedByName = zName;
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zUsedByName[0]=='+' ){
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zUsedByName++;
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_sql(&sql2, ",\"%w\"", zUsedByName);
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql2, ",\"%w\"", zBaseName);
237 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql3, ",%Q", p->aField[i].zValue);
238 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
239 240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strcmp(zBaseName,"mimetype")==0 ){
240 241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zMimetype = p->aField[i].zValue;
241 242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -254,16 +255,20 @@
254 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q, "%s", blob_sql_text(&sql1));
255 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_double(&q, ":mtime", p->rDate);
256 257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_step(&q);
257 258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
258 259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&sql1);
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( blob_size(&sql2)>0 || haveTicketChngRid ){
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(&sql2)>0 || haveTicketChngRid || haveTicketChngUser ){
260 261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fromTkt = 0;
261 262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( haveTicketChngRid ){
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(&sql2, ",tkt_rid", -1);
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_literal(&sql2, ",tkt_rid");
263 264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql3, ",%d", rid);
264 265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( haveTicketChngUser && p->zUser ){
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_literal(&sql2, ",tkt_user");
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql3, ",%Q", p->zUser);
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
265 270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nField; i++){
266 271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( aUsed[i]==0
267 272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& (aField[i].mUsed & USEDBY_BOTH)==USEDBY_BOTH
268 273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
269 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *z = aField[i].zName;
270 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!