Fossil SCM

If <var>TICKETCHNG</var> table has <var>TKT_USER</var> column then make the values in that column match to the corresponding [/doc/tkt-ucard/www/fileformat.wiki#tktchng|U-cards]. Add <var>TKT_USER</var> to the default schema. See [forum:/forumthread/5593538afb7746bf|forum thread 5593538afb77] for rationale.

george 2022-05-13 23:35 trunk merge
Commit cf00d07c340e2d0a19ec487894ce03025f4f0e44ab390221a23bcb1167e2bae4
--- src/schema.c
+++ src/schema.c
@@ -458,10 +458,11 @@
458458
@ CREATE TABLE ticketchng(
459459
@ -- Do not change any column that begins with tkt_
460460
@ tkt_id INTEGER REFERENCES ticket,
461461
@ tkt_rid INTEGER REFERENCES blob,
462462
@ tkt_mtime DATE,
463
+@ tkt_user TEXT,
463464
@ -- Add as many fields as required below this line
464465
@ login TEXT,
465466
@ username TEXT,
466467
@ mimetype TEXT,
467468
@ icomment TEXT
468469
--- src/schema.c
+++ src/schema.c
@@ -458,10 +458,11 @@
458 @ CREATE TABLE ticketchng(
459 @ -- Do not change any column that begins with tkt_
460 @ tkt_id INTEGER REFERENCES ticket,
461 @ tkt_rid INTEGER REFERENCES blob,
462 @ tkt_mtime DATE,
 
463 @ -- Add as many fields as required below this line
464 @ login TEXT,
465 @ username TEXT,
466 @ mimetype TEXT,
467 @ icomment TEXT
468
--- src/schema.c
+++ src/schema.c
@@ -458,10 +458,11 @@
458 @ CREATE TABLE ticketchng(
459 @ -- Do not change any column that begins with tkt_
460 @ tkt_id INTEGER REFERENCES ticket,
461 @ tkt_rid INTEGER REFERENCES blob,
462 @ tkt_mtime DATE,
463 @ tkt_user TEXT,
464 @ -- Add as many fields as required below this line
465 @ login TEXT,
466 @ username TEXT,
467 @ mimetype TEXT,
468 @ icomment TEXT
469
+22 -17
--- src/tkt.c
+++ src/tkt.c
@@ -23,11 +23,11 @@
2323
#include <assert.h>
2424
2525
/*
2626
** The list of database user-defined fields in the TICKET table.
2727
** The real table also contains some addition fields for internal
28
-** used. The internal-use fields begin with "tkt_".
28
+** use. The internal-use fields begin with "tkt_".
2929
*/
3030
static int nField = 0;
3131
static struct tktFieldInfo {
3232
char *zName; /* Name of the database field */
3333
char *zValue; /* Value to store */
@@ -39,10 +39,11 @@
3939
#define USEDBY_BOTH 03
4040
static u8 haveTicket = 0; /* True if the TICKET table exists */
4141
static u8 haveTicketCTime = 0; /* True if TICKET.TKT_CTIME exists */
4242
static u8 haveTicketChng = 0; /* True if the TICKETCHNG table exists */
4343
static u8 haveTicketChngRid = 0; /* True if TICKETCHNG.TKT_RID exists */
44
+static u8 haveTicketChngUser = 0;/* True if TICKETCHNG.TKT_USER exists */
4445
4546
/*
4647
** Compare two entries in aField[] for sorting purposes
4748
*/
4849
static int nameCmpr(const void *a, const void *b){
@@ -94,11 +95,15 @@
9495
db_prepare(&q, "PRAGMA table_info(ticketchng)");
9596
while( db_step(&q)==SQLITE_ROW ){
9697
const char *zFieldName = db_column_text(&q, 1);
9798
haveTicketChng = 1;
9899
if( memcmp(zFieldName,"tkt_",4)==0 ){
99
- if( strcmp(zFieldName,"tkt_rid")==0 ) haveTicketChngRid = 1;
100
+ if( strcmp(zFieldName+4,"rid")==0 ){
101
+ haveTicketChngRid = 1; /* tkt_rid */
102
+ }else if( strcmp(zFieldName+4,"user")==0 ){
103
+ haveTicketChngUser = 1; /* tkt_user */
104
+ }
100105
continue;
101106
}
102107
if( (i = fieldId(zFieldName))>=0 ){
103108
aField[i].mUsed |= USEDBY_TICKETCHNG;
104109
continue;
@@ -190,11 +195,13 @@
190195
** Parameter rid is the recordID for the ticket artifact in the BLOB table.
191196
**
192197
** Return the new rowid of the TICKET table entry.
193198
*/
194199
static int ticket_insert(const Manifest *p, int rid, int tktid){
195
- Blob sql1, sql2, sql3;
200
+ Blob sql1; /* update or replace TICKET ... */
201
+ Blob sql2; /* list of TICKETCHNG's fields that are in the manifest */
202
+ Blob sql3; /* list of values which correspond to the previous list */
196203
Stmt q;
197204
int i, j;
198205
char *aUsed;
199206
const char *zMimetype = 0;
200207
@@ -211,31 +218,25 @@
211218
blob_append_sql(&sql1, ", tkt_ctime=coalesce(tkt_ctime,:mtime)");
212219
}
213220
aUsed = fossil_malloc( nField );
214221
memset(aUsed, 0, nField);
215222
for(i=0; i<p->nField; i++){
216
- const char *zName = p->aField[i].zName;
217
- const char *zBaseName = zName[0]=='+' ? zName+1 : zName;
223
+ const char * const zName = p->aField[i].zName;
224
+ const char * const zBaseName = zName[0]=='+' ? zName+1 : zName;
218225
j = fieldId(zBaseName);
219226
if( j<0 ) continue;
220227
aUsed[j] = 1;
221228
if( aField[j].mUsed & USEDBY_TICKET ){
222
- const char *zUsedByName = zName;
223
- if( zUsedByName[0]=='+' ){
224
- zUsedByName++;
229
+ if( zName[0]=='+' ){
225230
blob_append_sql(&sql1,", \"%w\"=coalesce(\"%w\",'') || %Q",
226
- zUsedByName, zUsedByName, p->aField[i].zValue);
231
+ zBaseName, zBaseName, p->aField[i].zValue);
227232
}else{
228
- blob_append_sql(&sql1,", \"%w\"=%Q", zUsedByName, p->aField[i].zValue);
233
+ blob_append_sql(&sql1,", \"%w\"=%Q", zBaseName, p->aField[i].zValue);
229234
}
230235
}
231236
if( aField[j].mUsed & USEDBY_TICKETCHNG ){
232
- const char *zUsedByName = zName;
233
- if( zUsedByName[0]=='+' ){
234
- zUsedByName++;
235
- }
236
- blob_append_sql(&sql2, ",\"%w\"", zUsedByName);
237
+ blob_append_sql(&sql2, ",\"%w\"", zBaseName);
237238
blob_append_sql(&sql3, ",%Q", p->aField[i].zValue);
238239
}
239240
if( strcmp(zBaseName,"mimetype")==0 ){
240241
zMimetype = p->aField[i].zValue;
241242
}
@@ -254,16 +255,20 @@
254255
db_prepare(&q, "%s", blob_sql_text(&sql1));
255256
db_bind_double(&q, ":mtime", p->rDate);
256257
db_step(&q);
257258
db_finalize(&q);
258259
blob_reset(&sql1);
259
- if( blob_size(&sql2)>0 || haveTicketChngRid ){
260
+ if( blob_size(&sql2)>0 || haveTicketChngRid || haveTicketChngUser ){
260261
int fromTkt = 0;
261262
if( haveTicketChngRid ){
262
- blob_append(&sql2, ",tkt_rid", -1);
263
+ blob_append_literal(&sql2, ",tkt_rid");
263264
blob_append_sql(&sql3, ",%d", rid);
264265
}
266
+ if( haveTicketChngUser && p->zUser ){
267
+ blob_append_literal(&sql2, ",tkt_user");
268
+ blob_append_sql(&sql3, ",%Q", p->zUser);
269
+ }
265270
for(i=0; i<nField; i++){
266271
if( aUsed[i]==0
267272
&& (aField[i].mUsed & USEDBY_BOTH)==USEDBY_BOTH
268273
){
269274
const char *z = aField[i].zName;
270275
--- src/tkt.c
+++ src/tkt.c
@@ -23,11 +23,11 @@
23 #include <assert.h>
24
25 /*
26 ** The list of database user-defined fields in the TICKET table.
27 ** The real table also contains some addition fields for internal
28 ** used. The internal-use fields begin with "tkt_".
29 */
30 static int nField = 0;
31 static struct tktFieldInfo {
32 char *zName; /* Name of the database field */
33 char *zValue; /* Value to store */
@@ -39,10 +39,11 @@
39 #define USEDBY_BOTH 03
40 static u8 haveTicket = 0; /* True if the TICKET table exists */
41 static u8 haveTicketCTime = 0; /* True if TICKET.TKT_CTIME exists */
42 static u8 haveTicketChng = 0; /* True if the TICKETCHNG table exists */
43 static u8 haveTicketChngRid = 0; /* True if TICKETCHNG.TKT_RID exists */
 
44
45 /*
46 ** Compare two entries in aField[] for sorting purposes
47 */
48 static int nameCmpr(const void *a, const void *b){
@@ -94,11 +95,15 @@
94 db_prepare(&q, "PRAGMA table_info(ticketchng)");
95 while( db_step(&q)==SQLITE_ROW ){
96 const char *zFieldName = db_column_text(&q, 1);
97 haveTicketChng = 1;
98 if( memcmp(zFieldName,"tkt_",4)==0 ){
99 if( strcmp(zFieldName,"tkt_rid")==0 ) haveTicketChngRid = 1;
 
 
 
 
100 continue;
101 }
102 if( (i = fieldId(zFieldName))>=0 ){
103 aField[i].mUsed |= USEDBY_TICKETCHNG;
104 continue;
@@ -190,11 +195,13 @@
190 ** Parameter rid is the recordID for the ticket artifact in the BLOB table.
191 **
192 ** Return the new rowid of the TICKET table entry.
193 */
194 static int ticket_insert(const Manifest *p, int rid, int tktid){
195 Blob sql1, sql2, sql3;
 
 
196 Stmt q;
197 int i, j;
198 char *aUsed;
199 const char *zMimetype = 0;
200
@@ -211,31 +218,25 @@
211 blob_append_sql(&sql1, ", tkt_ctime=coalesce(tkt_ctime,:mtime)");
212 }
213 aUsed = fossil_malloc( nField );
214 memset(aUsed, 0, nField);
215 for(i=0; i<p->nField; i++){
216 const char *zName = p->aField[i].zName;
217 const char *zBaseName = zName[0]=='+' ? zName+1 : zName;
218 j = fieldId(zBaseName);
219 if( j<0 ) continue;
220 aUsed[j] = 1;
221 if( aField[j].mUsed & USEDBY_TICKET ){
222 const char *zUsedByName = zName;
223 if( zUsedByName[0]=='+' ){
224 zUsedByName++;
225 blob_append_sql(&sql1,", \"%w\"=coalesce(\"%w\",'') || %Q",
226 zUsedByName, zUsedByName, p->aField[i].zValue);
227 }else{
228 blob_append_sql(&sql1,", \"%w\"=%Q", zUsedByName, p->aField[i].zValue);
229 }
230 }
231 if( aField[j].mUsed & USEDBY_TICKETCHNG ){
232 const char *zUsedByName = zName;
233 if( zUsedByName[0]=='+' ){
234 zUsedByName++;
235 }
236 blob_append_sql(&sql2, ",\"%w\"", zUsedByName);
237 blob_append_sql(&sql3, ",%Q", p->aField[i].zValue);
238 }
239 if( strcmp(zBaseName,"mimetype")==0 ){
240 zMimetype = p->aField[i].zValue;
241 }
@@ -254,16 +255,20 @@
254 db_prepare(&q, "%s", blob_sql_text(&sql1));
255 db_bind_double(&q, ":mtime", p->rDate);
256 db_step(&q);
257 db_finalize(&q);
258 blob_reset(&sql1);
259 if( blob_size(&sql2)>0 || haveTicketChngRid ){
260 int fromTkt = 0;
261 if( haveTicketChngRid ){
262 blob_append(&sql2, ",tkt_rid", -1);
263 blob_append_sql(&sql3, ",%d", rid);
264 }
 
 
 
 
265 for(i=0; i<nField; i++){
266 if( aUsed[i]==0
267 && (aField[i].mUsed & USEDBY_BOTH)==USEDBY_BOTH
268 ){
269 const char *z = aField[i].zName;
270
--- src/tkt.c
+++ src/tkt.c
@@ -23,11 +23,11 @@
23 #include <assert.h>
24
25 /*
26 ** The list of database user-defined fields in the TICKET table.
27 ** The real table also contains some addition fields for internal
28 ** use. The internal-use fields begin with "tkt_".
29 */
30 static int nField = 0;
31 static struct tktFieldInfo {
32 char *zName; /* Name of the database field */
33 char *zValue; /* Value to store */
@@ -39,10 +39,11 @@
39 #define USEDBY_BOTH 03
40 static u8 haveTicket = 0; /* True if the TICKET table exists */
41 static u8 haveTicketCTime = 0; /* True if TICKET.TKT_CTIME exists */
42 static u8 haveTicketChng = 0; /* True if the TICKETCHNG table exists */
43 static u8 haveTicketChngRid = 0; /* True if TICKETCHNG.TKT_RID exists */
44 static u8 haveTicketChngUser = 0;/* True if TICKETCHNG.TKT_USER exists */
45
46 /*
47 ** Compare two entries in aField[] for sorting purposes
48 */
49 static int nameCmpr(const void *a, const void *b){
@@ -94,11 +95,15 @@
95 db_prepare(&q, "PRAGMA table_info(ticketchng)");
96 while( db_step(&q)==SQLITE_ROW ){
97 const char *zFieldName = db_column_text(&q, 1);
98 haveTicketChng = 1;
99 if( memcmp(zFieldName,"tkt_",4)==0 ){
100 if( strcmp(zFieldName+4,"rid")==0 ){
101 haveTicketChngRid = 1; /* tkt_rid */
102 }else if( strcmp(zFieldName+4,"user")==0 ){
103 haveTicketChngUser = 1; /* tkt_user */
104 }
105 continue;
106 }
107 if( (i = fieldId(zFieldName))>=0 ){
108 aField[i].mUsed |= USEDBY_TICKETCHNG;
109 continue;
@@ -190,11 +195,13 @@
195 ** Parameter rid is the recordID for the ticket artifact in the BLOB table.
196 **
197 ** Return the new rowid of the TICKET table entry.
198 */
199 static int ticket_insert(const Manifest *p, int rid, int tktid){
200 Blob sql1; /* update or replace TICKET ... */
201 Blob sql2; /* list of TICKETCHNG's fields that are in the manifest */
202 Blob sql3; /* list of values which correspond to the previous list */
203 Stmt q;
204 int i, j;
205 char *aUsed;
206 const char *zMimetype = 0;
207
@@ -211,31 +218,25 @@
218 blob_append_sql(&sql1, ", tkt_ctime=coalesce(tkt_ctime,:mtime)");
219 }
220 aUsed = fossil_malloc( nField );
221 memset(aUsed, 0, nField);
222 for(i=0; i<p->nField; i++){
223 const char * const zName = p->aField[i].zName;
224 const char * const zBaseName = zName[0]=='+' ? zName+1 : zName;
225 j = fieldId(zBaseName);
226 if( j<0 ) continue;
227 aUsed[j] = 1;
228 if( aField[j].mUsed & USEDBY_TICKET ){
229 if( zName[0]=='+' ){
 
 
230 blob_append_sql(&sql1,", \"%w\"=coalesce(\"%w\",'') || %Q",
231 zBaseName, zBaseName, p->aField[i].zValue);
232 }else{
233 blob_append_sql(&sql1,", \"%w\"=%Q", zBaseName, p->aField[i].zValue);
234 }
235 }
236 if( aField[j].mUsed & USEDBY_TICKETCHNG ){
237 blob_append_sql(&sql2, ",\"%w\"", zBaseName);
 
 
 
 
238 blob_append_sql(&sql3, ",%Q", p->aField[i].zValue);
239 }
240 if( strcmp(zBaseName,"mimetype")==0 ){
241 zMimetype = p->aField[i].zValue;
242 }
@@ -254,16 +255,20 @@
255 db_prepare(&q, "%s", blob_sql_text(&sql1));
256 db_bind_double(&q, ":mtime", p->rDate);
257 db_step(&q);
258 db_finalize(&q);
259 blob_reset(&sql1);
260 if( blob_size(&sql2)>0 || haveTicketChngRid || haveTicketChngUser ){
261 int fromTkt = 0;
262 if( haveTicketChngRid ){
263 blob_append_literal(&sql2, ",tkt_rid");
264 blob_append_sql(&sql3, ",%d", rid);
265 }
266 if( haveTicketChngUser && p->zUser ){
267 blob_append_literal(&sql2, ",tkt_user");
268 blob_append_sql(&sql3, ",%Q", p->zUser);
269 }
270 for(i=0; i<nField; i++){
271 if( aUsed[i]==0
272 && (aField[i].mUsed & USEDBY_BOTH)==USEDBY_BOTH
273 ){
274 const char *z = aField[i].zName;
275
--- src/tktsetup.c
+++ src/tktsetup.c
@@ -86,10 +86,11 @@
8686
@ CREATE TABLE ticketchng(
8787
@ -- Do not change any column that begins with tkt_
8888
@ tkt_id INTEGER REFERENCES ticket,
8989
@ tkt_rid INTEGER REFERENCES blob,
9090
@ tkt_mtime DATE,
91
+@ tkt_user TEXT,
9192
@ -- Add as many fields as required below this line
9293
@ login TEXT,
9394
@ username TEXT,
9495
@ mimetype TEXT,
9596
@ icomment TEXT
9697
--- src/tktsetup.c
+++ src/tktsetup.c
@@ -86,10 +86,11 @@
86 @ CREATE TABLE ticketchng(
87 @ -- Do not change any column that begins with tkt_
88 @ tkt_id INTEGER REFERENCES ticket,
89 @ tkt_rid INTEGER REFERENCES blob,
90 @ tkt_mtime DATE,
 
91 @ -- Add as many fields as required below this line
92 @ login TEXT,
93 @ username TEXT,
94 @ mimetype TEXT,
95 @ icomment TEXT
96
--- src/tktsetup.c
+++ src/tktsetup.c
@@ -86,10 +86,11 @@
86 @ CREATE TABLE ticketchng(
87 @ -- Do not change any column that begins with tkt_
88 @ tkt_id INTEGER REFERENCES ticket,
89 @ tkt_rid INTEGER REFERENCES blob,
90 @ tkt_mtime DATE,
91 @ tkt_user TEXT,
92 @ -- Add as many fields as required below this line
93 @ login TEXT,
94 @ username TEXT,
95 @ mimetype TEXT,
96 @ icomment TEXT
97

Keyboard Shortcuts

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