Fossil SCM
Added more logging, added admin_log() to printf checker.
Commit
f63d68d4d32cf1bb300a565670f467ddfd7612df
Parent
1526dd4c7e0c6bb…
5 files changed
+1
+2
+1
-1
+10
-1
+3
+1
| --- src/codecheck1.c | ||
| +++ src/codecheck1.c | ||
| @@ -309,10 +309,11 @@ | ||
| 309 | 309 | struct { |
| 310 | 310 | const char *zFName; /* Name of the function */ |
| 311 | 311 | int iFmtArg; /* Index of format argument. Leftmost is 1. */ |
| 312 | 312 | unsigned fmtFlags; /* Processing flags */ |
| 313 | 313 | } aFmtFunc[] = { |
| 314 | + { "admin_log", 1, 0 }, | |
| 314 | 315 | { "blob_append_sql", 2, FMT_NO_S }, |
| 315 | 316 | { "blob_appendf", 2, 0 }, |
| 316 | 317 | { "cgi_panic", 1, 0 }, |
| 317 | 318 | { "cgi_redirectf", 1, 0 }, |
| 318 | 319 | { "db_blob", 2, FMT_NO_S }, |
| 319 | 320 |
| --- src/codecheck1.c | |
| +++ src/codecheck1.c | |
| @@ -309,10 +309,11 @@ | |
| 309 | struct { |
| 310 | const char *zFName; /* Name of the function */ |
| 311 | int iFmtArg; /* Index of format argument. Leftmost is 1. */ |
| 312 | unsigned fmtFlags; /* Processing flags */ |
| 313 | } aFmtFunc[] = { |
| 314 | { "blob_append_sql", 2, FMT_NO_S }, |
| 315 | { "blob_appendf", 2, 0 }, |
| 316 | { "cgi_panic", 1, 0 }, |
| 317 | { "cgi_redirectf", 1, 0 }, |
| 318 | { "db_blob", 2, FMT_NO_S }, |
| 319 |
| --- src/codecheck1.c | |
| +++ src/codecheck1.c | |
| @@ -309,10 +309,11 @@ | |
| 309 | struct { |
| 310 | const char *zFName; /* Name of the function */ |
| 311 | int iFmtArg; /* Index of format argument. Leftmost is 1. */ |
| 312 | unsigned fmtFlags; /* Processing flags */ |
| 313 | } aFmtFunc[] = { |
| 314 | { "admin_log", 1, 0 }, |
| 315 | { "blob_append_sql", 2, FMT_NO_S }, |
| 316 | { "blob_appendf", 2, 0 }, |
| 317 | { "cgi_panic", 1, 0 }, |
| 318 | { "cgi_redirectf", 1, 0 }, |
| 319 | { "db_blob", 2, FMT_NO_S }, |
| 320 |
+2
| --- src/moderate.c | ||
| +++ src/moderate.c | ||
| @@ -116,10 +116,11 @@ | ||
| 116 | 116 | attachRid = db_int(0, "SELECT attachRid FROM modreq WHERE objid=%d", rid); |
| 117 | 117 | if( rid==objid ){ |
| 118 | 118 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 119 | 119 | } |
| 120 | 120 | if( attachRid && object_used(attachRid) ) attachRid = 0; |
| 121 | + admin_log("Disapproved moderation of rid %d.", rid); | |
| 121 | 122 | rid = attachRid; |
| 122 | 123 | } |
| 123 | 124 | db_end_transaction(0); |
| 124 | 125 | } |
| 125 | 126 | |
| @@ -134,10 +135,11 @@ | ||
| 134 | 135 | "INSERT OR IGNORE INTO unclustered VALUES(%d);" |
| 135 | 136 | "INSERT OR IGNORE INTO unsent VALUES(%d);", |
| 136 | 137 | rid, rid, rid |
| 137 | 138 | ); |
| 138 | 139 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 140 | + admin_log("Approved moderation of rid %d.", rid); | |
| 139 | 141 | db_end_transaction(0); |
| 140 | 142 | } |
| 141 | 143 | |
| 142 | 144 | /* |
| 143 | 145 | ** WEBPAGE: modreq |
| 144 | 146 |
| --- src/moderate.c | |
| +++ src/moderate.c | |
| @@ -116,10 +116,11 @@ | |
| 116 | attachRid = db_int(0, "SELECT attachRid FROM modreq WHERE objid=%d", rid); |
| 117 | if( rid==objid ){ |
| 118 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 119 | } |
| 120 | if( attachRid && object_used(attachRid) ) attachRid = 0; |
| 121 | rid = attachRid; |
| 122 | } |
| 123 | db_end_transaction(0); |
| 124 | } |
| 125 | |
| @@ -134,10 +135,11 @@ | |
| 134 | "INSERT OR IGNORE INTO unclustered VALUES(%d);" |
| 135 | "INSERT OR IGNORE INTO unsent VALUES(%d);", |
| 136 | rid, rid, rid |
| 137 | ); |
| 138 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 139 | db_end_transaction(0); |
| 140 | } |
| 141 | |
| 142 | /* |
| 143 | ** WEBPAGE: modreq |
| 144 |
| --- src/moderate.c | |
| +++ src/moderate.c | |
| @@ -116,10 +116,11 @@ | |
| 116 | attachRid = db_int(0, "SELECT attachRid FROM modreq WHERE objid=%d", rid); |
| 117 | if( rid==objid ){ |
| 118 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 119 | } |
| 120 | if( attachRid && object_used(attachRid) ) attachRid = 0; |
| 121 | admin_log("Disapproved moderation of rid %d.", rid); |
| 122 | rid = attachRid; |
| 123 | } |
| 124 | db_end_transaction(0); |
| 125 | } |
| 126 | |
| @@ -134,10 +135,11 @@ | |
| 135 | "INSERT OR IGNORE INTO unclustered VALUES(%d);" |
| 136 | "INSERT OR IGNORE INTO unsent VALUES(%d);", |
| 137 | rid, rid, rid |
| 138 | ); |
| 139 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 140 | admin_log("Approved moderation of rid %d.", rid); |
| 141 | db_end_transaction(0); |
| 142 | } |
| 143 | |
| 144 | /* |
| 145 | ** WEBPAGE: modreq |
| 146 |
+1
-1
| --- src/rebuild.c | ||
| +++ src/rebuild.c | ||
| @@ -346,11 +346,11 @@ | ||
| 346 | 346 | rebuild_update_schema(); |
| 347 | 347 | for(;;){ |
| 348 | 348 | zTable = db_text(0, |
| 349 | 349 | "SELECT name FROM sqlite_master /*scan*/" |
| 350 | 350 | " WHERE type='table'" |
| 351 | - " AND name NOT IN ('blob','delta','rcvfrom','user'," | |
| 351 | + " AND name NOT IN ('admin_log', 'blob','delta','rcvfrom','user'," | |
| 352 | 352 | "'config','shun','private','reportfmt'," |
| 353 | 353 | "'concealed','accesslog','modreq')" |
| 354 | 354 | " AND name NOT GLOB 'sqlite_*'" |
| 355 | 355 | " AND name NOT GLOB 'fx_*'" |
| 356 | 356 | ); |
| 357 | 357 |
| --- src/rebuild.c | |
| +++ src/rebuild.c | |
| @@ -346,11 +346,11 @@ | |
| 346 | rebuild_update_schema(); |
| 347 | for(;;){ |
| 348 | zTable = db_text(0, |
| 349 | "SELECT name FROM sqlite_master /*scan*/" |
| 350 | " WHERE type='table'" |
| 351 | " AND name NOT IN ('blob','delta','rcvfrom','user'," |
| 352 | "'config','shun','private','reportfmt'," |
| 353 | "'concealed','accesslog','modreq')" |
| 354 | " AND name NOT GLOB 'sqlite_*'" |
| 355 | " AND name NOT GLOB 'fx_*'" |
| 356 | ); |
| 357 |
| --- src/rebuild.c | |
| +++ src/rebuild.c | |
| @@ -346,11 +346,11 @@ | |
| 346 | rebuild_update_schema(); |
| 347 | for(;;){ |
| 348 | zTable = db_text(0, |
| 349 | "SELECT name FROM sqlite_master /*scan*/" |
| 350 | " WHERE type='table'" |
| 351 | " AND name NOT IN ('admin_log', 'blob','delta','rcvfrom','user'," |
| 352 | "'config','shun','private','reportfmt'," |
| 353 | "'concealed','accesslog','modreq')" |
| 354 | " AND name NOT GLOB 'sqlite_*'" |
| 355 | " AND name NOT GLOB 'fx_*'" |
| 356 | ); |
| 357 |
+10
-1
| --- src/setup.c | ||
| +++ src/setup.c | ||
| @@ -899,12 +899,15 @@ | ||
| 899 | 899 | int disabled /* 1 if disabled */ |
| 900 | 900 | ){ |
| 901 | 901 | const char *zVal = db_get(zVar, zDflt); |
| 902 | 902 | const char *zQ = P(zQParm); |
| 903 | 903 | if( zQ && fossil_strcmp(zQ,zVal)!=0 ){ |
| 904 | + const int nZQ = (int)strlen(zQ); | |
| 904 | 905 | login_verify_csrf_secret(); |
| 905 | 906 | db_set(zVar, zQ, 0); |
| 907 | + admin_log("Set entry_attribute %Q to: %.*s%s", | |
| 908 | + zVar, 20, zQ, (nZQ>20 ? "..." : "")); | |
| 906 | 909 | zVal = zQ; |
| 907 | 910 | } |
| 908 | 911 | @ <input type="text" id="%s(zQParm)" name="%s(zQParm)" value="%h(zVal)" size="%d(width)" |
| 909 | 912 | if( disabled ){ |
| 910 | 913 | @ disabled="disabled" |
| @@ -925,12 +928,15 @@ | ||
| 925 | 928 | int disabled /* 1 if the textarea should not be editable */ |
| 926 | 929 | ){ |
| 927 | 930 | const char *z = db_get(zVar, (char*)zDflt); |
| 928 | 931 | const char *zQ = P(zQP); |
| 929 | 932 | if( zQ && !disabled && fossil_strcmp(zQ,z)!=0){ |
| 933 | + const int nZQ = (int)strlen(zQ); | |
| 930 | 934 | login_verify_csrf_secret(); |
| 931 | 935 | db_set(zVar, zQ, 0); |
| 936 | + admin_log("Set textarea_attribute %Q to: %.*s%s", | |
| 937 | + zVar, 20, zQ, (nZQ>20 ? "..." : "")); | |
| 932 | 938 | z = zQ; |
| 933 | 939 | } |
| 934 | 940 | if( rows>0 && cols>0 ){ |
| 935 | 941 | @ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)" |
| 936 | 942 | if( disabled ){ |
| @@ -956,12 +962,15 @@ | ||
| 956 | 962 | ){ |
| 957 | 963 | const char *z = db_get(zVar, (char*)zDflt); |
| 958 | 964 | const char *zQ = P(zQP); |
| 959 | 965 | int i; |
| 960 | 966 | if( zQ && fossil_strcmp(zQ,z)!=0){ |
| 967 | + const int nZQ = (int)strlen(zQ); | |
| 961 | 968 | login_verify_csrf_secret(); |
| 962 | 969 | db_set(zVar, zQ, 0); |
| 970 | + admin_log("Set multiple_choice_attribute %Q to: %.*s%s", | |
| 971 | + zVar, 20, zQ, (nZQ>20 ? "..." : "")); | |
| 963 | 972 | z = zQ; |
| 964 | 973 | } |
| 965 | 974 | @ <select size="1" name="%s(zQP)" id="id%s(zQP)"> |
| 966 | 975 | for(i=0; i<nChoice*2; i+=2){ |
| 967 | 976 | const char *zSel = fossil_strcmp(azChoice[i],z)==0 ? " selected" : ""; |
| @@ -2081,11 +2090,11 @@ | ||
| 2081 | 2090 | char const * zMessage = db_column_text(&stLog, 3); |
| 2082 | 2091 | @ <tr class="row%d(counter++%2)"> |
| 2083 | 2092 | @ <td class="adminTime">%s(zTime)</td> |
| 2084 | 2093 | @ <td>%s(zUser)</td> |
| 2085 | 2094 | @ <td>%s(zPage)</td> |
| 2086 | - @ <td>%s(zMessage)</td> | |
| 2095 | + @ <td>%h(zMessage)</td> | |
| 2087 | 2096 | @ </tr> |
| 2088 | 2097 | } |
| 2089 | 2098 | @ </tbody></table> |
| 2090 | 2099 | style_footer(); |
| 2091 | 2100 | } |
| 2092 | 2101 |
| --- src/setup.c | |
| +++ src/setup.c | |
| @@ -899,12 +899,15 @@ | |
| 899 | int disabled /* 1 if disabled */ |
| 900 | ){ |
| 901 | const char *zVal = db_get(zVar, zDflt); |
| 902 | const char *zQ = P(zQParm); |
| 903 | if( zQ && fossil_strcmp(zQ,zVal)!=0 ){ |
| 904 | login_verify_csrf_secret(); |
| 905 | db_set(zVar, zQ, 0); |
| 906 | zVal = zQ; |
| 907 | } |
| 908 | @ <input type="text" id="%s(zQParm)" name="%s(zQParm)" value="%h(zVal)" size="%d(width)" |
| 909 | if( disabled ){ |
| 910 | @ disabled="disabled" |
| @@ -925,12 +928,15 @@ | |
| 925 | int disabled /* 1 if the textarea should not be editable */ |
| 926 | ){ |
| 927 | const char *z = db_get(zVar, (char*)zDflt); |
| 928 | const char *zQ = P(zQP); |
| 929 | if( zQ && !disabled && fossil_strcmp(zQ,z)!=0){ |
| 930 | login_verify_csrf_secret(); |
| 931 | db_set(zVar, zQ, 0); |
| 932 | z = zQ; |
| 933 | } |
| 934 | if( rows>0 && cols>0 ){ |
| 935 | @ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)" |
| 936 | if( disabled ){ |
| @@ -956,12 +962,15 @@ | |
| 956 | ){ |
| 957 | const char *z = db_get(zVar, (char*)zDflt); |
| 958 | const char *zQ = P(zQP); |
| 959 | int i; |
| 960 | if( zQ && fossil_strcmp(zQ,z)!=0){ |
| 961 | login_verify_csrf_secret(); |
| 962 | db_set(zVar, zQ, 0); |
| 963 | z = zQ; |
| 964 | } |
| 965 | @ <select size="1" name="%s(zQP)" id="id%s(zQP)"> |
| 966 | for(i=0; i<nChoice*2; i+=2){ |
| 967 | const char *zSel = fossil_strcmp(azChoice[i],z)==0 ? " selected" : ""; |
| @@ -2081,11 +2090,11 @@ | |
| 2081 | char const * zMessage = db_column_text(&stLog, 3); |
| 2082 | @ <tr class="row%d(counter++%2)"> |
| 2083 | @ <td class="adminTime">%s(zTime)</td> |
| 2084 | @ <td>%s(zUser)</td> |
| 2085 | @ <td>%s(zPage)</td> |
| 2086 | @ <td>%s(zMessage)</td> |
| 2087 | @ </tr> |
| 2088 | } |
| 2089 | @ </tbody></table> |
| 2090 | style_footer(); |
| 2091 | } |
| 2092 |
| --- src/setup.c | |
| +++ src/setup.c | |
| @@ -899,12 +899,15 @@ | |
| 899 | int disabled /* 1 if disabled */ |
| 900 | ){ |
| 901 | const char *zVal = db_get(zVar, zDflt); |
| 902 | const char *zQ = P(zQParm); |
| 903 | if( zQ && fossil_strcmp(zQ,zVal)!=0 ){ |
| 904 | const int nZQ = (int)strlen(zQ); |
| 905 | login_verify_csrf_secret(); |
| 906 | db_set(zVar, zQ, 0); |
| 907 | admin_log("Set entry_attribute %Q to: %.*s%s", |
| 908 | zVar, 20, zQ, (nZQ>20 ? "..." : "")); |
| 909 | zVal = zQ; |
| 910 | } |
| 911 | @ <input type="text" id="%s(zQParm)" name="%s(zQParm)" value="%h(zVal)" size="%d(width)" |
| 912 | if( disabled ){ |
| 913 | @ disabled="disabled" |
| @@ -925,12 +928,15 @@ | |
| 928 | int disabled /* 1 if the textarea should not be editable */ |
| 929 | ){ |
| 930 | const char *z = db_get(zVar, (char*)zDflt); |
| 931 | const char *zQ = P(zQP); |
| 932 | if( zQ && !disabled && fossil_strcmp(zQ,z)!=0){ |
| 933 | const int nZQ = (int)strlen(zQ); |
| 934 | login_verify_csrf_secret(); |
| 935 | db_set(zVar, zQ, 0); |
| 936 | admin_log("Set textarea_attribute %Q to: %.*s%s", |
| 937 | zVar, 20, zQ, (nZQ>20 ? "..." : "")); |
| 938 | z = zQ; |
| 939 | } |
| 940 | if( rows>0 && cols>0 ){ |
| 941 | @ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)" |
| 942 | if( disabled ){ |
| @@ -956,12 +962,15 @@ | |
| 962 | ){ |
| 963 | const char *z = db_get(zVar, (char*)zDflt); |
| 964 | const char *zQ = P(zQP); |
| 965 | int i; |
| 966 | if( zQ && fossil_strcmp(zQ,z)!=0){ |
| 967 | const int nZQ = (int)strlen(zQ); |
| 968 | login_verify_csrf_secret(); |
| 969 | db_set(zVar, zQ, 0); |
| 970 | admin_log("Set multiple_choice_attribute %Q to: %.*s%s", |
| 971 | zVar, 20, zQ, (nZQ>20 ? "..." : "")); |
| 972 | z = zQ; |
| 973 | } |
| 974 | @ <select size="1" name="%s(zQP)" id="id%s(zQP)"> |
| 975 | for(i=0; i<nChoice*2; i+=2){ |
| 976 | const char *zSel = fossil_strcmp(azChoice[i],z)==0 ? " selected" : ""; |
| @@ -2081,11 +2090,11 @@ | |
| 2090 | char const * zMessage = db_column_text(&stLog, 3); |
| 2091 | @ <tr class="row%d(counter++%2)"> |
| 2092 | @ <td class="adminTime">%s(zTime)</td> |
| 2093 | @ <td>%s(zUser)</td> |
| 2094 | @ <td>%s(zPage)</td> |
| 2095 | @ <td>%h(zMessage)</td> |
| 2096 | @ </tr> |
| 2097 | } |
| 2098 | @ </tbody></table> |
| 2099 | style_footer(); |
| 2100 | } |
| 2101 |
+3
| --- src/shun.c | ||
| +++ src/shun.c | ||
| @@ -56,10 +56,11 @@ | ||
| 56 | 56 | if( P("rebuild") ){ |
| 57 | 57 | db_close(1); |
| 58 | 58 | db_open_repository(g.zRepositoryName); |
| 59 | 59 | db_begin_transaction(); |
| 60 | 60 | rebuild_db(0, 0, 0); |
| 61 | + admin_log("Rebuilt database."); | |
| 61 | 62 | db_end_transaction(0); |
| 62 | 63 | } |
| 63 | 64 | if( zUuid ){ |
| 64 | 65 | char *p; |
| 65 | 66 | int i = 0; |
| @@ -101,10 +102,11 @@ | ||
| 101 | 102 | while( *p ){ |
| 102 | 103 | db_multi_exec("DELETE FROM shun WHERE uuid=%Q", p); |
| 103 | 104 | if( !db_exists("SELECT 1 FROM blob WHERE uuid=%Q", p) ){ |
| 104 | 105 | allExist = 0; |
| 105 | 106 | } |
| 107 | + admin_log("Unshunned %Q", p); | |
| 106 | 108 | p += UUID_SIZE+1; |
| 107 | 109 | } |
| 108 | 110 | if( allExist ){ |
| 109 | 111 | @ <p class="noMoreShun">Artifact(s)<br /> |
| 110 | 112 | for( p = zUuid ; *p ; p += UUID_SIZE+1 ){ |
| @@ -139,10 +141,11 @@ | ||
| 139 | 141 | if( tagid ){ |
| 140 | 142 | db_multi_exec("DELETE FROM ticket WHERE tkt_uuid=%Q", p); |
| 141 | 143 | db_multi_exec("DELETE FROM tag WHERE tagid=%d", tagid); |
| 142 | 144 | db_multi_exec("DELETE FROM tagxref WHERE tagid=%d", tagid); |
| 143 | 145 | } |
| 146 | + admin_log("Shunned %Q", p); | |
| 144 | 147 | p += UUID_SIZE+1; |
| 145 | 148 | } |
| 146 | 149 | @ <p class="shunned">Artifact(s)<br /> |
| 147 | 150 | for( p = zUuid ; *p ; p += UUID_SIZE+1 ){ |
| 148 | 151 | @ <a href="%s(g.zTop)/artifact/%s(p)">%s(p)</a><br /> |
| 149 | 152 |
| --- src/shun.c | |
| +++ src/shun.c | |
| @@ -56,10 +56,11 @@ | |
| 56 | if( P("rebuild") ){ |
| 57 | db_close(1); |
| 58 | db_open_repository(g.zRepositoryName); |
| 59 | db_begin_transaction(); |
| 60 | rebuild_db(0, 0, 0); |
| 61 | db_end_transaction(0); |
| 62 | } |
| 63 | if( zUuid ){ |
| 64 | char *p; |
| 65 | int i = 0; |
| @@ -101,10 +102,11 @@ | |
| 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 ){ |
| 109 | @ <p class="noMoreShun">Artifact(s)<br /> |
| 110 | for( p = zUuid ; *p ; p += UUID_SIZE+1 ){ |
| @@ -139,10 +141,11 @@ | |
| 139 | if( tagid ){ |
| 140 | db_multi_exec("DELETE FROM ticket WHERE tkt_uuid=%Q", p); |
| 141 | db_multi_exec("DELETE FROM tag WHERE tagid=%d", tagid); |
| 142 | db_multi_exec("DELETE FROM tagxref WHERE tagid=%d", tagid); |
| 143 | } |
| 144 | p += UUID_SIZE+1; |
| 145 | } |
| 146 | @ <p class="shunned">Artifact(s)<br /> |
| 147 | for( p = zUuid ; *p ; p += UUID_SIZE+1 ){ |
| 148 | @ <a href="%s(g.zTop)/artifact/%s(p)">%s(p)</a><br /> |
| 149 |
| --- src/shun.c | |
| +++ src/shun.c | |
| @@ -56,10 +56,11 @@ | |
| 56 | if( P("rebuild") ){ |
| 57 | db_close(1); |
| 58 | db_open_repository(g.zRepositoryName); |
| 59 | db_begin_transaction(); |
| 60 | rebuild_db(0, 0, 0); |
| 61 | admin_log("Rebuilt database."); |
| 62 | db_end_transaction(0); |
| 63 | } |
| 64 | if( zUuid ){ |
| 65 | char *p; |
| 66 | int i = 0; |
| @@ -101,10 +102,11 @@ | |
| 102 | while( *p ){ |
| 103 | db_multi_exec("DELETE FROM shun WHERE uuid=%Q", p); |
| 104 | if( !db_exists("SELECT 1 FROM blob WHERE uuid=%Q", p) ){ |
| 105 | allExist = 0; |
| 106 | } |
| 107 | admin_log("Unshunned %Q", p); |
| 108 | p += UUID_SIZE+1; |
| 109 | } |
| 110 | if( allExist ){ |
| 111 | @ <p class="noMoreShun">Artifact(s)<br /> |
| 112 | for( p = zUuid ; *p ; p += UUID_SIZE+1 ){ |
| @@ -139,10 +141,11 @@ | |
| 141 | if( tagid ){ |
| 142 | db_multi_exec("DELETE FROM ticket WHERE tkt_uuid=%Q", p); |
| 143 | db_multi_exec("DELETE FROM tag WHERE tagid=%d", tagid); |
| 144 | db_multi_exec("DELETE FROM tagxref WHERE tagid=%d", tagid); |
| 145 | } |
| 146 | admin_log("Shunned %Q", p); |
| 147 | p += UUID_SIZE+1; |
| 148 | } |
| 149 | @ <p class="shunned">Artifact(s)<br /> |
| 150 | for( p = zUuid ; *p ; p += UUID_SIZE+1 ){ |
| 151 | @ <a href="%s(g.zTop)/artifact/%s(p)">%s(p)</a><br /> |
| 152 |