#!/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 if printf '%s\n' "$@" \ | grep -cxF "${Antwort}" \ | grep -qxF '1'; then printf '%s\n' "$@" \ | grep -xF "${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 \ | sort -u \ | sort -k2,2 ) frag_ab "$1" $(printf '%s\n' "${Alternativen}" | sed 's@^\S\+\s@@') \ | join -1 1 -2 2 -o 2.1 - <( printf '%s\n' "${Alternativen}" ) } zeige_Infos() { local Barcodes Barcodes=$( while read -r bc; do printf '%s' "${bc}" \ | base64 -w0 printf '\n' done \ | sed ' s/^.*$/FROM_BASE64("\0")/ $! s/$/,/ ' \ | tr -d '\n' ) { printf 'SELECT CONCAT(' printf '`Schrauben`.`Anzahl`,' printf '"x Schrauben ",' printf '`Materialien`.`name`,' printf '" ",' printf '`Gewindetypen`.`name`,' printf '" ",' printf '`Koepfe`.`name`,' printf '" ",' printf '`Schrauben`.`Gewindemasz`,' printf '"x",' printf '`Schrauben`.`Laenge`' printf ')' printf ' FROM `Schrauben`' printf ' JOIN `Materialien`' printf ' ON `Schrauben`.`Material`=`Materialien`.`id`' printf ' JOIN `Koepfe`' printf ' ON `Schrauben`.`Kopf`=`Koepfe`.`id`' printf ' JOIN `Gewindetypen`' printf ' ON `Schrauben`.`Gewindetyp`=`Gewindetypen`.`id`' printf ' WHERE `Schrauben`.`Barcode` IN (%s);\n' \ "${Barcodes}" printf 'SELECT CONCAT(' printf '`Muttern`.`Anzahl`,' printf '"x Muttern ",' printf '`Materialien`.`name`,' printf '" ",' printf '`Muttern`.`Gewindemasz`,' printf '"x",' printf '`Muttern`.`Dicke`' printf ')' printf ' FROM `Muttern`' printf ' JOIN `Materialien`' printf ' ON `Muttern`.`Material`=`Materialien`.`id`' printf ' WHERE `Muttern`.`Barcode` IN (%s);\n' \ "${Barcodes}" printf 'SELECT CONCAT(' printf '`Unterlegscheiben`.`Anzahl`,' printf '"x Unterlegscheiben ",' printf '`Materialien`.`name`,' printf '" ",' printf '`Unterlegscheiben`.`Gewindemasz`,' printf '"-",' printf '`Unterlegscheiben`.`Auszendurchmesser`,' printf '"x",' printf '`Unterlegscheiben`.`Dicke`' printf ')' printf ' FROM `Unterlegscheiben`' printf ' JOIN `Materialien`' printf ' ON `Unterlegscheiben`.`Material`=`Materialien`.`id`' printf ' WHERE `Unterlegscheiben`.`Barcode` IN (%s);\n' \ "${Barcodes}" } \ | mysql -N } 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} \ | 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' printf '%s\n' "${Barcode}" \ | zeige_Infos >&2 >&2 printf '\n' continue fi bekannte_Barcodes=$( printf '%s\n' ${bekannte_Barcodes} ${Barcode} \ | sort -u ) 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 ) if [ -n "${fehlende_Barcodes}" ]; then >&2 printf 'Ich vermisse:\n' printf '%s\n' ${fehlende_Barcodes} \ | zeige_Infos >&2 fi