diff --git a/prepdb.sh b/prepdb.sh index c359189..6519f8a 100644 --- a/prepdb.sh +++ b/prepdb.sh @@ -10,15 +10,9 @@ replace_in_sqlite_db() { return 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')." - return 1 - fi + echo "Starting brute-force replacement of '$OLD_STRING' with '$NEW_STRING' in '$DB_PATH'..." - echo "Starting replacement of '$OLD_STRING' with '$NEW_STRING' in all string-based columns in '$DB_PATH'..." - - # Escape single quotes in the strings for SQL + # Escape single quotes for SQL local OLD_STRING_ESC=$(echo "$OLD_STRING" | sed "s/'/''/g") local NEW_STRING_ESC=$(echo "$NEW_STRING" | sed "s/'/''/g") @@ -31,71 +25,23 @@ replace_in_sqlite_db() { 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 + local COLUMNS + COLUMNS=$(sqlite3 "$DB_PATH" "PRAGMA table_info($TABLE);" | awk -F'|' '{print $2}' | grep -v '^$') - # Check if the column is a string-based type (TEXT, VARCHAR, CHAR, CLOB, etc.) - if [[ "$COLUMN_TYPE" =~ [Tt][Ee][Xx][Tt]|[Vv][Aa][Rr][Cc][Hh][Aa][Rr]|[Cc][Hh][Aa][Rr]|[Cc][Ll][Oo][Bb]|[Ss][Tt][Rr][Ii][Nn][Gg] ]]; then - echo " Processing column: $COLUMN (type: $COLUMN_TYPE)" + # Loop through each column + for COLUMN in $COLUMNS; do + echo " Processing column: $COLUMN" - # Check if the column contains 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. Processing with jq..." - - # Create a temporary table to store updated JSON - sqlite3 "$DB_PATH" " - CREATE TABLE IF NOT EXISTS temp_$TABLE (rowid INTEGER PRIMARY KEY, new_$COLUMN TEXT); - " - - # Export JSON data, modify with jq, and store in temp table - sqlite3 "$DB_PATH" "SELECT rowid, $COLUMN FROM $TABLE WHERE json_valid($COLUMN) = 1;" | while read -r ROWID JSON_DATA; do - # Skip the header line (rowid|column) - if [ "$ROWID" != "rowid" ]; then - # Replace the string in the JSON using jq - local MODIFIED_JSON - MODIFIED_JSON=$(echo "$JSON_DATA" | jq --arg old_str "$OLD_STRING" --arg new_str "$NEW_STRING" ' - walk(if type == "string" then gsub($old_str; $new_str) else . end) - ') - - # Insert the modified JSON into the temp table - sqlite3 "$DB_PATH" " - INSERT INTO temp_$TABLE (rowid, new_$COLUMN) VALUES ($ROWID, '$MODIFIED_JSON'); - " - fi - done - - # Update the original table with the modified JSON - sqlite3 "$DB_PATH" " - UPDATE $TABLE - SET $COLUMN = (SELECT new_$COLUMN FROM temp_$TABLE WHERE temp_$TABLE.rowid = $TABLE.rowid) - WHERE rowid IN (SELECT rowid FROM temp_$TABLE); - " - - # Drop the temporary table - sqlite3 "$DB_PATH" "DROP TABLE temp_$TABLE;" - else - echo " Column $COLUMN is not JSON. Using replace()." - - # Use replace() for non-JSON strings - sqlite3 "$DB_PATH" " - UPDATE $TABLE - SET $COLUMN = replace($COLUMN, '$OLD_STRING_ESC', '$NEW_STRING_ESC') - WHERE $COLUMN LIKE '%$OLD_STRING_ESC%'; - " - fi - fi + # Update every cell in the column, casting to TEXT to force string replacement + sqlite3 "$DB_PATH" " + UPDATE $TABLE + SET $COLUMN = replace(CAST($COLUMN AS TEXT), '$OLD_STRING_ESC', '$NEW_STRING_ESC') + WHERE CAST($COLUMN AS TEXT) LIKE '%$OLD_STRING_ESC%'; + " done done - echo "Replacement completed for all string-based columns (including JSON) in '$DB_PATH'." + echo "replacement of '$OLD_STRING' with '$NEW_STRING' completed in '$DB_PATH'." } #set script directory diff --git a/stacks/npm/data/database-post.sqlite b/stacks/npm/data/database-post.sqlite deleted file mode 100644 index 8bf369f..0000000 Binary files a/stacks/npm/data/database-post.sqlite and /dev/null differ