MyFirstUDRKit/test/execsql.sh

493 lines
10 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
license() {
echo This is a dummy function to allow the editors code folding ability to hide this text
#=============================================================================
# Initial Developer's Public License.
# The contents of this file are subject to the Initial Developer's Public
# License Version 1.0 (the "License"). You may not use this file except
# in compliance with the License. You may obtain a copy of the License at
# http://www.ibphoenix.com?a=ibphoenix&page=ibp_idpl
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is copyright 2004-2023 Paul Reeves.
#
# The Initial Developer of the Original Code is Paul Reeves
#
# All Rights Reserved.
#
#=============================================================================
# To Do
#
# Add Debug/Verbose/better logging
:
}
todo() {
# To Do
#
# Add Debug/Verbose/better logging
:
}
GETOPT=$(getopt -o b:c:d:f:i:hs:u:p:z: --long firebirdbin:,firebirdconf:,firebirddb:,firebird:,input:,help,savedb:,user:,pass:,firebirdserverversion: -n "$0" -- "$@")
EXECFILENAME=$(basename "$0")
declare -i FIREBIRDMAJORVERSION=0
declare -i FIREBIRDMINORVERSION=0
ShowHelp(){
tabs 3,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77
DOCNOTE=$(cat << MSG
\n
### $(basename $0)\n
\t
\t\n
\tRun this script from a console prompt. It will execute ddl\n
\tto (re)create a firebird database.\n
\t\n
\t\t -i | --input ALIASNAME \n
\t\t\t\tPass the name of the master script to execute.\n
\t\t\t\tThis master script must have the same name as the alias used\n
\t\t\t\tfor the database that is being worked on.\n
\t\n
\t\t\t\tIf the alias does not exist in alias.conf it will be added.\n
\t\n
\t\t\t\t\t\$ALIAS = \$FIREBIRD_CONF\\\$ALIAS.fdb\n
\t\n
\t\t\t\tNOTE: Do not add the script file type (.sql)\n
\t\n
### Options\n
\t\n
\t Other available parameters:\n
\t\n
\t\t -f | --firebirdconf a/path/to/firebird/conf files\n
\t\t\t\tAssign a path to the FIREBIRD_CONF variable\n
\t\t\t\tDefault is /opt/firebird\n
\t\n
\t\t -d | --firebirddb a/path/to/firebird/db\n
\t\t\t\tAssign a path to the FB_DATA variable\n
\t\t\t\tDefault is /srv/data/\n
\t\n
\t\t -s | --savedb /a/backup/dir \n
\t\t\t\tDo a gbak backup of the existing db before executing ddl\n
\t\n
\t\t -h | --help\n
\t\t\t\tThis help screen.\n
\t\n
\t\n
MSG
)
local _help=$BASE_NAME-readme.md
echo -e $DOCNOTE > ${_help}
cat ${_help}
}
#################### Start of generic functions #############################
Pause() {
local _aprompt
if [ "${1:-}" = "" ]; then
_aprompt="Press any key to continue..."
else
_aprompt="$*"
fi
#shellcheck disable=SC2162
read -p "$_aprompt"
}
GetTime(){
export LOGSTAMP=$(date "+%Y-%m-%d %H:%M:%S")
export DATESTAMP=$(date +%Y%m%d)
export TIMESTAMP=$(date +%Y%m%d-%H%M%S)
export TAGSTAMP=$(date +:%Y%m%d%H%M)
case "${1:-}" in
LOGSTAMP)
echo LOGSTAMP is "$LOGSTAMP"
;;
DATESTAMP)
echo DATE is "$DATESTAMP"
;;
TIMESTAMP)
echo TIMESTAMP is "$TIMESTAMP"
;;
TAGSTAMP)
echo TAGSTAMP is "$TAGSTAMP"
;;
esac
}
GetLogStamp() {
GetTime "LOGSTAMP"
}
Debug() {
# Debug is intended for printing values assigned to variables etc.
if [ "${DEBUG:-}" = "1" ]; then
GetTime
local FUNC=$1
shift
echo -e $LOGSTAMP $FUNC "-" "$@"
fi
}
Verbose() {
# Verbose is intended to give the user a more
# detailed narrative of programm execution.
# shellcheck disable=SC2166
if [ "${VERBOSE:-}" == "1" -o "${DEBUG:-}" == "1" ]; then
GetTime
if [ "${2:-}" = "" ]; then
echo -e $LOGSTAMP "$@"
else
local FUNC=${1:-}
shift
echo -e $LOGSTAMP $FUNC "-" "$@"
fi
fi
}
WriteLog() {
# Param 1 - Logfile
# Param 2 - FUNCNAME
# We automatically call Verbose after shifting LOGFILE
# We then shift FUNCNAME and write out to the log.
GetTime
local LOGFILE=${1:-}
shift
Verbose "$@"
# shellcheck disable=SC2166
if [ ! "${VERBOSE:-}" = 1 -o ! "${DEBUG:-}" = 1 ]; then
shift
fi
if [ ! "${LOGFILE:-}" = "" ]; then
echo -e $LOGSTAMP "-" "$@" >> $LOGFILE
fi
}
Stop() {
# Echo error message and stop execution.
### TODO
exit $1
}
Error(){
#====
echo ""
echo " Error in $0"
echo " $*"
echo ""
return 1
}
######################### END OF GENERIC FUNCTIONS #########################
# Parse commandline options.
ParseCommandLine() {
set +x
if [ $# -le 0 ]; then
#ShowHelp
return 2
fi
eval set -- "$GETOPT"
while [ -n "$1" ]; do
case "$1" in
-h|--help) return 2 ;;
-b|--firebirdbin)
if [ "$2" ] > /dev/null 2>&1; then
export FIREBIRD_BIN="$2";
fi
shift;
;;
-c|--firebirdconf)
if [ "$2" ] > /dev/null 2>&1; then
export FIREBIRD_CONF="$2";
fi
shift;
;;
-d|--firebirddb)
if [ "$2" ] > /dev/null 2>&1; then
export FIREBIRD_DATA="$2";
fi
shift;
;;
-f|--firebird)
if [ "$2" ] > /dev/null 2>&1; then
export FIREBIRD="$2";
fi
shift;
;;
-i|--input)
if [ "$2" ] > /dev/null 2>&1; then
ALIAS="$2";
fi
shift;
;;
-s|-savedb)
if [ "$2" ] > /dev/null 2>&1; then
export FB_BACKUP_PATH="$2";
fi
shift;
;;
-u|--user)
if [ "$2" ] > /dev/null 2>&1; then
export ISC_USER="$2";
fi
shift;
;;
-p|--pass)
if [ "$2" ] > /dev/null 2>&1; then
export ISC_PASSWORD="$2";
fi
shift;
;;
-z|--firebirdserverversion)
if [ "$2" ] > /dev/null 2>&1; then
export FIREBIRDMAJORVERSION=$(echo "$2" | cut --delimiter "." -f 1 );
export FIREBIRDMINORVERSION=$(echo "$2" | cut --delimiter "." -f 2 );
fi
shift;
;;
esac
shift;
done
if [ -z "$FIREBIRD" ]; then
export FIREBIRD=/opt/firebird
fi
if [ -z "$FIREBIRD_BIN" ]; then
export FIREBIRD_BIN=/opt/firebird/bin
fi
if [ -z "$FB_DATA" ]; then
export FB_DATA=/srv/data/active
fi
if [ -z "$FIREBIRD_CONF" ]; then
export FIREBIRD_CONF=/opt/firebird
fi
set +x
if [ -z "$ALIAS" ]; then
return 1
fi
if [ -z "$ISC_USER" ]; then
ISC_USER=DBOWNER
fi
if [ -z "$ISC_PASSWORD" ]; then
ISC_PASSWORD=masterkey
fi
#echo FIREBIRDMAJORVERSION is $FIREBIRDMAJORVERSION
if [ $FIREBIRDMAJORVERSION -eq 0 ]; then
#set -x
FIREBIRDMAJORVERSION=$(GetFirebirdServerMajorVersion)
echo FIREBIRDMAJORVERSION is "$FIREBIRDMAJORVERSION"
#set +x
fi
if [ ${FIREBIRDMAJORVERSION:-0} -ge 3 ]; then
DBCONF=databases.conf
else
DBCONF=aliases.conf
fi
#echo FIREBIRDMINORVERSION is $FIREBIRDMINORVERSION
if [ "$FIREBIRDMINORVERSION" == "" ]; then
FIREBIRDMINORVERSION=$(GetFirebirdServerMinorVersion)
echo FIREBIRDMINORVERSION is "$FIREBIRDMINORVERSION"
fi
case "$FIREBIRDMAJORVERSION" in
2)
ODS=112
;;
3)
ODS=120
;;
4)
ODS=130
;;
5)
ODS=140
;;
esac
export ISC_USER
export ISC_PASSWORD
}
GetFirebirdServerMajorVersion() {
# This will return Firebird or Avalerion or ...?
# echo $(${FIREBIRD_BIN}/firebird -z) | cut --delimiter " " -f 6
echo $(${FIREBIRD_BIN}/firebird -z) | cut --delimiter " " -f 7 | cut -d "." -f 1
}
GetFirebirdServerMinorVersion() {
echo $(${FIREBIRD_BIN}/firebird -z) | cut --delimiter " " -f 7 | cut -d "." -f 2 > /dev/null
}
#============
main() {
BASE_NAME=$(basename $0 .sh )
ParseCommandLine $*
case $? in
1) Error $*; exit;;
2) ShowHelp; exit;;
esac
if [[ -z $ISC_USER ]]; then export ISC_USER=SYSDBA; fi
if [[ -z $ISC_PASSWORD ]]; then export ISC_PASSWORD=masterkey; fi
echo "$(date) Started"
#Delete old files
for afile in autogrant.ddl grants_isql.txt $ALIAS.txt
do
if [ -f $afile ]; then
rm $afile > /dev/null 2>&1
fi
done
# Check we have an alias for %1
# If it doesn't exist then check for FB_DATA and
# try and create it.
cat $FIREBIRD_CONF/$DBCONF | grep $ALIAS > /dev/null 2>&1
if [ $? -gt 0 ]; then
echo "Adding $ALIAS to $FIREBIRD_CONF/$DBCONF"
echo $ALIAS = $FB_DATA/ods$ODS/$ALIAS.fdb >> $FIREBIRD_CONF/$DBCONF
else
echo "Found $ALIAS in $FIREBIRD_CONF/$DBCONF"
fi
if [ $(whoami) = "root" ]; then
mkdir -p $FB_DATA/ods$ODS
chown firebird.firebird $FB_DATA/ods$ODS
chmod 770 $FB_DATA/ods$ODS
fi
#run gbak on the existing database, if any.
if [ -d "$FB_BACKUP_PATH" ]; then
gbak -b -user $ISC_USER -pas $ISC_PASSWORD -se localhost:service_mgr $ALIAS \
$FB_BACKUP_PATH/$ALIAS.gbak
else
echo "Not backing up old database $ALIAS"
fi
echo "-- (Re)create empty database" > recreate_db.ddl
echo "-- This file is automatically regenerated by $EXECFILENAME" >> recreate_db.ddl
echo "-- Do not edit." >> recreate_db.ddl
echo "-- " >> recreate_db.ddl
#generate database (re)creation script.
DBFILENAME=$(cat $FIREBIRD_CONF/$DBCONF | grep -v ^# | grep $ALIAS --max-count=1 | cut -d \= -f 2 | tr -d ' ')
echo DBFILENAME is $DBFILENAME
if [ -f $DBFILENAME ]; then
# echo "connect 'localhost:$ALIAS';" >> recreate_db.ddl
echo "connect '$ALIAS';" >> recreate_db.ddl
echo "drop database;" >> recreate_db.ddl
echo "" >> recreate_db.ddl
fi
#echo "create database 'localhost:$ALIAS';" >> recreate_db.ddl
echo "create database '$ALIAS' SET NAMES 'UTF8';" >> recreate_db.ddl
echo "commit;" >> recreate_db.ddl
#echo "connect '$ALIAS';" >> recreate_db.ddl
#echo "CREATE OR ALTER USER SYSDBA PASSWORD 'masterkey' using plugin Srp;" >> #recreate_db.ddl
#echo "commit;" >> recreate_db.ddl
#Pause
#run creation script
if [ -f $ALIAS.sql ]; then
echo Running $ALIAS.sql...
${FIREBIRD_BIN}/isql -b -user DB_OWNER -pass masterkey -role RDB$ADMIN -e -i $ALIAS.sql -o $ALIAS.txt -m -m2 > /dev/null
else
echo Could not find $ALIAS.sql.
echo Exiting.
exit;
fi
# This should be part of recreate_db.ddl
if [ $(whoami) = "root" ]; then
chown firebird.firebird $DBFILENAME
chmod 660 $DBFILENAME
fi
#print errors
echo
echo Checking for Errors...
echo
echo
#cat $ALIAS.txt | grep -B 16 -A 16 "Statement failed"
_err_count=$(cat $ALIAS.txt | grep -c "Statement failed")
if [ $_err_count -eq 0 ]; then
echo No errors found.
echo Script completed successfully.
echo
echo ====================================
echo
echo Here are the last lines from $ALIAS.txt
echo
tail -n 40 $ALIAS.txt
else
echo Script failed with the following errors:
cat $ALIAS.txt | grep -B 5 -A 4 "Statement failed"
fi
echo
echo
echo "$(date) Completed."
}
main "$@"