67 lines
1.6 KiB
Bash
67 lines
1.6 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.
|
||
|
||
InsertIfUnset() {
|
||
#InsertIfUnset table [no_id] < key value \n key value
|
||
#
|
||
# If no_id is set to a non-zero value, the function will not return the
|
||
# auto-assigned row ID of the inserted row.
|
||
local \
|
||
table="$1" \
|
||
no_id="${2:-0}" \
|
||
column \
|
||
key \
|
||
keys \
|
||
results \
|
||
value \
|
||
values
|
||
# Read all key-value pairs from stdin into parallel arrays
|
||
while read key value
|
||
do
|
||
keys+=( "$key" )
|
||
values+=( "$value" )
|
||
done
|
||
# Choose which column to return: first key column if no_id, else 'id'
|
||
if (( no_id ))
|
||
then
|
||
column="${keys[0]}"
|
||
else
|
||
column='id'
|
||
fi
|
||
# Check if a matching row already exists
|
||
if ! results=$(
|
||
Select "$table" "$column" < <(
|
||
for key in ${!keys[@]}
|
||
do
|
||
# Strip ::AtOM:FT:: for WHERE comparison
|
||
echo "${keys[$key]}" = \
|
||
"${values[$key]//::AtOM:FT::}"
|
||
done
|
||
)
|
||
)
|
||
then
|
||
# Row not found: insert it and return the new id
|
||
results=$(
|
||
Insert "$table" < <(
|
||
for key in ${!keys[@]}
|
||
do
|
||
echo "${keys[$key]}" "${values[$key]}"
|
||
done
|
||
)
|
||
)
|
||
fi
|
||
echo "$results"
|
||
}
|