From 7bbc58d03f9e95f08ce9e33ef39eef09ac4389e6 Mon Sep 17 00:00:00 2001 From: SDGDen Date: Thu, 5 Mar 2026 01:39:42 +0100 Subject: [PATCH] new db func --- prepdb.sh | 87 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 47 insertions(+), 40 deletions(-) diff --git a/prepdb.sh b/prepdb.sh index f0f16a0..01a2522 100644 --- a/prepdb.sh +++ b/prepdb.sh @@ -10,58 +10,65 @@ replace_in_sqlite_db() { exit 1 fi - # Check if jq is installed - if ! command -v jq &> /dev/null; then - echo "Error: 'jq' is not installed. Please install it first (e.g., 'sudo apt install jq')." - exit 1 - fi - - echo "Starting JSON-aware replacement of '$OLD_STRING' with '$NEW_STRING' in '$DB_PATH'..." + echo "Starting replacement of '$OLD_STRING' with '$NEW_STRING' in '$DB_PATH'..." # Create a backup of the original database local BACKUP_PATH="${DB_PATH}.bak" cp "$DB_PATH" "$BACKUP_PATH" - # Dump the database to SQL - local DUMP_PATH="${DB_PATH}.sql" - sqlite3 "$DB_PATH" ".dump" > "$DUMP_PATH" + # Begin a transaction + sqlite3 "$DB_PATH" "BEGIN TRANSACTION;" - # Create a temporary file for the modified SQL dump - local MODIFIED_DUMP_PATH="${DB_PATH}.modified.sql" + # Get a list of all tables in the database + local TABLES + TABLES=$(sqlite3 "$DB_PATH" ".tables") - # Process the SQL dump line by line - while IFS= read -r line; do - # Check if the line contains JSON data (simplistic check for quotes and brackets) - if [[ "$line" =~ [\"{][^"\{]*["\}][^"\{]*$OLD_STRING[^"\{]*[\}"] ]]; then - # Use jq to replace strings in JSON fields - echo "$line" | jq --arg old_str "$OLD_STRING" --arg new_str "$NEW_STRING" ' - walk(if type == "string" then gsub($old_str; $new_str) else . end) - ' > /dev/null 2>&1 + # Loop through each table + for TABLE in $TABLES; do + echo "Processing table: $TABLE" - # If jq fails (not valid JSON), fall back to sed - if [ $? -ne 0 ]; then - echo "$line" | sed "s|$OLD_STRING|$NEW_STRING|g" - else - echo "$line" | jq --arg old_str "$OLD_STRING" --arg new_str "$NEW_STRING" ' - walk(if type == "string" then gsub($old_str; $new_str) else . end) - ' + # 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 - else - # Use sed for non-JSON fields - echo "$line" | sed "s|$OLD_STRING|$NEW_STRING|g" - fi - done < "$DUMP_PATH" > "$MODIFIED_DUMP_PATH" - # Create a new database from the modified SQL dump - local NEW_DB_PATH="${DB_PATH}.new" - sqlite3 "$NEW_DB_PATH" < "$MODIFIED_DUMP_PATH" + echo " Processing column: $COLUMN (type: $COLUMN_TYPE)" - # Replace the original database with the new one - mv "$NEW_DB_PATH" "$DB_PATH" + # Skip BLOB columns to avoid corruption + if [[ "$COLUMN_TYPE" == "BLOB" ]]; then + echo " Skipping BLOB column: $COLUMN" + continue + fi - # Clean up temporary files - rm "$DUMP_PATH" - rm "$MODIFIED_DUMP_PATH" + # 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" " + 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%'; + " + fi + done + done + + # Commit the transaction + sqlite3 "$DB_PATH" "COMMIT;" echo "Replacement completed in '$DB_PATH'. Original database backed up to '$BACKUP_PATH'." }