ListProxiesDue 去掉 alive=1 限制:死代理每小时也重测,协议级握手 成功就 MarkProxyAlive 复活(fail_count 清零),不再只能等同步时 重新出现在源列表才复活。 附带:提取页加「带协议前缀」开关,复制链接自动带 fmt=url。 Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
428 lines
15 KiB
SQL
428 lines
15 KiB
SQL
-- name: GetUserByName :one
|
|
SELECT * FROM users WHERE name = ? LIMIT 1;
|
|
|
|
-- name: GetUserByID :one
|
|
SELECT * FROM users WHERE id = ?;
|
|
|
|
-- name: ListUsers :many
|
|
SELECT * FROM users
|
|
WHERE name LIKE '%' || sqlc.arg(keyword) || '%'
|
|
ORDER BY id LIMIT ? OFFSET ?;
|
|
|
|
-- name: CountUsers :one
|
|
SELECT COUNT(*) FROM users WHERE name LIKE '%' || sqlc.arg(keyword) || '%';
|
|
|
|
-- name: CountAllUsers :one
|
|
SELECT COUNT(*) FROM users;
|
|
|
|
-- name: CountActiveUsers :one
|
|
SELECT COUNT(*) FROM users WHERE status = 'active';
|
|
|
|
-- name: CountAdmins :one
|
|
SELECT COUNT(*) FROM users WHERE role = 'admin' AND status = 'active';
|
|
|
|
-- name: InsertUser :execlastid
|
|
INSERT INTO users(name, password_hash, role, status, created_at, updated_at)
|
|
VALUES(?, ?, ?, 'active', ?, ?);
|
|
|
|
-- name: UpdateUser :exec
|
|
UPDATE users SET name = ?, role = ?, status = ?, updated_at = ? WHERE id = ?;
|
|
|
|
-- name: UpdateUserPassword :exec
|
|
UPDATE users SET name = ?, role = ?, status = ?, password_hash = ?, updated_at = ? WHERE id = ?;
|
|
|
|
-- name: DeleteUser :exec
|
|
DELETE FROM users WHERE id = ?;
|
|
|
|
-- name: InsertSession :exec
|
|
INSERT INTO sessions(token, user_id, created_at, expires_at) VALUES(?, ?, ?, ?);
|
|
|
|
-- name: GetSessionUser :one
|
|
SELECT u.id, u.name, u.password_hash, u.role, u.status, u.created_at, u.updated_at, s.expires_at
|
|
FROM sessions s JOIN users u ON u.id = s.user_id WHERE s.token = ?;
|
|
|
|
-- name: DeleteSession :exec
|
|
DELETE FROM sessions WHERE token = ?;
|
|
|
|
-- name: DeleteOtherSessions :exec
|
|
DELETE FROM sessions WHERE user_id = ? AND token != ?;
|
|
|
|
-- name: TouchSession :exec
|
|
UPDATE sessions SET expires_at = ? WHERE token = ?;
|
|
|
|
-- name: CountActiveSessions :one
|
|
SELECT COUNT(*) FROM sessions WHERE expires_at > ?;
|
|
|
|
-- name: CountTodayLogins :one
|
|
SELECT COUNT(*) FROM sessions
|
|
WHERE date(created_at, 'unixepoch', 'localtime') = date('now', 'localtime');
|
|
|
|
-- name: LoginTrend :many
|
|
SELECT date(created_at, 'unixepoch', 'localtime') AS d, COUNT(*) AS c
|
|
FROM sessions WHERE created_at >= ? GROUP BY d;
|
|
|
|
-- name: ListTools :many
|
|
SELECT * FROM tools ORDER BY sort, id;
|
|
|
|
-- name: ListEnabledTools :many
|
|
SELECT * FROM tools WHERE enabled = 1 ORDER BY sort, id;
|
|
|
|
-- name: InsertTool :execlastid
|
|
INSERT INTO tools(name, icon, url, description, sort, enabled) VALUES(?, ?, ?, ?, ?, ?);
|
|
|
|
-- name: UpdateTool :exec
|
|
UPDATE tools SET name = ?, icon = ?, url = ?, description = ?, sort = ?, enabled = ? WHERE id = ?;
|
|
|
|
-- name: DeleteTool :exec
|
|
DELETE FROM tools WHERE id = ?;
|
|
|
|
-- name: CountTools :one
|
|
SELECT COUNT(*) FROM tools WHERE enabled = 1;
|
|
|
|
-- name: ListVault :many
|
|
SELECT * FROM vault WHERE user_id = ?
|
|
AND (title LIKE '%' || sqlc.arg(keyword) || '%'
|
|
OR username LIKE '%' || sqlc.arg(keyword) || '%'
|
|
OR url LIKE '%' || sqlc.arg(keyword) || '%')
|
|
ORDER BY updated_at DESC;
|
|
|
|
-- name: GetVault :one
|
|
SELECT * FROM vault WHERE user_id = ? AND id = ?;
|
|
|
|
-- name: InsertVault :execlastid
|
|
INSERT INTO vault(user_id, title, username, password_enc, url, note, totp_enc, created_at, updated_at)
|
|
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?);
|
|
|
|
-- name: UpdateVault :execrows
|
|
UPDATE vault SET title = ?, username = ?, password_enc = ?, url = ?, note = ?, totp_enc = ?, updated_at = ?
|
|
WHERE id = ? AND user_id = ?;
|
|
|
|
-- name: DeleteVault :execrows
|
|
DELETE FROM vault WHERE user_id = ? AND id = ?;
|
|
|
|
-- name: ListBookmarks :many
|
|
SELECT * FROM bookmarks WHERE user_id = ? ORDER BY sort, id;
|
|
|
|
-- name: InsertBookmark :execlastid
|
|
INSERT INTO bookmarks(user_id, title, url, icon, sort, created_at) VALUES(?, ?, ?, ?, ?, ?);
|
|
|
|
-- name: UpdateBookmark :execrows
|
|
UPDATE bookmarks SET title = ?, url = ?, icon = ?, sort = ? WHERE id = ? AND user_id = ?;
|
|
|
|
-- name: DeleteBookmark :execrows
|
|
DELETE FROM bookmarks WHERE user_id = ? AND id = ?;
|
|
|
|
-- name: ListServers :many
|
|
SELECT * FROM servers ORDER BY id;
|
|
|
|
-- name: GetServer :one
|
|
SELECT * FROM servers WHERE id = ?;
|
|
|
|
-- name: InsertServer :execlastid
|
|
INSERT INTO servers(name, host, port, username, auth_type, secret_enc, note, created_at, updated_at)
|
|
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?);
|
|
|
|
-- name: UpdateServer :execrows
|
|
UPDATE servers SET name = ?, host = ?, port = ?, username = ?, auth_type = ?, secret_enc = ?, note = ?, updated_at = ?
|
|
WHERE id = ?;
|
|
|
|
-- name: DeleteServer :execrows
|
|
DELETE FROM servers WHERE id = ?;
|
|
|
|
-- name: CountServers :one
|
|
SELECT COUNT(*) FROM servers;
|
|
|
|
-- name: ListDbconns :many
|
|
SELECT * FROM dbconns ORDER BY id;
|
|
|
|
-- name: GetDbconn :one
|
|
SELECT * FROM dbconns WHERE id = ?;
|
|
|
|
-- name: InsertDbconn :execlastid
|
|
INSERT INTO dbconns(name, engine, host, port, username, password_enc, database, params, created_at, updated_at)
|
|
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
|
|
|
|
-- name: UpdateDbconn :execrows
|
|
UPDATE dbconns SET name = ?, engine = ?, host = ?, port = ?, username = ?, password_enc = ?, database = ?, params = ?, updated_at = ?
|
|
WHERE id = ?;
|
|
|
|
-- name: DeleteDbconn :execrows
|
|
DELETE FROM dbconns WHERE id = ?;
|
|
|
|
-- name: InsertFile :execlastid
|
|
INSERT INTO files(user_id, name, stored, size, mime, created_at) VALUES(?, ?, ?, ?, ?, ?);
|
|
|
|
-- name: ListFiles :many
|
|
SELECT * FROM files WHERE user_id = ? ORDER BY id DESC;
|
|
|
|
-- name: GetFile :one
|
|
SELECT * FROM files WHERE id = ?;
|
|
|
|
-- name: DeleteFile :execrows
|
|
DELETE FROM files WHERE id = ? AND user_id = ?;
|
|
|
|
-- name: InsertShare :execlastid
|
|
INSERT INTO shares(code, file_id, user_id, file_name, expires_at, created_at) VALUES(?, ?, ?, ?, ?, ?);
|
|
|
|
-- name: ListShares :many
|
|
SELECT * FROM shares WHERE user_id = ? ORDER BY id DESC;
|
|
|
|
-- name: GetShareByCode :one
|
|
SELECT sh.id, sh.code, sh.file_id, sh.user_id, sh.file_name, sh.expires_at, sh.downloads, sh.created_at,
|
|
f.name, f.stored, f.size, f.mime
|
|
FROM shares sh JOIN files f ON f.id = sh.file_id WHERE sh.code = ?;
|
|
|
|
-- name: DeleteShare :execrows
|
|
DELETE FROM shares WHERE id = ? AND user_id = ?;
|
|
|
|
-- name: DeleteSharesByFile :exec
|
|
DELETE FROM shares WHERE file_id = ?;
|
|
|
|
-- name: IncShareDownloads :exec
|
|
UPDATE shares SET downloads = downloads + 1 WHERE code = ?;
|
|
|
|
-- name: UpsertProxyRegion :exec
|
|
INSERT INTO proxy_regions(code, name, zh_name, region, slug) VALUES(?, ?, ?, ?, ?)
|
|
ON CONFLICT(code) DO UPDATE SET name = excluded.name, zh_name = excluded.zh_name,
|
|
region = excluded.region, slug = excluded.slug;
|
|
|
|
-- name: GetProxyRegionByCode :one
|
|
SELECT * FROM proxy_regions WHERE code = ?;
|
|
|
|
-- name: ListProxyRegions :many
|
|
SELECT r.*, (SELECT COUNT(*) FROM proxies p WHERE p.region_id = r.id AND p.alive = 1) AS alive_count
|
|
FROM proxy_regions r ORDER BY alive_count DESC, r.code;
|
|
|
|
-- name: ListProxyKeys :many
|
|
SELECT id, ip, port, source FROM proxies;
|
|
|
|
-- name: InsertProxy :execlastid
|
|
INSERT INTO proxies(ip, port, protocols, anonymity, source, region_id, latency, speed, uptime, alive, last_seen_at, created_at)
|
|
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?);
|
|
|
|
-- name: UpdateProxySeen :exec
|
|
UPDATE proxies SET protocols = ?, anonymity = ?, region_id = ?, latency = ?, speed = ?, uptime = ?, last_seen_at = ?, alive = 1, fail_count = 0
|
|
WHERE id = ?;
|
|
|
|
-- name: DeleteProxy :exec
|
|
DELETE FROM proxies WHERE id = ?;
|
|
|
|
-- name: ListProxiesDue :many
|
|
SELECT id, ip, port, protocols, fail_count FROM proxies WHERE last_checked_at < ? ORDER BY last_checked_at LIMIT 20000;
|
|
|
|
-- name: MarkProxyAlive :exec
|
|
UPDATE proxies SET last_checked_at = ?, alive = 1, fail_count = 0, last_alive_at = ?, latency = ? WHERE id = ?;
|
|
|
|
-- name: MarkProxyFailed :exec
|
|
UPDATE proxies SET last_checked_at = ?, alive = 0, fail_count = ? WHERE id = ?;
|
|
|
|
-- name: DeleteDeadProxies :execrows
|
|
DELETE FROM proxies WHERE alive = 0 AND last_checked_at < ?;
|
|
|
|
-- name: CountProxies :one
|
|
SELECT COUNT(*) FROM proxies WHERE alive = 1;
|
|
|
|
-- name: CountProxiesFiltered :one
|
|
SELECT COUNT(*) FROM proxies p WHERE (? = 0 OR p.region_id = ?) AND (? = '' OR p.protocols LIKE '%' || ? || '%')
|
|
AND (? = '' OR p.ip LIKE '%' || ? || '%') AND (? < 0 OR p.alive = ?);
|
|
|
|
-- name: ListProxiesFiltered :many
|
|
SELECT p.*, r.code AS region_code, r.name AS region_name, r.zh_name AS region_zh_name
|
|
FROM proxies p JOIN proxy_regions r ON r.id = p.region_id
|
|
WHERE (? = 0 OR p.region_id = ?) AND (? = '' OR p.protocols LIKE '%' || ? || '%')
|
|
AND (? = '' OR p.ip LIKE '%' || ? || '%') AND (? < 0 OR p.alive = ?)
|
|
ORDER BY p.alive DESC, p.latency LIMIT ? OFFSET ?;
|
|
|
|
-- name: InsertProxySync :execlastid
|
|
INSERT INTO proxy_syncs(started_at, source) VALUES(?, ?);
|
|
|
|
-- name: FinishProxySync :exec
|
|
UPDATE proxy_syncs SET finished_at = ?, status = ?, total = ?, added = ?, removed = ?, updated = ?, detail = ?, error = ? WHERE id = ?;
|
|
|
|
-- name: ListProxySyncs :many
|
|
SELECT * FROM proxy_syncs ORDER BY id DESC LIMIT ?;
|
|
|
|
-- name: LastProxyCheckAt :one
|
|
SELECT COALESCE(MAX(last_checked_at), 0) FROM proxies;
|
|
|
|
-- name: InsertProxyApiKey :execlastid
|
|
INSERT INTO proxy_keys(kkey, name, region_id, created_at) VALUES(?, ?, ?, ?);
|
|
|
|
-- name: ListProxyApiKeys :many
|
|
SELECT k.*, r.code AS region_code, r.zh_name AS region_zh_name, r.name AS region_name
|
|
FROM proxy_keys k LEFT JOIN proxy_regions r ON r.id = k.region_id
|
|
ORDER BY k.id DESC;
|
|
|
|
-- name: GetProxyApiKey :one
|
|
SELECT * FROM proxy_keys WHERE kkey = ? AND enabled = 1;
|
|
|
|
-- name: TouchProxyApiKey :exec
|
|
UPDATE proxy_keys SET used_count = used_count + 1, last_used_at = ? WHERE id = ?;
|
|
|
|
-- name: DeleteProxyApiKey :execrows
|
|
DELETE FROM proxy_keys WHERE id = ?;
|
|
|
|
-- name: RandomProxies :many
|
|
SELECT p.id, p.ip, p.port, p.protocols, p.fail_count, r.code AS region_code, r.zh_name AS region_zh_name
|
|
FROM proxies p JOIN proxy_regions r ON r.id = p.region_id
|
|
WHERE p.alive = 1 AND (? = 0 OR p.region_id = ?) AND (? = '' OR p.protocols LIKE '%' || ? || '%')
|
|
AND (? = '' OR r.code = ?)
|
|
ORDER BY RANDOM() LIMIT ?;
|
|
|
|
-- name: GetSetting :one
|
|
SELECT v FROM settings WHERE k = ?;
|
|
|
|
-- name: UpsertSetting :exec
|
|
INSERT INTO settings (k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v;
|
|
|
|
-- name: CreatePayOrder :execlastid
|
|
INSERT INTO pay_orders (trade_no, out_trade_no, channel, subject, money, fee, notify_url, return_url, client_ip, expired_at, created_at)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
|
|
|
|
-- name: GetPayOrderByTradeNo :one
|
|
SELECT * FROM pay_orders WHERE trade_no = ?;
|
|
|
|
-- name: GetPayOrderByOutNo :one
|
|
SELECT * FROM pay_orders WHERE out_trade_no = ?;
|
|
|
|
-- name: SetPayOrderUpstream :exec
|
|
UPDATE pay_orders SET upstream_trade_no = ?, goods_key = ?, quantity = ?, unit_price = ?, payurl = ?, buyer_contact = ?, query_pwd = ? WHERE id = ?;
|
|
|
|
-- name: SetPayOrderQrcode :exec
|
|
UPDATE pay_orders SET qrcode = ? WHERE id = ?;
|
|
|
|
-- name: SetPayOrderStatus :exec
|
|
UPDATE pay_orders SET status = ?, paid_at = ?, cards = ? WHERE id = ?;
|
|
|
|
-- name: ListPendingPayOrders :many
|
|
SELECT * FROM pay_orders WHERE status = 0 AND upstream_trade_no != '' ORDER BY id LIMIT 200;
|
|
|
|
-- name: ListPayOrders :many
|
|
SELECT * FROM pay_orders
|
|
WHERE (? = -1 OR status = ?) AND (? = '' OR trade_no LIKE '%' || ? || '%' OR out_trade_no LIKE '%' || ? || '%')
|
|
ORDER BY id DESC LIMIT ? OFFSET ?;
|
|
|
|
-- name: CountPayOrders :one
|
|
SELECT COUNT(*) FROM pay_orders
|
|
WHERE (? = -1 OR status = ?) AND (? = '' OR trade_no LIKE '%' || ? || '%' OR out_trade_no LIKE '%' || ? || '%');
|
|
|
|
-- name: PayOrderStats :one
|
|
SELECT COUNT(*) AS cnt, COALESCE(SUM(CASE WHEN status = 1 THEN money ELSE 0 END), 0) AS money,
|
|
COALESCE(SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END), 0) AS pending,
|
|
COALESCE(SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END), 0) AS paid
|
|
FROM pay_orders WHERE created_at >= ?;
|
|
|
|
-- name: IncPayNotifyAttempts :exec
|
|
UPDATE pay_orders SET notify_attempts = notify_attempts + 1 WHERE id = ?;
|
|
|
|
-- name: SetPayNotified :exec
|
|
UPDATE pay_orders SET notified = 1 WHERE id = ?;
|
|
|
|
-- name: GetPayOrder :one
|
|
SELECT * FROM pay_orders WHERE id = ?;
|
|
|
|
-- name: CreateLicenseApp :execlastid
|
|
INSERT INTO license_apps (appid, secret, name, created_at) VALUES (?, ?, ?, ?);
|
|
|
|
-- name: GetLicenseAppByAppid :one
|
|
SELECT * FROM license_apps WHERE appid = ?;
|
|
|
|
-- name: ListLicenseApps :many
|
|
SELECT a.*, (SELECT COUNT(*) FROM license_cards c WHERE c.app_id = a.id) AS card_count
|
|
FROM license_apps a ORDER BY a.id DESC;
|
|
|
|
-- name: UpdateLicenseApp :exec
|
|
UPDATE license_apps SET name = ?, enabled = ? WHERE id = ?;
|
|
|
|
-- name: DeleteLicenseApp :exec
|
|
DELETE FROM license_apps WHERE id = ?;
|
|
|
|
-- name: CreateLicenseCard :exec
|
|
INSERT INTO license_cards (app_id, card, hours, created_at) VALUES (?, ?, ?, ?);
|
|
|
|
-- name: GetLicenseCard :one
|
|
SELECT * FROM license_cards WHERE app_id = ? AND card = ?;
|
|
|
|
-- name: ActivateLicenseCard :exec
|
|
UPDATE license_cards SET domain = ?, activated_at = ?, expires_at = ? WHERE id = ?;
|
|
|
|
-- name: ListLicenseCards :many
|
|
SELECT * FROM license_cards
|
|
WHERE app_id = ? AND (? = '' OR card LIKE '%' || ? || '%' OR domain LIKE '%' || ? || '%')
|
|
ORDER BY id DESC LIMIT ? OFFSET ?;
|
|
|
|
-- name: CountLicenseCards :one
|
|
SELECT COUNT(*) FROM license_cards
|
|
WHERE app_id = ? AND (? = '' OR card LIKE '%' || ? || '%' OR domain LIKE '%' || ? || '%');
|
|
|
|
-- name: LicenseCardStats :one
|
|
SELECT COUNT(*) AS total,
|
|
COALESCE(SUM(CASE WHEN activated_at = 0 THEN 1 ELSE 0 END), 0) AS unused,
|
|
COALESCE(SUM(CASE WHEN activated_at > 0 AND (expires_at = 0 OR expires_at > ?) THEN 1 ELSE 0 END), 0) AS active,
|
|
COALESCE(SUM(CASE WHEN activated_at > 0 AND expires_at > 0 AND expires_at <= ? THEN 1 ELSE 0 END), 0) AS expired
|
|
FROM license_cards WHERE app_id = ?;
|
|
|
|
-- name: DeleteLicenseCard :exec
|
|
DELETE FROM license_cards WHERE id = ?;
|
|
|
|
-- name: UpsertMemory :exec
|
|
INSERT INTO memories (k, content, project, tags, written_by, revision, created_at, updated_at)
|
|
VALUES (?, ?, ?, ?, ?, 1, ?, ?)
|
|
ON CONFLICT(k) DO UPDATE SET
|
|
content = excluded.content,
|
|
project = excluded.project,
|
|
tags = excluded.tags,
|
|
written_by = excluded.written_by,
|
|
revision = memories.revision + 1,
|
|
updated_at = excluded.updated_at;
|
|
|
|
-- name: GetMemory :one
|
|
SELECT * FROM memories WHERE k = ?;
|
|
|
|
-- name: DeleteMemory :execrows
|
|
DELETE FROM memories WHERE k = ?;
|
|
|
|
-- name: ListMemories :many
|
|
SELECT * FROM memories
|
|
WHERE (? = '' OR project = ?) AND (? = '' OR tags LIKE '%"' || ? || '"%')
|
|
ORDER BY updated_at DESC LIMIT ?;
|
|
|
|
-- name: MemoryProjects :many
|
|
SELECT project AS name, COUNT(*) AS cnt FROM memories
|
|
WHERE project != '' GROUP BY project ORDER BY MAX(updated_at) DESC;
|
|
|
|
-- name: CountMemories :one
|
|
SELECT COUNT(*) FROM memories;
|
|
|
|
-- name: PayDailyPaid :many
|
|
SELECT CAST(strftime('%Y-%m-%d', paid_at, 'unixepoch', 'localtime') AS TEXT) AS day,
|
|
COALESCE(SUM(money), 0) AS money, COUNT(*) AS cnt
|
|
FROM pay_orders WHERE status = 1 AND paid_at >= ? GROUP BY day;
|
|
|
|
-- name: RecentPaidOrders :many
|
|
SELECT trade_no, subject, money, paid_at FROM pay_orders WHERE status = 1 ORDER BY paid_at DESC LIMIT ?;
|
|
|
|
-- name: LicenseCardStatsAll :one
|
|
SELECT COUNT(*) AS total,
|
|
COALESCE(SUM(CASE WHEN activated_at = 0 THEN 1 ELSE 0 END), 0) AS unused,
|
|
COALESCE(SUM(CASE WHEN activated_at > 0 AND (expires_at = 0 OR expires_at > ?) THEN 1 ELSE 0 END), 0) AS active
|
|
FROM license_cards;
|
|
|
|
-- name: CountLicenseApps :one
|
|
SELECT COUNT(*) FROM license_apps;
|
|
|
|
-- name: CountProxiesAll :one
|
|
SELECT COUNT(*) FROM proxies;
|
|
|
|
-- name: CountBookmarksByUser :one
|
|
SELECT COUNT(*) FROM bookmarks WHERE user_id = ?;
|
|
|
|
-- name: CountVaultByUser :one
|
|
SELECT COUNT(*) FROM vault WHERE user_id = ?;
|
|
|
|
-- name: CountDbconns :one
|
|
SELECT COUNT(*) FROM dbconns;
|
|
|
|
-- name: CountFilesAll :one
|
|
SELECT COUNT(*) FROM files;
|