| | @@ -36,14 +36,18 @@ |
| 36 | 36 | Blob sql; |
| 37 | 37 | Stmt q; |
| 38 | 38 | char *zGlob; |
| 39 | 39 | zGlob = mprintf("%.5s*", zUuid); |
| 40 | 40 | db_multi_exec( |
| 41 | | - "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);" |
| 42 | | - "DELETE FROM ok;" |
| 43 | | - "INSERT OR IGNORE INTO ok" |
| 44 | | - " SELECT srcid FROM backlink" |
| 41 | + "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);\n" |
| 42 | + "DELETE FROM ok;\n" |
| 43 | + "INSERT OR IGNORE INTO ok(rid)\n" |
| 44 | + " SELECT CASE srctype\n" |
| 45 | + " WHEN 2 THEN (SELECT rid FROM tagxref WHERE tagid=backlink.srcid\n" |
| 46 | + " ORDER BY mtime DESC LIMIT 1)\n" |
| 47 | + " ELSE srcid END\n" |
| 48 | + " FROM backlink\n" |
| 45 | 49 | " WHERE target GLOB %Q" |
| 46 | 50 | " AND %Q GLOB (target || '*');", |
| 47 | 51 | zGlob, zUuid |
| 48 | 52 | ); |
| 49 | 53 | if( !db_exists("SELECT 1 FROM ok") ) return; |
| | @@ -106,11 +110,15 @@ |
| 106 | 110 | } |
| 107 | 111 | style_header("Backlink Table (Internal Testing Use)"); |
| 108 | 112 | n = db_int(0, "SELECT count(*) FROM backlink"); |
| 109 | 113 | @ <p>%d(n) backlink table entries:</p> |
| 110 | 114 | db_prepare(&q, |
| 111 | | - "SELECT target, srctype, srcid, datetime(mtime) FROM backlink" |
| 115 | + "SELECT target, srctype, srcid, datetime(mtime)," |
| 116 | + " CASE srctype" |
| 117 | + " WHEN 2 THEN (SELECT substr(tagname,6) FROM tag" |
| 118 | + " WHERE tagid=srcid AND tagname GLOB 'wiki-*')" |
| 119 | + " ELSE null END FROM backlink" |
| 112 | 120 | ); |
| 113 | 121 | style_table_sorter(); |
| 114 | 122 | @ <table border="1" cellpadding="2" cellspacing="0" \ |
| 115 | 123 | @ class='sortable' data-column-types='ttt' data-init-sort='0'> |
| 116 | 124 | @ <thead><tr><th> Source <th> Target <th> mtime </tr></thead> |
| | @@ -118,11 +126,10 @@ |
| 118 | 126 | while( db_step(&q)==SQLITE_ROW ){ |
| 119 | 127 | const char *zTarget = db_column_text(&q, 0); |
| 120 | 128 | int srctype = db_column_int(&q, 1); |
| 121 | 129 | int srcid = db_column_int(&q, 2); |
| 122 | 130 | const char *zMtime = db_column_text(&q, 3); |
| 123 | | - static const char *azSrcType[] = { "comment", "ticket", "wiki", "unknown" }; |
| 124 | 131 | @ <tr><td><a href="%R/info/%h(zTarget)">%h(zTarget)</a> |
| 125 | 132 | switch( srctype ){ |
| 126 | 133 | case BKLNK_COMMENT: { |
| 127 | 134 | @ <td><a href="%R/info?name=rid:%d(srcid)">comment-%d(srcid)</a> |
| 128 | 135 | break; |
| | @@ -130,11 +137,12 @@ |
| 130 | 137 | case BKLNK_TICKET: { |
| 131 | 138 | @ <td><a href="%R/info?name=rid:%d(srcid)">ticket-%d(srcid)</a> |
| 132 | 139 | break; |
| 133 | 140 | } |
| 134 | 141 | case BKLNK_WIKI: { |
| 135 | | - @ <td><a href="%R/info?name=rid:%d(srcid)">wiki-%d(srcid)</a> |
| 142 | + const char *zName = db_column_text(&q, 4); |
| 143 | + @ <td><a href="%R/wiki?name=%h(zName)&p">wiki-%d(srcid)</a> |
| 136 | 144 | break; |
| 137 | 145 | } |
| 138 | 146 | default: { |
| 139 | 147 | @ <td>unknown(%d(srctype)) - %d(srcid) |
| 140 | 148 | break; |
| | @@ -146,11 +154,28 @@ |
| 146 | 154 | @ </table> |
| 147 | 155 | db_finalize(&q); |
| 148 | 156 | style_footer(); |
| 149 | 157 | } |
| 150 | 158 | |
| 151 | | - |
| 159 | +/* |
| 160 | +** Remove all prior backlinks for the wiki page given. Then |
| 161 | +** add new backlinks for the latest version of the wiki page. |
| 162 | +*/ |
| 163 | +void backlink_wiki_refresh(const char *zWikiTitle){ |
| 164 | + int tagid = wiki_tagid(zWikiTitle); |
| 165 | + int rid; |
| 166 | + Manifest *pWiki; |
| 167 | + if( tagid==0 ) return; |
| 168 | + rid = db_int(0, "SELECT rid FROM tagxref WHERE tagid=%d" |
| 169 | + " ORDER BY mtime DESC LIMIT 1", tagid); |
| 170 | + if( rid==0 ) return; |
| 171 | + pWiki = manifest_get(rid, CFTYPE_WIKI, 0); |
| 172 | + if( pWiki ){ |
| 173 | + backlink_extract(pWiki->zWiki, pWiki->zMimetype, tagid, 2, pWiki->rDate,1); |
| 174 | + manifest_destroy(pWiki); |
| 175 | + } |
| 176 | +} |
| 152 | 177 | |
| 153 | 178 | /* |
| 154 | 179 | ** Structure used to pass down state information through the |
| 155 | 180 | ** markup formatters into the BACKLINK generator. |
| 156 | 181 | */ |
| | @@ -266,11 +291,11 @@ |
| 266 | 291 | if( replaceFlag ){ |
| 267 | 292 | db_multi_exec("DELETE FROM backlink WHERE srctype=%d AND srcid=%d", |
| 268 | 293 | srctype, srcid); |
| 269 | 294 | } |
| 270 | 295 | bklnk.srcid = srcid; |
| 271 | | - assert( srctype>=BKLNK_COMMENT && srctype<=BKLNK_WIKI ); |
| 296 | + assert( ValidBklnk(srctype) ); |
| 272 | 297 | bklnk.srctype = srctype; |
| 273 | 298 | bklnk.mtime = mtime; |
| 274 | 299 | if( zMimetype==0 || strstr(zMimetype,"wiki")!=0 ){ |
| 275 | 300 | wiki_extract_links(zSrc, &bklnk, srctype==BKLNK_COMMENT ? WIKI_INLINE : 0); |
| 276 | 301 | }else if( strstr(zMimetype,"markdown")!=0 ){ |
| | @@ -279,11 +304,11 @@ |
| 279 | 304 | } |
| 280 | 305 | |
| 281 | 306 | /* |
| 282 | 307 | ** COMMAND: test-backlinks |
| 283 | 308 | ** |
| 284 | | -** Usage: %fossil test-backlinks SRCID SRCTYPE ?OPTIONS? INPUT-FILE |
| 309 | +** Usage: %fossil test-backlinks SRCTYPE SRCID ?OPTIONS? INPUT-FILE |
| 285 | 310 | ** |
| 286 | 311 | ** Read the content of INPUT-FILE and pass it into the backlink_extract() |
| 287 | 312 | ** routine. But instead of adding backlinks to the backlink table, |
| 288 | 313 | ** just print them on stdout. SRCID and SRCTYPE are integers. |
| 289 | 314 | ** |
| | @@ -327,5 +352,31 @@ |
| 327 | 352 | "END;" |
| 328 | 353 | ); |
| 329 | 354 | backlink_extract(blob_str(&in),zMimetype,srcid,srctype,mtime,0); |
| 330 | 355 | blob_reset(&in); |
| 331 | 356 | } |
| 357 | + |
| 358 | + |
| 359 | +/* |
| 360 | +** COMMAND: test-wiki-relink |
| 361 | +** |
| 362 | +** Usage: %fossil test-wiki-relink WIKI-PAGE-NAME |
| 363 | +** |
| 364 | +** Run the backlink_wiki_refresh() procedure on the wiki page |
| 365 | +** named. WIKI-PAGE-NAME can be a glob pattern or a prefix |
| 366 | +** of the wiki page. |
| 367 | +*/ |
| 368 | +void test_wiki_relink_cmd(void){ |
| 369 | + Stmt q; |
| 370 | + db_find_and_open_repository(0, 0); |
| 371 | + if( g.argc!=3 ) usage("WIKI-PAGE-NAME"); |
| 372 | + db_prepare(&q, |
| 373 | + "SELECT substr(tagname,6) FROM tag WHERE tagname GLOB 'wiki-%q*'", |
| 374 | + g.argv[2] |
| 375 | + ); |
| 376 | + while( db_step(&q)==SQLITE_ROW ){ |
| 377 | + const char *zPage = db_column_text(&q,0); |
| 378 | + fossil_print("Relinking page: %s\n", zPage); |
| 379 | + backlink_wiki_refresh(zPage); |
| 380 | + } |
| 381 | + db_finalize(&q); |
| 382 | +} |
| 332 | 383 | |