diff --git a/atom b/atom index a122d94..1de77d0 100755 --- a/atom +++ b/atom @@ -229,6 +229,190 @@ closeDatabase() { rm "$tempdir"/sqlite.{in,out} } +Select() { +#Select table [col1 [col2 [..]]] < WHERE_key WHERE_value +# [WHERE_key WHERE_value +# […]] + local \ + table="$1" \ + col \ + columns \ + results \ + where_statement + shift + for col + do + (( ${#columns} )) && columns+=',' + columns+="$col" + done + while read key value + do + (( ${#where_statement} )) && where_statement+=( "AND" ) + if [[ $value == NULL ]] + then + where_statement+=( "$key is NULL" ) + else + where_statement+=( "$key='$value'" ) + fi + done + echo "SELECT IFNULL(" \ + "(SELECT $columns FROM $table" \ + "WHERE ${where_statement[@]})" \ + ",'SQL::Select:not found'" \ + ");" >&3 + read -u 4 results + if ! [[ $results == "SQL::Select:not found" ]] + then + echo "$results" + else + return 1 + fi +} +Insert() { +#Insert table [no_id] < key value +# [key value +# […]] + local \ + table="$1" \ + no_id="${2:-0}" \ + insert_keys \ + insert_values \ + results + while read key value + do + (( ${#insert_keys} )) && insert_keys+="," + insert_keys+='`'"$key"'`' + (( ${#insert_values} )) && insert_values+="," + if [[ $value == NULL ]] + then + insert_values+="NULL" + else + insert_values+='"'"${value//\"/\\\"}"'"' + fi + done + echo "INSERT INTO $table" \ + "( $insert_keys )" \ + "VALUES" \ + "( $insert_values );" >&3 + (( no_id )) || { + echo 'SELECT LAST_INSERT_ID();' >&3 + read -u 4 results + echo "$results" + } +} +Update(){ +#Update table set_key set_value [set_key set_value […]] < where_key where_value +# [where_key where_value +# […]] + local \ + table="$1" \ + key \ + argument \ + value \ + set_statement \ + where_keys \ + where_values \ + what \ + where_statement \ + results + shift + what=key + for argument + do + case $what in + key) + set_statement="${set_statement:+${set_statement+,}}\`$argument\`" + what=value + ;; + value) + set_statement="${set_statement}='$argument'" + what=key + ;; + esac + done + while read key value + do + (( ${#where_statement} )) && where_statement+=( "AND" ) + if [[ $value == NULL ]] + then + where_statement+=( "$key is NULL" ) + else + where_statement+=( "$key='$value'" ) + fi + done + echo "UPDATE '$table' SET" \ + "$set_statement" \ + "WHERE" \ + "${where_statement[@]}" \ + ";" >&3 +} +InsertOrUpdate() { +#InsertOrUpdate table set_key set_value [set_key set_value […]] < where_key where_value +# [where_key where_value +# […]] + local \ + table="$1" \ + argument \ + key \ + keys \ + set_keys \ + set_values \ + value \ + values \ + what \ + results + shift + what=key + for argument + do + case $what in + key) + set_keys+=( "$argument" ) + what=value + ;; + value) + set_values+=( "$argument" ) + what=key + ;; + esac + done + while read key value + do + keys+=( "$key" ) + values+=( "$value" ) + done + if results=$( + Select "$table" id < <( + for key in ${!keys[@]} + do + echo "${keys[$key]}" "${values[$key]}" + done + ) + ) + then + Update "$table" "$@" < <( + for key in ${!keys[@]} + do + echo "${keys[$key]}" "${values[$key]}" + done + ) + else + results=$( + Insert "$table" < <( + for key in ${!set_keys[@]} + do + echo "${set_keys[$key]}" "${set_values[$key]}" + done + for key in ${!keys[@]} + do + echo "${keys[$key]}" "${values[$key]}" + done + ) + ) + fi + echo "$results" +} + getFiles() { : }