search for standard sites pub-search.waow.tech
search zig blog atproto
11
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: get stats table from Turso, counts from local SQLite

the stats table (searches, started_at, errors, cache hits) doesn't
sync to the local replica, so we must query Turso for it.
document/publication counts can still use fast local queries.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

zzstoatzz 0c7d7822 79c55f48

+37 -20
+19 -8
backend/src/dashboard.zig
··· 108 108 } 109 109 110 110 fn fetchLocal(alloc: Allocator, local: *db.LocalDb) !Data { 111 - // stats query 112 - var stats_rows = try local.query(STATS_SQL, .{}); 113 - defer stats_rows.deinit(); 114 - const stats_row = stats_rows.next() orelse return error.NoStats; 111 + // get stats from Turso (searches/started_at don't sync to local replica) 112 + const client = db.getClient() orelse return error.NotInitialized; 113 + var stats_res = client.query( 114 + \\SELECT total_searches, service_started_at FROM stats WHERE id = 1 115 + , &.{}) catch return error.QueryFailed; 116 + defer stats_res.deinit(); 117 + const turso_stats = stats_res.first(); 118 + const searches = if (turso_stats) |r| r.int(0) else 0; 119 + const started_at = if (turso_stats) |r| r.int(1) else 0; 115 120 116 - const started_at = stats_row.int(4); 117 - const searches = stats_row.int(2); 118 - const publications = stats_row.int(1); 119 - const documents = stats_row.int(0); 121 + // get document/publication counts from local (fast) 122 + var counts_rows = try local.query( 123 + \\SELECT 124 + \\ (SELECT COUNT(*) FROM documents) as docs, 125 + \\ (SELECT COUNT(*) FROM publications) as pubs 126 + , .{}); 127 + defer counts_rows.deinit(); 128 + const counts_row = counts_rows.next() orelse return error.NoStats; 129 + const documents = counts_row.int(0); 130 + const publications = counts_row.int(1); 120 131 121 132 // platforms query 122 133 var platforms_rows = try local.query(PLATFORMS_SQL, .{});
+18 -12
backend/src/stats.zig
··· 116 116 } 117 117 118 118 fn getStatsLocal(local: *db.LocalDb) !Stats { 119 + // get stats table from Turso (doesn't sync to local replica) 120 + const client = db.getClient() orelse return error.NotInitialized; 121 + var stats_res = client.query( 122 + \\SELECT total_searches, total_errors, service_started_at, 123 + \\ COALESCE(cache_hits, 0), COALESCE(cache_misses, 0) 124 + \\FROM stats WHERE id = 1 125 + , &.{}) catch return error.QueryFailed; 126 + defer stats_res.deinit(); 127 + const stats_row = stats_res.first() orelse return error.NoStats; 128 + 129 + // get document counts from local (fast) 119 130 var rows = try local.query( 120 131 \\SELECT 121 132 \\ (SELECT COUNT(*) FROM documents) as docs, 122 133 \\ (SELECT COUNT(*) FROM publications) as pubs, 123 - \\ (SELECT COUNT(*) FROM documents WHERE embedding IS NOT NULL) as embeddings, 124 - \\ (SELECT total_searches FROM stats WHERE id = 1) as searches, 125 - \\ (SELECT total_errors FROM stats WHERE id = 1) as errors, 126 - \\ (SELECT service_started_at FROM stats WHERE id = 1) as started_at, 127 - \\ (SELECT COALESCE(cache_hits, 0) FROM stats WHERE id = 1) as cache_hits, 128 - \\ (SELECT COALESCE(cache_misses, 0) FROM stats WHERE id = 1) as cache_misses 134 + \\ (SELECT COUNT(*) FROM documents WHERE embedding IS NOT NULL) as embeddings 129 135 , .{}); 130 136 defer rows.deinit(); 131 - 132 137 const row = rows.next() orelse return error.NoRows; 138 + 133 139 return .{ 134 140 .documents = row.int(0), 135 141 .publications = row.int(1), 136 142 .embeddings = row.int(2), 137 - .searches = row.int(3), 138 - .errors = row.int(4), 139 - .started_at = row.int(5), 140 - .cache_hits = row.int(6), 141 - .cache_misses = row.int(7), 143 + .searches = stats_row.int(0), 144 + .errors = stats_row.int(1), 145 + .started_at = stats_row.int(2), 146 + .cache_hits = stats_row.int(3), 147 + .cache_misses = stats_row.int(4), 142 148 }; 143 149 } 144 150