From 13bb75d9c06cc7c153fcf67ee2a0c2e1e2ccb3e9 Mon Sep 17 00:00:00 2001 From: Aaron Sutula Date: Thu, 18 Jul 2024 11:00:12 -0600 Subject: [PATCH] handle blob columns Signed-off-by: Aaron Sutula --- packages/web/components/table-data.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/web/components/table-data.tsx b/packages/web/components/table-data.tsx index c0e6ef7f..5184301c 100644 --- a/packages/web/components/table-data.tsx +++ b/packages/web/components/table-data.tsx @@ -18,6 +18,7 @@ import { type Schema, hasConstraint } from "@tableland/studio-store"; import { AlertTriangle, ChevronDown, Loader2 } from "lucide-react"; import { useRouter } from "next/navigation"; import { getNetwork, getWalletClient, switchNetwork } from "wagmi/actions"; +import { decodeBase64 } from "ethers"; import { DataTable } from "./data-table"; import TableCell from "./table-cell"; import { EditCell } from "./edit-cell"; @@ -298,7 +299,7 @@ export function TableData({ } else if (col.type === "int") { acc[col.name] = int(col.name); } else if (col.type === "blob") { - acc[col.name] = blob(col.name); + acc[col.name] = blob(col.name, { mode: "buffer" }); } return acc; }, @@ -323,7 +324,10 @@ export function TableData({ baseUrl: helpers.getBaseUrl(chainId), autoWait: true, }); - const db = drizzle(tbl, { schema: drizzleTable, logger: false }); + const db = drizzle(tbl, { + schema: { [tableName]: drizzleTable }, + logger: false, + }); const genWhereConstraints = (row: EditedRowData | DeletedRowData) => { if (uniqueColumnName) { @@ -338,12 +342,24 @@ export function TableData({ return and(...eqs); }; + const convertBlobFields = function (obj: Record) { + for (const [key, val] of Object.entries(obj)) { + if (typeof val !== "string") continue; + const column = schema.columns.find((c) => c.name === key); + if (column?.type === "blob") { + obj[key] = decodeBase64(val); + } + } + }; + const sqlInsertItems = updates.new.map((row) => { + convertBlobFields(row.data); return db.insert(drizzleTable).values(row.data); }); const sqlUpdateItems = updates.edited .filter((update) => update.diff) .map((row) => { + convertBlobFields(row.diff! as Record); return db .update(drizzleTable) .set(row.diff!)