#!/bin/bash bekannte_Barcodes=$( { printf 'SELECT ' printf '`Schrauben`.`barcode`' printf ' FROM `Schrauben`;\n' printf 'SELECT ' printf '`Muttern`.`barcode`' printf ' FROM `Muttern`;\n' printf 'SELECT ' printf '`Unterlegscheiben`.`barcode`' printf ' FROM `Unterlegscheiben`;\n' } \ | mysql ) frag_ab() { local Bezeichner="$1" shift while true; do >&2 printf '%s (' "${Bezeichner}" printf '%s/' "$@" \ | sed 's@/$@)? @' >&2 read Antwort >&2 if printf '%s\n' "$@" \ | grep -cF "${Antwort}" \ | grep -qxF '1'; then printf '%s\n' "$@" \ | grep -F "${Antwort}" return fi printf '\n' >&2 done } declare -A Kategorien Kategorien['Kopf']='Koepfe' Kategorien['Gewindetyp']='Gewindetypen' Kategorien['Material']='Materialien' declare -A Spalten for Typ in 'Schraube' 'Mutter' 'Unterlegscheibe'; do Spalten["${Typ}"]=$( printf 'SHOW CREATE TABLE `%sn`;\n' "${Typ}" \ | mysql -N --raw --batch \ | sed -n ' s/^ `\(\S\+\)` \(\S\+\) .*$/\1:\2/ T p ' \ | grep -v '^id:' \ | tr '\n' ' ' \ | sed 's@\s$@@' ) done frag_aus_Tabelle_ab() { local Alternativen local Antwort Alternativen=$( { printf 'SELECT' printf ' `id`,`name`' printf ' FROM `%s`' "${Kategorien["$1"]}" } \ | mysql -N --raw --batch \ | tr '\t' ' ' \ | sort -u ) Antwort=$( frag_ab "$1" $(printf '%s\n' "${Alternativen}" | sed 's@^\S\+ @@') ) printf '%s\n' "${Alternativen}" \ | grep -wF "${Antwort}" \ | cut -d' ' -f1 } tmp_dir=$(mktemp -d) trap 'rm -rf --one-file-system "${tmp_dir}"' EXIT while { >&2 printf '%s Schachteln übrig\n' \ $( printf '%s\n' "${bekannte_Barcodes}" "${vorhandene_Barcodes}" "${vorhandene_Barcodes}" \ | sort \ | uniq -u \ | wc -l ) read -r Barcode }; do if [ -z "${Barcode}" ]; then break fi vorhandene_Barcodes=$( printf '%s\n' ${vorhandene_Barcodes} ${Barcode} \ | sort -u ) if printf '%s\n' "${bekannte_Barcodes}" \ | grep -qxF "${Barcode}"; then >&2 printf 'ist bekannt\n\n' continue fi Typ=$( frag_ab 'Typ' 'Schraube' 'Mutter' 'Unterlegscheibe' ) for Eigenschaft_Datentyp in ${Spalten["${Typ}"]}; do Eigenschaft="${Eigenschaft_Datentyp%%:*}" Datentyp="${Eigenschaft_Datentyp#${Eigenschaft}:}" if [ "${Eigenschaft}" = 'Barcode' ]; then Wert="${Barcode}" elif [ -n "${Kategorien["${Eigenschaft}"]}" ]; then Wert=$( frag_aus_Tabelle_ab "${Eigenschaft}" ) else >&2 printf '%s (%s): ' "${Eigenschaft}" "${Datentyp}" read Wert >&2 fi printf '%s\t' "${Wert}" done \ | sed ' s@\s$@\n@ ' >> "${tmp_dir}/neue-Daten-${Typ}" done for Datei in "${tmp_dir}/neue-Daten-"*; do if [ ! -f "${Datei}" ]; then continue fi Typ="${Datei##*/neue-Daten-}" printf 'LOAD DATA LOCAL INFILE "%s"' "${Datei}" printf ' INTO TABLE `%sn`(' "${Typ}" printf '%s\n' ${Spalten["${Typ}"]} \ | sed ' s@^\([^:]\+\):.*$@`\1`,@ $ s@,$@@ ' \ | tr -d '\n' printf ');\n' done \ | mysql fehlende_Barcodes=$( printf '%s\n' "${bekannte_Barcodes}" "${vorhandene_Barcodes}" "${vorhandene_Barcodes}" \ | sort \ | uniq -u \ | while read -r bc; do printf '%s' "${bc}" \ | base64 -w0 printf '\n' done ) if [ -n "${fehlende_Barcodes}" ]; then >&2 printf 'Ich vermisse:\n' for Typ in "${!Spalten[@]}"; do printf 'SELECT *' printf ' FROM `%sn`' "${Typ}" printf ' WHERE `%sn`.`Barcode` IN (' "${Typ}" printf 'FROM_BASE64("%s"),' ${fehlende_Barcodes} \ | sed 's@,$@@' printf ');\n' done \ | mysql >&2 fi