Project

General

Profile

import.sh

Roger Borrello, 08/24/2023 04:26 PM

Download (7.19 KB)

 
1
#!/bin/bash
2

    
3
#set -x
4

    
5
show_usage()
6
{
7
   i=0
8
   i=$((i+1)); usage[$i]="Usage: $0 [-r<data_dir>] [-d<dump_dir>] [-c] [-f<path_to_p2j.jar>] [-a<path_to_app.jar>] \
9
--db_admin=<dbadmin> --db_adminpw=<dbadminpw> --db_user=<dbuser> --db_userpw=<dbuserpw> --db_names=<db names> --db_host=<dbhost> --db_port=<dbport>"
10
   i=$((i+1)); usage[$i]="Where:"
11
   i=$((i+1)); usage[$i]="\t r = Relative path to the data directory (def=$reldata_dir_name)"
12
   i=$((i+1)); usage[$i]="\t d = Path to the data dump directories if performing an import (def=$dump_dir_name)"
13
   i=$((i+1)); usage[$i]="\t c = Running in a container. If this option is passed in, \"--db_host=\" specifies a container"
14
   i=$((i+1)); usage[$i]="\t f = Path to p2j.jar (def=$fwd_jar)"
15
   i=$((i+1)); usage[$i]="\t a = Path to app.jar (def=$app_jar)"
16
   i=$((i+1)); usage[$i]="\t--db_admin=<dbadmin> DB admin user for DB creation (def=$dbadmin)"
17
   i=$((i+1)); usage[$i]="\t--db_adminpw=<dbadminpw> DB admin user password for the import (def=$dbadmin_pw)"
18
   i=$((i+1)); usage[$i]="\t--db_user=<dbuser> DB user for the import (def=$dbuser)"
19
   i=$((i+1)); usage[$i]="\t--db_userpw=<dbuserpw> DB user password for the import (def=$dbuser_pw)"
20
   i=$((i+1)); usage[$i]="\t--db_names=<db names> DB names for import (def=$dbnames)"
21
   i=$((i+1)); usage[$i]="\tOption format is \"<db names (separate multiples with commas)>\")"
22
   i=$((i+1)); usage[$i]="\t\t For example: \"--db_names=hotel\" or \"--db_names=hotel,ledger,prices\""
23
   i=$((i+1)); usage[$i]="\t--db_host=<dbhost> PostGreSQL server name or IP. If -c is specified, this is a container name (def=$dbhost)"
24
   i=$((i+1)); usage[$i]="\t--db_port=<dbport> Port to connect to for DB access (def=$dbport)"
25
   i=$((i+1)); usage[$i]="\tNOTE: APP_DBADMIN_PASSWORD and APP_DBUSER_PASSWORD variables can be set in the environment instead of passed on command line."
26

    
27
   for i in "${usage[@]}"; do
28
      echo -e $i
29
   done
30
}
31

    
32
# Function to split a comma-delimited string into an array
33
split_string()
34
{
35
   local input_string="$1"   # The input comma-delimited string
36

    
37
   IFS=',' read -ra array <<< "$input_string"
38
   echo "${array[@]}"
39
   unset IFS
40
}
41

    
42
get_container_ip()
43
{
44
   local cname=$1
45
   if [ "$cname" == "localhost" ]; then
46
      echo $cname
47
   else 
48
      docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $cname
49
   fi
50
}
51

    
52
dbadmin=$APP_DBADMIN                   # fwd_admin
53
dbadmin_pw=$APP_DBADMIN_PASSWORD       # admin
54
db_table_schema=$APP_TABLE_SCHEMA      # From conversion: ddl/schema_table_${dbnames}_postgresql.sql
55
dbuser=$APP_DBUSER                     # fwd_user
56
dbuser_pw=$APP_DBUSER_PASSWORD         # user
57
dbnames=$APP_DBNAMES                   # appdb
58
dbport=$APP_DBPORT                     # 5432
59
reldata_dir_name=$APP_RELDATA_DIR      # data
60
dump_dir_name=$APP_DUMP_DIR            # $APP_DUMP_DIR
61
dbhost=$DB_CONTAINER                   # app_pg14
62
fwd_jar=/opt/fwd/build/lib/p2j.jar
63
app_jar=/opt/hotel/lib/hotel.jar
64

    
65
# Sanity check default values
66
[ -z "$dbadmin" ] && dbadmin="fwd_admin"
67
[ -z "$dbadmin_pw" ] && dbadmin_pw="admin"
68
[ -z "$dbuser" ] && dbuser="fwd_user"
69
[ -z "$dbuser_pw" ] && dbuser_pw="user"
70
[ -z "$dbnames" ] && dbnames="hotel"
71
[ -z "$dbport" ] && dbport="5432"
72
[ -z "$reldata_dir_name" ] && reldata_dir_name="data"
73
[ -z "$db_table_schema" ] && db_table_schema="ddl/schema_table_${dbnames}_postgresql.sql"
74
[ -z "$dump_dir_name" ] && dump_dir_name="${reldata_dir_name}/dump"
75
[ -z "$dbhost" ] && dbhost="localhost"
76
[ -z "$fwd_jar" ] && fwd_jar="./p2j/build/lib/p2j.jar"
77
[ -z "$app_jar" ] && app_jar="./build/lib/hotel.jar"
78

    
79
# process options
80
while getopts "h?cr:d:f:a:-:" opt; do
81
   case $opt in
82
      c  ) use_container=true
83
           ;;
84
      r  ) reldata_dir_name=$OPTARG
85
           ;;
86
      d  ) dump_dir_name=$OPTARG
87
           ;;
88
      f  ) fwd_jar=$OPTARG
89
           ;;
90
      a  ) app_jar=$OPTARG
91
           ;;
92
      -  ) case ${OPTARG} in
93
              "db_admin"*    ) dbadmin=$(echo $OPTARG | cut -d"=" -f2) ;;
94
              "db_adminpw"*  ) dbadmin_pw=$(echo $OPTARG | cut -d"=" -f2) ;;
95
              "db_user"*     ) dbuser=$(echo $OPTARG | cut -d"=" -f2) ;;
96
              "db_userpw"*   ) dbuser_pw=$(echo $OPTARG | cut -d"=" -f2) ;;
97
              "db_names"*    ) dbnames=$(echo $OPTARG | cut -d"=" -f2) ;;
98
              "db_port"*     ) dbport=$(echo $OPTARG | cut -d"=" -f2) ;;
99
              "db_schema"*   ) db_table_schema=$(echo $OPTARG | cut -d"=" -f2) ;;
100
              "db_host"*     ) dbhost=$(echo $OPTARG | cut -d"=" -f2) ;;
101
           esac ;;
102
      h | \
103
      \? ) show_usage && exit 1
104
           ;;
105
   esac
106
done
107
shift $(($OPTIND - 1))
108

    
109
# Sanity check passed in values
110
db_array=($(split_string "$dbnames"))
111
[ "$use_container" == "true" ] && pg_name=$(get_container_ip ${dbhost}) || pg_name=$dbhost
112
if [ ! -z "$dump_dir_name" ] && [ ! -e "$dump_dir_name" ]; then
113
   echo "ERROR: cannot find ${dump_dir_name}. Check -d option."
114
   show_usage && exit 1
115
fi
116
if [ ! -e "$fwd_jar" ]; then
117
   echo "ERROR: cannot find ${fwd_jar}. Check -f option."
118
   show_usage && exit 1
119
fi
120
if [ ! -e "$app_jar" ]; then
121
   echo "ERROR: cannot find ${app_jar}. Check -a option."
122
   show_usage && exit 1
123
fi
124

    
125
# Grab the DDL from the app.jar
126
temp_dir=$(mktemp -d "tempdir_ddl_XXXXXX")
127
unzip -qj $app_jar ddl/schema_table_* -d $temp_dir
128
for item in "${db_array[@]}"; do
129
   db_table_schema="schema_table_${item}_postgresql.sql"
130
   if [ ! -e "${temp_dir}/${db_table_schema}" ]; then
131
      echo "ERROR: cannot find ${db_table_schema} in ${app_jar}. Check build."
132
      show_usage && exit 1
133
   fi
134
done
135

    
136
# Loop through our list of DBs
137
for item in "${db_array[@]}"; do
138
   export PGPASSWORD=$dbadmin_pw
139
   # Drop the DB, if necessary
140
   if psql -U $dbadmin -h $pg_name -p $dbport -lqt | cut -d \| -f 1 | tr -s '[:space:]' ' ' | grep -qw "$item"; then
141
      echo "Dropping DB $item ..."
142
      dropdb -U $dbadmin -h $pg_name -p $dbport $item
143
   fi
144

    
145
   # Create the DB
146
   echo "Creating DB $item using OWNER $dbadmin ..."
147
   createdb -U $dbadmin -h $pg_name -p $dbport $item
148

    
149
   db_table_schema=${temp_dir}/schema_table_${item}_postgresql.sql
150
   echo "Creating schema for $item from $db_table_schema ..."
151
   export PGPASSWORD=$dbuser_pw
152
   psql -U $dbuser -h $pg_name -p $dbport -f $db_table_schema $item
153

    
154
   echo "Setup UDFs ..."
155
   db_url=jdbc:postgresql://${pg_name}:${dbport}/${item}
156
   cmd="java -Xmx1g -Dfile.encoding=UTF-8 -cp $fwd_jar com.goldencode.p2j.persist.deploy.ScriptRunner $db_url $dbadmin $dbadmin_pw udf.install.search_path"
157
   echo "Performing cmd=$cmd"
158
   eval $cmd
159

    
160
   if [ ! -z "$dump_dir_name" ]; then
161
      echo "Import dump from ${dump_dir_name}/${item} into $item  ..."
162
      cmd="java -Xmx1g -Djava.system.class.loader=com.goldencode.asm.AsmClassLoader -Dfile.encoding=UTF-8 \
163
          -cp ${fwd_jar}:${app_jar} com.goldencode.p2j.pattern.PatternEngine \
164
          -d 2 \
165
          "dbName=\\\"${item}\\\"" \
166
          "targetDb=\\\"postgresql\\\"" \
167
          "url=\\\"${db_url}\\\"" \
168
          "uid=\\\"${dbuser}\\\"" \
169
          "pw=\\\"${dbuser_pw}\\\"" \
170
          "dataPath=\\\"${dump_dir_name}/${item}/\\\"" \
171
          "maxThreads=4" \
172
          schema/import \
173
          ${reldata_dir_name}/ \
174
          ${item}.p2o"
175

    
176
      echo "Performing cmd=$cmd"
177
      eval $cmd
178
   else
179
      echo "WARNING: no data import requested."
180
   fi
181
done
182

    
183
unset PGPASSWORD
184
rm -fr $temp_dir
185