67 lines
2.9 KiB
Text
67 lines
2.9 KiB
Text
|
#!/bin/bash
|
||
|
set -euo pipefail
|
||
|
|
||
|
wkdir=
|
||
|
debug=
|
||
|
function cleanup () {
|
||
|
[ -z "$wkdir" -a -z "$debug" ] || rm -fr "$wkdir"
|
||
|
}
|
||
|
trap 'cleanup' EXIT
|
||
|
if [ "$1" = "-d" ]; then
|
||
|
debug=1
|
||
|
shift
|
||
|
fi
|
||
|
input_file=$(readlink -f "$1")
|
||
|
wkdir=$(mktemp -d)
|
||
|
cd "$wkdir"
|
||
|
|
||
|
# Generate one JSON file per table into the temporary directory
|
||
|
jq '[map(select(has("recipient_addresses")|not))[]]' "$input_file" >sms.json
|
||
|
jq '[map(select(has("recipient_addresses")))[] | del(.parts, .recipient_addresses, .sender_address)]' "$input_file" >mms.json
|
||
|
jq '[map(select(has("recipient_addresses")))[].sender_address]' "$input_file" >sender.json
|
||
|
jq '[map(select(has("recipient_addresses")))[].recipient_addresses[]]' "$input_file" >recipient.json
|
||
|
jq '[map(select(has("parts")))[].parts[]]' "$input_file" >part.json
|
||
|
|
||
|
# Tables creation
|
||
|
sms_keys=$(jq -r '[.[] | keys[]] | unique[]' sms.json)
|
||
|
mms_keys=$(jq -r '[.[] | keys[]] | unique[]' mms.json)
|
||
|
address_keys=$(jq -r '[.[] | keys[]] | unique[]' recipient.json)
|
||
|
part_keys=$(jq -r '[.[] | keys[]] | unique[]' part.json)
|
||
|
|
||
|
function create_table () {
|
||
|
name="$1"
|
||
|
shift
|
||
|
echo -n "CREATE TABLE $name("
|
||
|
echo -n $(echo "$@" | sed 's/ / TEXT,/g;s/$/ TEXT/')
|
||
|
echo ");"
|
||
|
}
|
||
|
|
||
|
create_table sms $sms_keys
|
||
|
create_table mms $mms_keys
|
||
|
create_table sender $address_keys
|
||
|
create_table recipient $address_keys
|
||
|
create_table part $part_keys savepath
|
||
|
|
||
|
# Populate
|
||
|
jq -r '.[] | to_entries | "INSERT INTO sms (\([.[].key] | join(", "))) VALUES (\"\([.[].value | gsub("\""; "\"\"")] | join("\", \""))\");"' sms.json
|
||
|
jq -r '.[] | to_entries | "INSERT INTO mms (\([.[].key] | join(", "))) VALUES (\"\([.[].value | gsub("\""; "\"\"")] | join("\", \""))\");"' mms.json
|
||
|
jq -r '.[] | to_entries | "INSERT INTO sender (\([.[].key] | join(", "))) VALUES (\"\([.[].value | gsub("\""; "\"\"")] | join("\", \""))\");"' sender.json
|
||
|
jq -r '.[] | to_entries | "INSERT INTO recipient (\([.[].key] | join(", "))) VALUES (\"\([.[].value | gsub("\""; "\"\"")] | join("\", \""))\");"' recipient.json
|
||
|
jq -r '.[] | to_entries | "INSERT INTO part (\([.[].key] | join(", "))) VALUES (\"\([.[].value | gsub("\""; "\"\"")] | join("\", \""))\");"' part.json
|
||
|
|
||
|
# Fix MMS out sender
|
||
|
echo "UPDATE sender set address=null where address in ('insert-address-token', 'Unknown address');"
|
||
|
|
||
|
# Delete MMS with no part
|
||
|
echo "DELETE FROM mms where not exists (SELECT 1 from part where part.mid=mms._id);"
|
||
|
|
||
|
# Build savepath for each part
|
||
|
# Part:
|
||
|
# date = mms.date
|
||
|
# address = sender.address || moi
|
||
|
# uid = cl ? cl : (cid sans les '<>')
|
||
|
# tag = date+address+uid
|
||
|
# savepath = $user_data_dir/chatty/mms/tag
|
||
|
user_data_dir="${XDG_DATA_HOME:-$HOME/.local/share}/chatty/mms"
|
||
|
echo "UPDATE part set savepath=(select '$user_data_dir/' || mms.date || (CASE WHEN sender.address IS NOT null THEN sender.address ELSE '' END) || mms.m_id || '/' || replace(replace(replace((CASE WHEN part.cl IS NOT null THEN part.cl ELSE trim(part.cid,'<>') END),'(','_'),')','_'),' ','_') from mms, sender where mms._id=part.mid and sender.msg_id=part.mid);"
|