89 lines
1.9 KiB
Bash
89 lines
1.9 KiB
Bash
#!/bin/bash
|
|
|
|
# Copyright © 2012-2026 ScriptFanix
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# A copy of the GNU General Public License v3 is includded in the LICENSE file
|
|
# at the root of the project.
|
|
|
|
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
|
|
# Parse positional args as alternating key/value pairs for the SET
|
|
# clause
|
|
what=key
|
|
for argument
|
|
do
|
|
case $what in
|
|
key)
|
|
set_keys+=( "$argument" )
|
|
what=value
|
|
;;
|
|
value)
|
|
set_values+=( "$argument" )
|
|
what=key
|
|
;;
|
|
esac
|
|
done
|
|
# Read WHERE conditions from stdin
|
|
while read key value
|
|
do
|
|
keys+=( "$key" )
|
|
values+=( "$value" )
|
|
done
|
|
# Check if a matching row exists using the WHERE keys
|
|
if results=$(
|
|
Select "$table" ${keys[0]} < <(
|
|
for key in ${!keys[@]}
|
|
do
|
|
echo "${keys[$key]}" = "${values[$key]}"
|
|
done
|
|
)
|
|
)
|
|
then
|
|
# Row exists: update it with the SET values
|
|
Update "$table" "$@" < <(
|
|
for key in ${!keys[@]}
|
|
do
|
|
echo "${keys[$key]}" = "${values[$key]}"
|
|
done
|
|
)
|
|
else
|
|
# Row not found: insert combining SET columns and WHERE-match
|
|
# columns
|
|
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"
|
|
}
|