Signal-iOS/Scripts/schema_dump
2021-11-09 14:25:42 -08:00

79 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
BIN_NAME=$0
function usage() {
echo ""
echo "Usage:"
echo "$BIN_NAME [--staging | --path dbpath] [--passphrase passphrase]"
echo ""
echo " Running this command without arguments will try and dump the schema of the production database in the currently booted simulator"
echo ""
echo " Passphrase options:"
echo " --passphrase Use the provided passphrase to decrypt the database. No quotes, just a hex string."
echo " (savedKey) You can save a copy of a simulator's database key in Debug UI > Misc > Save plaintext database key. If a key is found, it'll automatically be used to decrypt the database"
echo " (stdin) If a key wasn't found automatically and wasn't specified in command line args, you'll be prompted for one through standard input."
echo ""
echo " Database options:"
echo " (default) Target the production database of the currently booted simulator"
echo " --staging Target the staging database of the currently booted simulator"
echo " --path Target a sqlcipher database located at the provided path"
echo ""
echo "Examples:"
echo " $BIN_NAME"
echo " $BIN_NAME --staging"
echo " $BIN_NAME --passphrase secret --path /tmp/test.sqlite"
echo " $BIN_NAME --passphrase secret --staging"
}
if [[ $1 == '-h' || $1 == '--help' ]]
then
usage
exit 0
fi
PATH_ARG=""
KEY_ARG=""
STAGING_ARG=""
index=1
end=$#
while [[ $index -le $end ]]
do
if [[ ${!index} == "--staging" ]]; then
STAGING_ARG="--staging"
elif [[ ${!index} == "--path" ]]; then
PATH_ARG="--path"
index=$(( index + 1 ))
PATH_ARG+=" ${!index}"
elif [[ ${!index} == "--passphrase" ]]; then
KEY_ARG="--passphrase"
index=$(( index + 1 ))
KEY_ARG+=" ${!index}"
fi
index=$(( index + 1 ))
done
BASE_DIR=$(git rev-parse --show-toplevel)
cd $BASE_DIR
OUTPUT_FILE=SignalServiceKit/Resources/schema.sql
Scripts/sqlclient --quiet $STAGING_ARG $PATH_ARG $KEY_ARG -- .schema | # Grab the schema
grep -v -e grdb_migrations -e sqlite_sequence | # Filter out oneline tables we don't care about
sed '1s/ok//' | # Filter out the "ok" message that sqlcipher prints for the passphrase PRAGMAs
bundle exec anbt-sql-formatter > $OUTPUT_FILE # Format it and write it to the file
if [ ${PIPESTATUS[0]} -eq 0 ]; then
echo "🌈 Successfully dumped schema to ${OUTPUT_FILE}"
else
cat << EOS
💥 Error while trying to dump the schema.
If you see an error like "Error: SQL logic error" the passphrase is most likely wrong.
EOS
fi