#!/bin/sh set -eu input_to_db() { local input= local db= input="$(mktemp)" || return 1 cat - 1>"${input}" || { rm -f "${input}"; return 1; } if file "${input}" | grep -Fq SQLite; then # Input still a database: use it directly. db="${input}" else # Input already dumped to SQL: enter it into temporary database. db="$(mktemp)" || { rm -f "${input}"; return 1; } sqlite3 "${db}" 0<"${input}" || { rm -f "${input}"; return 1; } rm -f "${input}" || { rm -f "${db}"; return 1; } fi printf '%s' "${db}" return 0 } del_from_db() { local db="${1}" local spec="${2}" shift 2 local table= local column= local value= value="${spec#*=}" spec="${spec%%=*}" table="${spec%%.*}" column="${spec#*.}" sqlite3 "${db}" "DELETE FROM ${table} WHERE ${column} = ${value};" || \ return 1 return 0 } db_to_sql() { local db="${1}" shift 1 sqlite3 "${db}" '.dump' || return 1 return 0 } usage() { printf 'Usage: %s [.= ...]\n' "${0}" return 0 } main() { local arg= local db= for arg in "${@}"; do case "${arg}" in ?*.?*=?*);; *) usage 1>&2; return 1;; esac done db="$(input_to_db)" || return 1 for arg in "${@}"; do del_from_db "${db}" "${arg}" || { rm -f "${db}"; return 1; } done db_to_sql "${db}" || { rm -f "${db}"; return 1; } rm -f "${db}" || return 1 return 0 } main "${@}"