Fossil SCM
Re-enable /forum?status=X filter. Not 100% ideal, in that the filter is performed in C instead of SQL, but it fits the restructured query code well.
Commit
d01961c346476c571cd0de4cf29e0d1668538ae94db95747e2e7beb2f4bd417e
Parent
2f9222bcc8936a6…
1 file changed
+16
-6
+16
-6
| --- src/forum.c | ||
| +++ src/forum.c | ||
| @@ -2478,12 +2478,14 @@ | ||
| 2478 | 2478 | "SELECT tagxref.value, forumstatus.label\n" |
| 2479 | 2479 | " FROM forumstatus, tagxref\n" |
| 2480 | 2480 | " WHERE tagid=%d AND tagtype>=1\n" |
| 2481 | 2481 | " AND forumstatus.value=tagxref.value\n" |
| 2482 | 2482 | " AND rid=:rid\n" |
| 2483 | + " AND if(%d=0,1,tagxref.value=%Q)\n" | |
| 2483 | 2484 | " ORDER BY mtime DESC", |
| 2484 | - db_int(0,"SELECT tagid FROM tag WHERE tagname='status'") | |
| 2485 | + db_int(0,"SELECT tagid FROM tag WHERE tagname='status'"), | |
| 2486 | + !!zStatusFilter, zStatusFilter | |
| 2485 | 2487 | ); |
| 2486 | 2488 | } |
| 2487 | 2489 | db_prepare(&q, |
| 2488 | 2490 | "WITH thread(root,endtime,lastrid) AS (\n" |
| 2489 | 2491 | " SELECT\n" |
| @@ -2512,18 +2514,19 @@ | ||
| 2512 | 2514 | " ORDER BY 1;", |
| 2513 | 2515 | g.perm.ModForum ? "true" : "fpid NOT IN private" /*safe-for-%s*/, |
| 2514 | 2516 | iLimit+1, iOfst |
| 2515 | 2517 | ); |
| 2516 | 2518 | while( db_step(&q)==SQLITE_ROW ){ |
| 2517 | - char *zAge = human_readable_age(db_column_double(&q,0)); | |
| 2518 | - int nMsg = db_column_int(&q, 2); | |
| 2519 | - const char *zUuid = db_column_text(&q, 3); | |
| 2520 | - const char *zTitle = db_column_text(&q, 4); | |
| 2519 | + char *zAge; | |
| 2520 | + int nMsg; | |
| 2521 | + const char *zUuid; | |
| 2522 | + const char *zTitle; | |
| 2521 | 2523 | const char *zStatus; |
| 2522 | 2524 | const char *zStatusLbl; |
| 2523 | 2525 | const int bShowStatus = bHasStatus && !zStatusFilter; |
| 2524 | - const int nCols = bShowStatus ? 4 : 3; | |
| 2526 | + const int nCols = bShowStatus ? 4 : 3 | |
| 2527 | + /* When filtering on status, elide the status column */; | |
| 2525 | 2528 | if( bHasStatus ){ |
| 2526 | 2529 | db_reset(&qStat); |
| 2527 | 2530 | db_bind_int(&qStat, ":rid", db_column_int(&q,6)); |
| 2528 | 2531 | if( db_step(&qStat)==SQLITE_ROW ){ |
| 2529 | 2532 | zStatus = db_column_text(&qStat, 0); |
| @@ -2530,13 +2533,20 @@ | ||
| 2530 | 2533 | zStatusLbl = db_column_text(&qStat, 1); |
| 2531 | 2534 | }else{ |
| 2532 | 2535 | zStatus = forum_statuses()->aStatus[0].zValue; |
| 2533 | 2536 | zStatusLbl = forum_statuses()->aStatus[0].zLabel; |
| 2534 | 2537 | } |
| 2538 | + if( zStatusFilter && 0!=fossil_strcmp(zStatusFilter,zStatus) ){ | |
| 2539 | + continue; | |
| 2540 | + } | |
| 2535 | 2541 | }else{ |
| 2536 | 2542 | zStatus = zStatusLbl = NULL; |
| 2537 | 2543 | } |
| 2544 | + zAge = human_readable_age(db_column_double(&q,0)); | |
| 2545 | + nMsg = db_column_int(&q, 2); | |
| 2546 | + zUuid = db_column_text(&q, 3); | |
| 2547 | + zTitle = db_column_text(&q, 4); | |
| 2538 | 2548 | if( iCnt==0 ){ |
| 2539 | 2549 | char * zTail = zStatusFilter |
| 2540 | 2550 | ? mprintf(" with status=%Q", zStatusFilter) |
| 2541 | 2551 | : 0; |
| 2542 | 2552 | if( iOfst>0 ){ |
| 2543 | 2553 |
| --- src/forum.c | |
| +++ src/forum.c | |
| @@ -2478,12 +2478,14 @@ | |
| 2478 | "SELECT tagxref.value, forumstatus.label\n" |
| 2479 | " FROM forumstatus, tagxref\n" |
| 2480 | " WHERE tagid=%d AND tagtype>=1\n" |
| 2481 | " AND forumstatus.value=tagxref.value\n" |
| 2482 | " AND rid=:rid\n" |
| 2483 | " ORDER BY mtime DESC", |
| 2484 | db_int(0,"SELECT tagid FROM tag WHERE tagname='status'") |
| 2485 | ); |
| 2486 | } |
| 2487 | db_prepare(&q, |
| 2488 | "WITH thread(root,endtime,lastrid) AS (\n" |
| 2489 | " SELECT\n" |
| @@ -2512,18 +2514,19 @@ | |
| 2512 | " ORDER BY 1;", |
| 2513 | g.perm.ModForum ? "true" : "fpid NOT IN private" /*safe-for-%s*/, |
| 2514 | iLimit+1, iOfst |
| 2515 | ); |
| 2516 | while( db_step(&q)==SQLITE_ROW ){ |
| 2517 | char *zAge = human_readable_age(db_column_double(&q,0)); |
| 2518 | int nMsg = db_column_int(&q, 2); |
| 2519 | const char *zUuid = db_column_text(&q, 3); |
| 2520 | const char *zTitle = db_column_text(&q, 4); |
| 2521 | const char *zStatus; |
| 2522 | const char *zStatusLbl; |
| 2523 | const int bShowStatus = bHasStatus && !zStatusFilter; |
| 2524 | const int nCols = bShowStatus ? 4 : 3; |
| 2525 | if( bHasStatus ){ |
| 2526 | db_reset(&qStat); |
| 2527 | db_bind_int(&qStat, ":rid", db_column_int(&q,6)); |
| 2528 | if( db_step(&qStat)==SQLITE_ROW ){ |
| 2529 | zStatus = db_column_text(&qStat, 0); |
| @@ -2530,13 +2533,20 @@ | |
| 2530 | zStatusLbl = db_column_text(&qStat, 1); |
| 2531 | }else{ |
| 2532 | zStatus = forum_statuses()->aStatus[0].zValue; |
| 2533 | zStatusLbl = forum_statuses()->aStatus[0].zLabel; |
| 2534 | } |
| 2535 | }else{ |
| 2536 | zStatus = zStatusLbl = NULL; |
| 2537 | } |
| 2538 | if( iCnt==0 ){ |
| 2539 | char * zTail = zStatusFilter |
| 2540 | ? mprintf(" with status=%Q", zStatusFilter) |
| 2541 | : 0; |
| 2542 | if( iOfst>0 ){ |
| 2543 |
| --- src/forum.c | |
| +++ src/forum.c | |
| @@ -2478,12 +2478,14 @@ | |
| 2478 | "SELECT tagxref.value, forumstatus.label\n" |
| 2479 | " FROM forumstatus, tagxref\n" |
| 2480 | " WHERE tagid=%d AND tagtype>=1\n" |
| 2481 | " AND forumstatus.value=tagxref.value\n" |
| 2482 | " AND rid=:rid\n" |
| 2483 | " AND if(%d=0,1,tagxref.value=%Q)\n" |
| 2484 | " ORDER BY mtime DESC", |
| 2485 | db_int(0,"SELECT tagid FROM tag WHERE tagname='status'"), |
| 2486 | !!zStatusFilter, zStatusFilter |
| 2487 | ); |
| 2488 | } |
| 2489 | db_prepare(&q, |
| 2490 | "WITH thread(root,endtime,lastrid) AS (\n" |
| 2491 | " SELECT\n" |
| @@ -2512,18 +2514,19 @@ | |
| 2514 | " ORDER BY 1;", |
| 2515 | g.perm.ModForum ? "true" : "fpid NOT IN private" /*safe-for-%s*/, |
| 2516 | iLimit+1, iOfst |
| 2517 | ); |
| 2518 | while( db_step(&q)==SQLITE_ROW ){ |
| 2519 | char *zAge; |
| 2520 | int nMsg; |
| 2521 | const char *zUuid; |
| 2522 | const char *zTitle; |
| 2523 | const char *zStatus; |
| 2524 | const char *zStatusLbl; |
| 2525 | const int bShowStatus = bHasStatus && !zStatusFilter; |
| 2526 | const int nCols = bShowStatus ? 4 : 3 |
| 2527 | /* When filtering on status, elide the status column */; |
| 2528 | if( bHasStatus ){ |
| 2529 | db_reset(&qStat); |
| 2530 | db_bind_int(&qStat, ":rid", db_column_int(&q,6)); |
| 2531 | if( db_step(&qStat)==SQLITE_ROW ){ |
| 2532 | zStatus = db_column_text(&qStat, 0); |
| @@ -2530,13 +2533,20 @@ | |
| 2533 | zStatusLbl = db_column_text(&qStat, 1); |
| 2534 | }else{ |
| 2535 | zStatus = forum_statuses()->aStatus[0].zValue; |
| 2536 | zStatusLbl = forum_statuses()->aStatus[0].zLabel; |
| 2537 | } |
| 2538 | if( zStatusFilter && 0!=fossil_strcmp(zStatusFilter,zStatus) ){ |
| 2539 | continue; |
| 2540 | } |
| 2541 | }else{ |
| 2542 | zStatus = zStatusLbl = NULL; |
| 2543 | } |
| 2544 | zAge = human_readable_age(db_column_double(&q,0)); |
| 2545 | nMsg = db_column_int(&q, 2); |
| 2546 | zUuid = db_column_text(&q, 3); |
| 2547 | zTitle = db_column_text(&q, 4); |
| 2548 | if( iCnt==0 ){ |
| 2549 | char * zTail = zStatusFilter |
| 2550 | ? mprintf(" with status=%Q", zStatusFilter) |
| 2551 | : 0; |
| 2552 | if( iOfst>0 ){ |
| 2553 |