AtOM/lib/database/Insert
2026-03-13 05:15:02 +01:00

71 lines
2.0 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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.
Insert() {
#Insert table [no_id] < key value
# [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}" \
insert_keys \
insert_values \
results
# Build column list and value list from stdin key-value pairs
while read key value
do
(( ${#insert_keys} )) && insert_keys+=","
insert_keys+='`'"$key"'`'
(( ${#insert_values} )) && insert_values+=","
case $value in
'::AtOM:FT::'*)
# Force-text prefix: strip the marker and quote
# as string (prevents numeric-looking values
# from being stored as int / float)
value="${value//::AtOM:FT::/}"
insert_values+='"'"${value//\"/\"\"}"'"'
;;
'NULL')
# Insert SQL NULL (not the string "NULL")
insert_values+="NULL"
;;
+([0-9])?(.+([0-9])))
# Pure integer or decimal: insert unquoted for
# numeric storage
insert_values+=$value
;;
*)
# General string: restore encoded newlines,
# then quote
value=${value//::AtOM:NewLine:SQL:Inline::/$'\n'}
insert_values+='"'"${value//\"/\"\"}"'"'
;;
esac
done
echo "INSERT INTO $table" \
"( $insert_keys )" \
"VALUES" \
"( $insert_values );" >&3
# Unless no_id is set, return the auto-assigned row ID
(( no_id )) || {
echo 'SELECT LAST_INSERT_ROWID();' >&3
read -u4 -r -d $'\0' results
echo "$results"
}
}