diff --git a/prepdb.sh b/prepdb.sh index 01a2522..943fb84 100644 --- a/prepdb.sh +++ b/prepdb.sh @@ -16,6 +16,10 @@ replace_in_sqlite_db() { local BACKUP_PATH="${DB_PATH}.bak" 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 sqlite3 "$DB_PATH" "BEGIN TRANSACTION;" @@ -27,41 +31,21 @@ replace_in_sqlite_db() { for TABLE in $TABLES; do echo "Processing table: $TABLE" - # Get a list of all columns in the table - sqlite3 "$DB_PATH" "PRAGMA table_info($TABLE);" | awk -F'|' '{print $2","$3}' | while IFS=, read -r COLUMN COLUMN_TYPE; do - # Skip empty lines - if [ -z "$COLUMN" ]; then - continue - fi + # Get a list of all non-BLOB columns in the table + sqlite3 "$DB_PATH" "PRAGMA table_info($TABLE);" | awk -F'|' ' + { + if ($3 != "BLOB") { + print $2 + } + }' | while read -r COLUMN; do + if [ -n "$COLUMN" ]; then + echo " Processing column: $COLUMN" - echo " Processing column: $COLUMN (type: $COLUMN_TYPE)" - - # 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 + # Update only rows where the column contains OLD_STRING sqlite3 "$DB_PATH" " UPDATE $TABLE - SET $COLUMN = json_replace($COLUMN, '$OLD_STRING', '$NEW_STRING') - WHERE json_valid($COLUMN) = 1 AND json_type($COLUMN) IS NOT NULL; - " - 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%'; + SET $COLUMN = replace(CAST($COLUMN AS TEXT), '$OLD_STRING_ESC', '$NEW_STRING_ESC') + WHERE CAST($COLUMN AS TEXT) LIKE '%$OLD_STRING_ESC%'; " fi done