From 6869e1e4edc001b29ef466c8b47f6264e9994709 Mon Sep 17 00:00:00 2001 From: Paul Reeves Date: Wed, 25 Jan 2023 14:54:48 +0100 Subject: [PATCH] Initial commit --- test/execsql.sh | 483 ++++++++++++++++++++++++++++++++++++++++++++ test/grants.ddl | 105 ++++++++++ test/testudrkit.ddl | 12 ++ test/testudrkit.sql | 25 +++ 4 files changed, 625 insertions(+) create mode 100755 test/execsql.sh create mode 100644 test/grants.ddl create mode 100644 test/testudrkit.ddl create mode 100644 test/testudrkit.sql diff --git a/test/execsql.sh b/test/execsql.sh new file mode 100755 index 0000000..17f1fd4 --- /dev/null +++ b/test/execsql.sh @@ -0,0 +1,483 @@ +#!/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 + +export ISC_USER=SYSDBA +export ISC_PASSWORD=masterkey + +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';" >> 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 FWFRAMEWORK_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 + +if [ $(whoami) = "root" ]; then + chown firebird.firebird $DBFILENAME + chmod 660 $DBFILENAME +fi + + +#print errors +echo Checking for Errors +cat $ALIAS.txt | grep -B 16 -A 16 "Statement failed" +if [ $? -gt 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 20 $ALIAS.txt + echo +fi +echo "$(date) Completed." +} + +main "$@" diff --git a/test/grants.ddl b/test/grants.ddl new file mode 100644 index 0000000..462b209 --- /dev/null +++ b/test/grants.ddl @@ -0,0 +1,105 @@ +-- exit; + +/* + * 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-2020 Paul Reeves. + * + * The Initial Developer of the Original Code is Paul Reeves + * + * All Rights Reserved. + * + */ + + + +set list on; +set echo off; +-- These files should be deleted by the calling batch file +-- however if this script is run standalone then uncomment these lines. +--shell del autogrant.ddl; +--shell del grants_isql.txt; +output autogrant.ddl; + +select distinct ' EXECUTE ON PROCEDURE ' || RDB$PROCEDURE_NAME || ' to SYSDBA;' as "GRANT" +from RDB$PROCEDURES +where RDB$PROCEDURE_NAME not starting with 'RDB$' and RDB$SYSTEM_FLAG = 0; + +select distinct ' EXECUTE ON FUNCTION ' || RDB$FUNCTION_NAME || ' to SYSDBA;' as "GRANT" +from RDB$FUNCTIONS +where RDB$FUNCTION_NAME not starting with 'RDB$' and RDB$SYSTEM_FLAG = 0; + +select ' ALL ON ' || RDB$RELATION_NAME || ' to SYSDBA;' as "GRANT" +from RDB$RELATIONS +where RDB$RELATION_NAME not starting with 'RDB$' +and RDB$RELATION_NAME not starting with 'MON$' +and RDB$RELATION_NAME not starting with 'SEC$' ; + + +select distinct ' ALL ON ' || RDB$VIEW_NAME || ' to SYSDBA;' as "GRANT" +from RDB$VIEW_RELATIONS +where RDB$VIEW_NAME not starting with 'RDB$'; + + +select distinct ' EXECUTE ON PROCEDURE ' || RDB$PROCEDURE_NAME || ' to FWFRAMEWORK_OWNER;' as "GRANT" +from RDB$PROCEDURES +where RDB$PROCEDURE_NAME not starting with 'RDB$' and RDB$SYSTEM_FLAG = 0; + +select distinct ' EXECUTE ON FUNCTION ' || RDB$FUNCTION_NAME || ' to FWFRAMEWORK_OWNER;' as "GRANT" +from RDB$FUNCTIONS +where RDB$FUNCTION_NAME not starting with 'RDB$' and RDB$SYSTEM_FLAG = 0; + +select ' ALL ON ' || RDB$RELATION_NAME || ' to FWFRAMEWORK_OWNER;' as "GRANT" +from RDB$RELATIONS +where RDB$RELATION_NAME not starting with 'RDB$' +and RDB$RELATION_NAME not starting with 'MON$' +and RDB$RELATION_NAME not starting with 'SEC$' ; + +select distinct ' ALL ON ' || RDB$VIEW_NAME || ' to FWFRAMEWORK_OWNER;' as "GRANT" +from RDB$VIEW_RELATIONS +where RDB$VIEW_NAME not starting with 'RDB$'; + +-- FIX ME - we need to grant admin to framework_owner, check that the full list is generated and then look +-- at revoking the output, or hard-coding the grant list +select ' usage on generator ' || trim(r.RDB$GENERATOR_NAME) || ' to ' || trim(s.SEC$USER_NAME) || ';' as "GRANT" +from RDB$GENERATORS r +cross join SEC$USERS s +where r.RDB$SYSTEM_FLAG <>1; + +/* +-- Uncomment this section to grant all to public. Or use this as a +-- template to grant to specific users. + +select ' ALL ON ' || RDB$RELATION_NAME || ' to public;' as "GRANT" +from RDB$RELATIONS +where RDB$RELATION_NAME not starting with 'RDB$' +and RDB$RELATION_NAME not starting with 'MON$' +and RDB$RELATION_NAME not starting with 'SEC$' ; + + +select distinct ' ALL ON ' || RDB$VIEW_NAME || ' to public;' as "GRANT" +from RDB$VIEW_RELATIONS +where RDB$VIEW_NAME not starting with 'RDB$'; + +-- This is too broad! +--select distinct ' EXECUTE ON PROCEDURE ' || RDB$PROCEDURE_NAME || ' to public;' as "GRANT" +--from RDB$PROCEDURES +--where RDB$PROCEDURE_NAME not starting with 'RDB$' and RDB$SYSTEM_FLAG = 0; +*/ + +output grants_isql.txt; +set echo on; +input autogrant.ddl; +commit; + + + + diff --git a/test/testudrkit.ddl b/test/testudrkit.ddl new file mode 100644 index 0000000..1f7783d --- /dev/null +++ b/test/testudrkit.ddl @@ -0,0 +1,12 @@ +/* + create tables for test db +*/ + + +create sequence test_div_seq; +commit; +create domain D_ID as BIGINT; + +create table test_div( + test_div_id d_id generated always as identity +); diff --git a/test/testudrkit.sql b/test/testudrkit.sql new file mode 100644 index 0000000..2cb3994 --- /dev/null +++ b/test/testudrkit.sql @@ -0,0 +1,25 @@ +set echo on; +set sql dialect 3; +set names UTF8; + +input recreate_db.ddl; + +-- create db objects +input testudrkit.ddl; + +-- insert some test data +input testudrkit.dml; + +-- run some tests +input testudrkit-tests.dml; + +/* Successfully completed execution of testudrkit.sql */ +EXIT; + + + + + + + +