fix script again

This commit is contained in:
2026-03-05 01:42:12 +01:00
parent 7bbc58d03f
commit 08cb585468

View File

@@ -16,6 +16,10 @@ replace_in_sqlite_db() {
local BACKUP_PATH="${DB_PATH}.bak" local BACKUP_PATH="${DB_PATH}.bak"
cp "$DB_PATH" "$BACKUP_PATH" cp "$DB_PATH" "$BACKUP_PATH"
# Escape single quotes for SQL
local OLD_STRING_ESC=$(printf '%s\n' "$OLD_STRING" | sed "s/'/''/g")
local NEW_STRING_ESC=$(printf '%s\n' "$NEW_STRING" | sed "s/'/''/g")
# Begin a transaction # Begin a transaction
sqlite3 "$DB_PATH" "BEGIN TRANSACTION;" sqlite3 "$DB_PATH" "BEGIN TRANSACTION;"
@@ -27,41 +31,21 @@ replace_in_sqlite_db() {
for TABLE in $TABLES; do for TABLE in $TABLES; do
echo "Processing table: $TABLE" echo "Processing table: $TABLE"
# Get a list of all columns in the table # Get a list of all non-BLOB columns in the table
sqlite3 "$DB_PATH" "PRAGMA table_info($TABLE);" | awk -F'|' '{print $2","$3}' | while IFS=, read -r COLUMN COLUMN_TYPE; do sqlite3 "$DB_PATH" "PRAGMA table_info($TABLE);" | awk -F'|' '
# Skip empty lines {
if [ -z "$COLUMN" ]; then if ($3 != "BLOB") {
continue print $2
fi }
}' | while read -r COLUMN; do
if [ -n "$COLUMN" ]; then
echo " Processing column: $COLUMN"
echo " Processing column: $COLUMN (type: $COLUMN_TYPE)" # Update only rows where the column contains OLD_STRING
# Skip BLOB columns to avoid corruption
if [[ "$COLUMN_TYPE" == "BLOB" ]]; then
echo " Skipping BLOB column: $COLUMN"
continue
fi
# Check if the column might contain JSON data
local IS_JSON=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM $TABLE WHERE json_valid($COLUMN) = 1 LIMIT 1;")
if [ "$IS_JSON" -gt 0 ]; then
echo " Detected JSON data in column $COLUMN. Using json_replace()."
# Use json_replace for JSON columns
sqlite3 "$DB_PATH" " sqlite3 "$DB_PATH" "
UPDATE $TABLE UPDATE $TABLE
SET $COLUMN = json_replace($COLUMN, '$OLD_STRING', '$NEW_STRING') SET $COLUMN = replace(CAST($COLUMN AS TEXT), '$OLD_STRING_ESC', '$NEW_STRING_ESC')
WHERE json_valid($COLUMN) = 1 AND json_type($COLUMN) IS NOT NULL; WHERE CAST($COLUMN AS TEXT) LIKE '%$OLD_STRING_ESC%';
"
else
echo " Column $COLUMN is not JSON. Using replace()."
# Use replace for non-JSON columns
sqlite3 "$DB_PATH" "
UPDATE $TABLE
SET $COLUMN = replace($COLUMN, '$OLD_STRING', '$NEW_STRING')
WHERE $COLUMN LIKE '%$OLD_STRING%';
" "
fi fi
done done