From e69d6bbc031fb46bf0b83c2d16c7a2de0a99eaeb Mon Sep 17 00:00:00 2001 From: uncle6me-web Date: Wed, 12 Aug 2026 12:22:10 +0800 Subject: [PATCH] =?UTF-8?q?chore(worker-builds):=20=E9=87=8D=E7=B7=A8?= =?UTF-8?q?=E2=80=94=E2=80=94kbdb=20=E7=9A=84=E8=B7=B3=E8=84=AB=E4=BF=AE?= =?UTF-8?q?=E6=B3=95=E8=A6=81=E9=80=B2=E5=9F=B7=E8=A1=8C=E6=AA=94=E6=89=8D?= =?UTF-8?q?=E7=AE=97=E6=95=B8=EF=BC=88Arcrun#94=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 今天已經在這件事上被咬過一次(8e10f1d):源碼改了、執行檔沒重編, 出貨會全綠地送出舊的。這次併完就重編,不留同一個坑。 kbdb source 525faaf → c497ec4(sha256 7bc66656 → ffb8d434)。 其餘四顆源碼沒動、位元組也沒動。 --- .worker-builds/arcrun-kbdb/worker.mjs | 29 +++++++++++++++++---------- .worker-builds/manifest.json | 10 ++++----- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/.worker-builds/arcrun-kbdb/worker.mjs b/.worker-builds/arcrun-kbdb/worker.mjs index 6cee6a1..1407412 100644 --- a/.worker-builds/arcrun-kbdb/worker.mjs +++ b/.worker-builds/arcrun-kbdb/worker.mjs @@ -2189,11 +2189,18 @@ async function deprecateEntriesByLibrary(db, ownerId, library) { var MAX_LIKE_Q_BYTES = 48; var MAX_LIKE_TERMS = 6; var utf8Len = (s) => new TextEncoder().encode(s).length; +var LIKE_ESCAPE = "\\"; +var CONTENT_LIKE = `content LIKE ? ESCAPE '${LIKE_ESCAPE}'`; +function escapeLikeLiteral(s) { + return s.replace(/[\\%_]/g, (ch) => LIKE_ESCAPE + ch); +} +var likeBytes = (s) => utf8Len(escapeLikeLiteral(s)); +var likePattern = (s) => `%${escapeLikeLiteral(s)}%`; function chunkByBytes(s, maxBytes) { const out = []; let cur = ""; for (const ch of s) { - if (utf8Len(cur + ch) > maxBytes) { + if (likeBytes(cur + ch) > maxBytes) { if (cur) out.push(cur); cur = ch; } else { @@ -2204,8 +2211,8 @@ function chunkByBytes(s, maxBytes) { return out; } function buildContentLike(q) { - if (utf8Len(q) <= MAX_LIKE_Q_BYTES) { - return { conds: ["content LIKE ?"], params: [`%${q}%`], split: false }; + if (likeBytes(q) <= MAX_LIKE_Q_BYTES) { + return { conds: [CONTENT_LIKE], params: [likePattern(q)], split: false }; } const terms = []; for (const word of q.split(/\s+/).filter(Boolean)) { @@ -2217,8 +2224,8 @@ function buildContentLike(q) { } if (terms.length === 0) terms.push(chunkByBytes(q, MAX_LIKE_Q_BYTES)[0] ?? ""); return { - conds: terms.map(() => "content LIKE ?"), - params: terms.map((t) => `%${t}%`), + conds: terms.map(() => CONTENT_LIKE), + params: terms.map(likePattern), split: true }; } @@ -2335,7 +2342,7 @@ function buildSearchScore(q) { if (terms.length === 0) { const m = buildContentLike(trimmed); return { - scoreExpr: m.conds.map(() => "CASE WHEN content LIKE ? THEN 1 ELSE 0 END").join(" + "), + scoreExpr: m.conds.map(() => `CASE WHEN ${CONTENT_LIKE} THEN 1 ELSE 0 END`).join(" + "), scoreParams: m.params, terms: [], legacyShape: true @@ -2344,14 +2351,14 @@ function buildSearchScore(q) { const parts = []; const params = []; for (const { term, weight } of terms) { - parts.push(`CASE WHEN content LIKE ? THEN ${weight} ELSE 0 END`); - params.push(`%${term}%`); + parts.push(`CASE WHEN ${CONTENT_LIKE} THEN ${weight} ELSE 0 END`); + params.push(likePattern(term)); } const single = terms.length === 1 && terms[0].term === trimmed; - if (!single && utf8Len(trimmed) <= MAX_LIKE_Q_BYTES) { + if (!single && likeBytes(trimmed) <= MAX_LIKE_Q_BYTES) { const bonus = terms.reduce((s, t) => s + t.weight, 0); - parts.push(`CASE WHEN content LIKE ? THEN ${bonus} ELSE 0 END`); - params.push(`%${trimmed}%`); + parts.push(`CASE WHEN ${CONTENT_LIKE} THEN ${bonus} ELSE 0 END`); + params.push(likePattern(trimmed)); } return { scoreExpr: parts.join(" + "), scoreParams: params, terms, legacyShape: single }; } diff --git a/.worker-builds/manifest.json b/.worker-builds/manifest.json index 2864eb9..144cc30 100644 --- a/.worker-builds/manifest.json +++ b/.worker-builds/manifest.json @@ -1,8 +1,8 @@ { "schema": 1, "built_for": "arcrun-tier2-worker-artifacts", - "generated_at": "2026-08-12T01:50:15.065Z", - "repo_head": "3eb8b31f2bfa029e15a8119e229082fbafb8d2b1", + "generated_at": "2026-08-12T04:21:48.581Z", + "repo_head": "b302c03ea8076bcfe82bbcebb1523dcec2d1e830", "repo_dirty": false, "workers": [ { @@ -58,11 +58,11 @@ { "name": "arcrun-kbdb", "source_dir": "kbdb", - "source_commit": "3eb8b31f2bfa029e15a8119e229082fbafb8d2b1", + "source_commit": "c497ec418eba6cd94b1d5872671c51fd5812c11c", "main_module": "worker.mjs", "main_file": "arcrun-kbdb/worker.mjs", - "js_bytes": 149234, - "content_sha256": "7bc666568f453a2fc5fc9339fc997c12d3927fb8a293439f2c80695be8da9767", + "js_bytes": 149533, + "content_sha256": "ffb8d43467d0cefbd7545fdc0d347f2b965e3c3de20b3315eed7613f20266891", "modules": [], "compat_date": "2025-02-19", "compat_flags": [