#!/bin/sh set -eu # Read-only preflight for the legacy SQLite -> native WeKnora migration. # It never writes to the source database and never imports data. The output is # intentionally small enough to attach to a migration review. DB_PATH=${LEGACY_DB_PATH:-/Volumes/Extreme\ SSD/yawan-storage/yawan-workbench/server/data/workspace.db} if [ ! -f "$DB_PATH" ]; then DB_PATH=${LEGACY_DB_PATH_FALLBACK:-/Users/macclaw/Desktop/yawan-workbench/server/data-dev/workspace.db} fi if [ ! -f "$DB_PATH" ]; then echo "legacy database not found; set LEGACY_DB_PATH" >&2 exit 2 fi command -v sqlite3 >/dev/null 2>&1 || { echo "sqlite3 is required" >&2; exit 2; } sha=$(shasum -a 256 "$DB_PATH" | awk '{print $1}') size=$(wc -c < "$DB_PATH" | tr -d ' ') integrity=$(sqlite3 "$DB_PATH" 'PRAGMA integrity_check;' | tr '\n' ' ' | sed 's/[[:space:]]*$//') if [ "$integrity" != "ok" ]; then echo "legacy database integrity check failed: $integrity" >&2 exit 1 fi count() { table=$1 # sqlite3 exits non-zero for a missing table; surface that as zero only for # optional legacy tables so an audit can run against older snapshots. sqlite3 "$DB_PATH" "SELECT count(*) FROM \"$table\";" 2>/dev/null || echo 0 } printf '{\n' printf ' "path": %s,\n' "$(printf '%s' "$DB_PATH" | awk '{gsub(/\\/, "\\\\"); gsub(/"/, "\\\""); printf "\"%s\"", $0}')" printf ' "bytes": %s,\n' "$size" printf ' "sha256": "%s",\n' "$sha" printf ' "integrity": "ok",\n' printf ' "counts": {\n' tables='appuser knowledgebase knowledgefile knowledgecategory agent agentskill agentskillbinding canvas trainingmap segment digitalhuman memory knowledgeusage pointaccount pointtransaction auditlog systemlog' first=1 for table in $tables; do [ "$first" -eq 1 ] || printf ',\n' first=0 printf ' "%s": %s' "$table" "$(count "$table")" done printf '\n }\n}\n'