<project name="hotel" default="dist" basedir=".">

   <description>Tasks to manage the databases (import, export, drop, create). Always called via build.xml</description>
   
   <property name="sql.url.h2"      value="jdbc:h2:${db.home}/${db.sql.name};MV_STORE=FALSE;LOG=0;CACHE_SIZE=65536;LOCK_MODE=0;UNDO_LOG=0" />
   <property name="sql.url.pg"      value="jdbc:postgresql://${db.host}:${db.port}/${db.sql.name}" />
   <property name="sql.url.mariadb" value="jdbc:mariadb://${db.host}:${db.port}/${db.sql.name}" />
   <condition property="java.ext.dir.param" value="-Djava.ext.dirs=${db.spi.lib}" else="-Dignorethis">
     <not>
       <javaversion atleast="11"/>
     </not>
   </condition>
   <condition property="java.locale.providers.param" else="-Djava.locale.providers=SPI,JRE" value="-Djava.locale.providers=SPI,CLDR,COMPAT">
       <javaversion atleast="11"/>
   </condition>
   <tstamp>
      <format property="LOG_STAMP" pattern="yyyyMMdd_HHmmss" />
   </tstamp>

   <condition property="p2jpl.jar.path" value="${deploy.home.abs}/lib/p2jpl.jar" else="/usr/share/java/p2jpl.jar">
      <isset property="isWindows"  />
   </condition>

   <!-- drop the H2 database by deleting the ${db.home} directory -->
   <target name="clean.db.h2" description="Remove generated database directory." if="${db.h2}">
      <delete failonerror="false">
         <fileset dir="${db.home}" includes="${db.sql.name}.*" />
      </delete>
      <delete includeemptydirs="true" failonerror="false"> 
         <fileset dir="${db.home}" excludes="**/*" /> 
      </delete> 
   </target>

   <!-- create a fresh H2 database -->
   <target name="create.db.h2"
           description="Creates an empty H2 database instance using the DDL generated during conversion."
           if="${db.h2}">
      <record name="create_db_h2_${db.name}_${LOG_STAMP}.log" action="start"/>
      <java classname="com.goldencode.p2j.persist.deploy.ScriptRunner"
            fork="true"
            failonerror="true"
            dir="${basedir}" >
         <jvmarg value="-Xmx1g"/>
         <jvmarg value="${java.locale.providers.param}"/>
         <jvmarg value="${java.ext.dir.param}"/>
         <jvmarg value="-Dfile.encoding=UTF-8"/>
         <jvmarg value="-Djava.util.logging.config.file=${fwd.home}/cfg/logging.properties"/>
         <arg value ="${sql.url.h2}"/>
         <arg value="${sql.user}"/>
         <arg value="${sql.user.pass}"/>
         <arg value ="create.tables"/>
         <arg value = "table_${db.name}"/>
         <arg value ="-continueOnError"/>
         <classpath refid="app.classpath"/>
      </java>
      <record name="create_db_h2_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>

   <!-- do the import in the H2 database -->
   <target name="import.db.h2"
           description="Import data (.d files) into database."
           if="${db.h2}">
      <record name="import_db_h2_${db.name}_${LOG_STAMP}.log" action="start"/>
      <java classname="com.goldencode.p2j.pattern.PatternEngine"
            fork="true"
            failonerror="true"
            dir="${basedir}" >
         <jvmarg value="-Xmx1g"/>
         <jvmarg value="${java.locale.providers.param}"/>
         <jvmarg value="${java.ext.dir.param}"/>
         <jvmarg value="-Dfile.encoding=UTF-8"/>
         <jvmarg value="-Djava.system.class.loader=com.goldencode.asm.AsmClassLoader"/>
         <arg value ="-d"/>
         <arg value ="2"/>
         <arg value ="dbName=${escaped.quotes}${db.name}${escaped.quotes}"/>
         <arg value ="targetDb=${escaped.quotes}h2${escaped.quotes}"/>
         <arg value ="url=${escaped.quotes}${sql.url.h2}${escaped.quotes}"/>
         <arg value ="uid=${escaped.quotes}${sql.user}${escaped.quotes}"/>
         <arg value ="pw=${escaped.quotes}${sql.user.pass}${escaped.quotes}"/>
         <arg value ="dataPath=${escaped.quotes}${data.rel}/dump/${db.name}${escaped.quotes}"/>
         <arg value ="maxThreads=${db.import_threads}"/>
         <arg value ="jdbcBatchSize=${db.batch_size}"/>
         <arg value ="schema/import"/>
         <arg value ="${data.rel}"/>
         <arg value ="${db.name}.p2o"/>
         <classpath refid="import.classpath"/>
      </java>
      <record name="import_db_h2_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>
   
   <!-- do the export from the H2 database -->
   <target name="export.db.h2"
           description="Export data from H2 database into (.d files)"
           if="${db.h2}">
      <record name="export_db_h2_${db.name}_${LOG_STAMP}.log" action="start"/>
      <!-- create export and lobs directories if they don't exist -->
      <mkdir dir="${data.rel}/export/${db.logical.name}" />
      <mkdir dir="${data.rel}/export/${db.logical.name}/lobs" />
      <java classname="com.goldencode.p2j.schema.ExportWorker"
            fork="true"
            failonerror="true"
            dir="${basedir}" >
         <jvmarg value="-Xmx4g"/>
         <jvmarg value="-Djava.system.class.loader=com.goldencode.asm.AsmClassLoader"/>
         <jvmarg value="-Djava.util.logging.config.file=${fwd.home}/cfg/logging.properties"/>
         <jvmarg value="-Dfile.encoding=UTF-8"/>
         <jvmarg value="-Ddmo_package=${pkgroot.dot}.dmo"/>
         <jvmarg value="-Ddatabase_name=${db.logical.name}"/>
         <jvmarg value="-Dconnection.password=${sql.admin.pass}"/>
         <jvmarg value="-Dconnection.username=${sql.admin}"/>
         <jvmarg value="-Dconnection.url=${sql.url.h2}"/>
         <arg line="
          -exportPath ${data.rel}/export/${db.logical.name}
          -lobsPath ${data.rel}/export/${db.logical.name}/lobs
          -maxThreads ${db.export_threads}
          -encoding UTF-8"/>
         <classpath refid="export.classpath"/>
      </java>
      <record name="export_db_h2_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>
   
   <!-- drop the PostgreSQL database -->
   <target name="clean.db.pg" description="Drop PostgreSQL database." if="${db.postgresql}">
      <record name="clean_db_pg_${db.name}_${LOG_STAMP}.log" action="start"/>
      <exec executable="dropdb">
         <env key="PGPASSWORD" value="${sql.admin.pass}" />
         <arg value="-U" />
         <arg value="${sql.admin}" />
         <arg value="-h" />
         <arg value="${db.host}" />
         <arg value="-p" />
         <arg value="${db.port}" />
         <arg value="${db.sql.name}" />
      </exec>
      <record name="clean_db_pg_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>
   
   <!-- create a fresh PostgreSQL database -->
   <target name="create.db.pg"
           description="Create an empty PostgreSQL database instance using the DDL generated during conversion."
           if="${db.postgresql}">
      <record name="create_db_pg_${db.name}_${LOG_STAMP}.log" action="start"/>
      <!-- create an empty database -->
      <exec executable="createdb">
         <env key="PGPASSWORD" value="${sql.admin.pass}" />
         <arg value="-U" />
         <arg value="${sql.admin}" />
         <arg value="-h" />
         <arg value="${db.host}" />
         <arg value="-p" />
         <arg value="${db.port}" />
         <arg value="${db.sql.name}" />
      </exec>
      <!-- apply the schema to it -->
      <exec executable="psql">
         <env key="PGPASSWORD" value="${sql.user.pass}" />
         <arg value="-U" />
         <arg value="${sql.user}" />
         <arg value="-h" />
         <arg value="${db.host}" />
         <arg value="-p" />
         <arg value="${db.port}" />
         <arg value="-f" />
         <arg value="ddl/schema_table_${db.name}_postgresql.sql" />
         <arg value="${db.sql.name}" />
      </exec>
      <antcall target="sql.udfs.pg" inheritAll="true" inheritRefs="true"/>
      <record name="create_db_pg_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>

   <!-- install the native UDFs in PostgreSQL database -->
   <target name="sql.udfs.pg" if="${db.sql.udfs}">
      <record name="sql_udfs_pg_${db.name}_${LOG_STAMP}.log" action="start"/>
      <java classname="com.goldencode.p2j.persist.deploy.ScriptRunner"
            fork="true"
            failonerror="true"
            dir="${basedir}" >
         <classpath refid="app.classpath"/>
         <jvmarg value="-Xmx1g"/>
         <jvmarg value="-Dfile.encoding=UTF-8"/>
         <jvmarg value="-Djava.util.logging.config.file=${fwd.home}/cfg/logging.properties"/>
         <arg value ="${sql.url.pg}"/>
         <arg value="${sql.admin}" />
         <arg value ="${sql.admin.pass}"/>
         <arg value ="udf.install.search_path"/>
      </java>
      <record name="sql_udfs_pg_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>
   
   <!-- do the import in the PostgreSQL database -->
   <target name="import.db.pg"
           description="Import data (.d files) into PostgreSQL database."
           if="${db.postgresql}">
      <record name="import_db_pg_${db.name}_${LOG_STAMP}.log" action="start"/>
      <java classname="com.goldencode.p2j.pattern.PatternEngine"
            fork="true"
            failonerror="true"
            dir="${basedir}" >
         <jvmarg value="-Xmx1g"/>
         <jvmarg value="-Djava.system.class.loader=com.goldencode.asm.AsmClassLoader"/>
         <jvmarg value="-Djava.util.logging.config.file=${fwd.home}/cfg/logging.properties"/>
         <jvmarg value="-Dfile.encoding=UTF-8"/>
         <arg value ="-d"/>
         <arg value ="2"/>
         <arg value ="dbName=${escaped.quotes}${db.name}${escaped.quotes}"/>
         <arg value ="targetDb=${escaped.quotes}postgresql${escaped.quotes}"/>
         <arg value ="url=${escaped.quotes}${sql.url.pg}${escaped.quotes}"/>
         <arg value ="uid=${escaped.quotes}${sql.user}${escaped.quotes}"/>
         <arg value ="pw=${escaped.quotes}${sql.user.pass}${escaped.quotes}"/>
         <arg value ="dataPath=${escaped.quotes}${data.rel}/dump/${db.name}${escaped.quotes}"/>
         <arg value ="maxThreads=${db.import_threads}"/>
         <arg value ="jdbcBatchSize=${db.batch_size}"/>
         <arg value ="schema/import"/>
         <arg value ="${data.rel}"/>
         <arg value ="${db.name}.p2o"/>
         <classpath refid="import.classpath"/>
      </java>
      <record name="import_db_pg_${db.name}_${LOG_STAMP}.log" action="stop"/>

      <record name="word_tables_pg_${db.name}_${LOG_STAMP}.log" action="start"/>
      <exec executable="psql">
         <env key="PGPASSWORD" value="${sql.user.pass}" />
         <arg value="-U" />
         <arg value="${sql.user}" />
         <arg value="-h" />
         <arg value="${db.host}" />
         <arg value="-p" />
         <arg value="${db.port}" />
         <arg value="-f" />
         <arg value="ddl/schema_word_tables_${db.name}_postgresql.sql" />
         <arg value="${db.sql.name}" />
      </exec>
      <exec executable="psql">
         <env key="PGPASSWORD" value="${sql.admin.pass}" />
         <arg value="-U" />
         <arg value="${sql.admin}" />
         <arg value="-h" />
         <arg value="${db.host}" />
         <arg value="-p" />
         <arg value="${db.port}" />
         <arg value="-c" />
         <arg value="analyze" />
         <arg value="${db.sql.name}" />
      </exec>
      <record name="word_tables_pg_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>

   <!-- do the export from the PostgreSQL database -->
   <target name="export.db.pg"
           description="Export data from PostgreSQL database into (.d files)"
           if="${db.postgresql}">
      <record name="export_db_pg_${db.name}_${LOG_STAMP}.log" action="start"/>
      <!-- create export and lobs directories if they don't exist -->
      <mkdir dir="${data.rel}/export/${db.logical.name}" />
      <mkdir dir="${data.rel}/export/${db.logical.name}/lobs" />
      <java classname="com.goldencode.p2j.schema.ExportWorker"
            fork="true"
            failonerror="true"
            dir="${basedir}" >
         <jvmarg value="-Xmx4g"/>
         <jvmarg value="-Djava.system.class.loader=com.goldencode.asm.AsmClassLoader"/>
         <jvmarg value="-Djava.util.logging.config.file=${fwd.home}/cfg/logging.properties"/>
         <jvmarg value="-Dfile.encoding=UTF-8"/>
         <jvmarg value="-Ddmo_package=${pkgroot.dot}.dmo"/>
         <jvmarg value="-Ddatabase_name=${db.logical.name}"/>
         <jvmarg value="-Dconnection.password=${sql.admin.pass}"/>
         <jvmarg value="-Dconnection.username=${sql.admin}"/>
         <jvmarg value="-Dconnection.url=${sql.url.pg}"/>
         <arg line="
          -exportPath ${data.rel}/export/${db.logical.name}
          -lobsPath ${data.rel}/export/${db.logical.name}/lobs
          -maxThreads ${db.export_threads}
          -encoding UTF-8"/>
         <classpath refid="export.classpath"/>
      </java>
      <record name="export_db_pg_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>

   <!-- drop the MariaDb database -->
   <target name="clean.db.mariadb" description="Drop MariaDb database." if="${db.mariadb}">
      <record name="clean_db_mariadb_${db.name}_${LOG_STAMP}.log" action="start"/>
      <exec executable="mysqladmin">
         <arg value="drop" />
         <arg value="${db.sql.name}" />
         <arg value="--force" />
         <arg value="--host=${db.host}" />
         <arg value="--port=${db.port}" />
         <arg value="--user=${sql.admin}" />
         <arg value="--password=${sql.admin.pass}" />
      </exec>
      <record name="clean_db_mariadb_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>

   <!-- create a fresh MariaDb database -->
   <target name="create.db.mariadb"
           description="Create an empty MariaDb database instance using the DDL generated during conversion."
           if="${db.mariadb}">
      <record name="create_db_mariadb_${db.name}_${LOG_STAMP}.log" action="start"/>
      <exec executable="mysqladmin">
         <arg value="create" />
         <arg value="${db.sql.name}" />
         <arg value="--host=${db.host}" />
         <arg value="--port=${db.port}" />
         <arg value="--user=${sql.admin}" />
         <arg value="--password=${sql.admin.pass}" />
      </exec>
      
      <!-- apply the schema to it -->
      <exec executable="mariadb">
         <arg value="--host=${db.host}" />
         <arg value="--port=${db.port}" />
         <arg value="--user=${sql.admin}" />
         <arg value="--password=${sql.admin.pass}" />
         <!--<arg value="&#45;&#45;verbose" />-->
         <arg value="${db.sql.name}" />
         <redirector input="ddl/schema_table_${db.name}_mariadb.sql" />
      </exec>

      <antcall target="sql.udfs.mariadb" inheritAll="true" inheritRefs="true"/>
      <record name="create_db_mariadb_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>
   
   <!-- install the native UDFs in MariaDb database -->
   <target name="sql.udfs.mariadb" if="${db.sql.udfs}">
      <record name="sql_udfs_mariadb_${db.name}_${LOG_STAMP}.log" action="start"/>
      <java classname="com.goldencode.p2j.persist.deploy.ScriptRunner"
            fork="true"
            failonerror="true"
            dir="${basedir}" >
         <classpath refid="app.classpath"/>
         <jvmarg value="-Xmx1g"/>
         <jvmarg value="-Dfile.encoding=UTF-8"/>
         <jvmarg value="-Djava.util.logging.config.file=${fwd.home}/cfg/logging.properties"/>
         <arg value ="${sql.url.mariadb}"/>
         <arg value="${sql.admin}" />
         <arg value ="${sql.admin.pass}"/>
         <arg value ="udf.install.search_path"/>
      </java>
      <record name="sql_udfs_mariadb_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>
   
   <!-- do the import in the MariaDb database -->
   <target name="import.db.mariadb"
           description="Import data (.d files) into MariaDb database."
           if="${db.mariadb}">
      <record name="import_db_mariadb_${db.name}_${LOG_STAMP}.log" action="start"/>
      <java classname="com.goldencode.p2j.pattern.PatternEngine"
            fork="true"
            failonerror="true"
            dir="${basedir}" >
         <jvmarg value="-Xmx1g"/>
         <jvmarg value="-server"/>
         <jvmarg value="-Djava.system.class.loader=com.goldencode.asm.AsmClassLoader"/>
         <jvmarg value="-Djava.util.logging.config.file=${fwd.home}/cfg/logging.properties"/>
         <jvmarg value="-Dfile.encoding=UTF-8"/>
         <arg value ="-d"/>
         <arg value ="2"/>
         <arg value ="dbName=${escaped.quotes}${db.name}${escaped.quotes}"/>
         <arg value ="targetDb=${escaped.quotes}mariadb${escaped.quotes}"/>
         <arg value ="url=${escaped.quotes}${sql.url.mariadb}${escaped.quotes}"/>
         <arg value ="uid=${escaped.quotes}${sql.admin}${escaped.quotes}"/>
         <arg value ="pw=${escaped.quotes}${sql.admin.pass}${escaped.quotes}"/>
         <arg value ="dataPath=${escaped.quotes}${data.rel}/dump/${db.name}${escaped.quotes}"/>
         <arg value ="maxThreads=${db.import_threads}"/>
         <arg value ="jdbcBatchSize=${db.batch_size}"/>
         <arg value ="schema/import"/>
         <arg value ="${data.rel}"/>
         <arg value ="${db.name}.p2o"/>
         <classpath refid="import.classpath"/>
      </java>
      <record name="import_db_mariadb_${db.name}_${LOG_STAMP}.log" action="stop"/>

      <record name="word_tables_mariadb_${db.name}_${LOG_STAMP}.log" action="start"/>
      <exec executable="mariadb">
         <arg value="--host=${db.host}" />
         <arg value="--port=${db.port}" />
         <arg value="--user=${sql.admin}" />
         <arg value="--password=${sql.admin.pass}" />
         <!--<arg value="&#45;&#45;verbose" />-->
         <arg value="${db.sql.name}" />
         <redirector input="ddl/schema_word_tables_${db.name}_mariadb.sql" />
      </exec>
      <record name="word_tables_mariadb_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>

   <!-- do the export from the MariaDb database -->
   <target name="export.db.mariadb"
           description="Export data from MariaDb database into (.d files)"
           if="${db.mariadb}">
      <record name="export_db_mariadb_${db.name}_${LOG_STAMP}.log" action="start"/>
      <!-- create export and lobs directories if they don't exist -->
      <mkdir dir="${data.rel}/export/${db.logical.name}" />
      <mkdir dir="${data.rel}/export/${db.logical.name}/lobs" />
      <java classname="com.goldencode.p2j.schema.ExportWorker"
            fork="true"
            failonerror="true"
            dir="${basedir}" >
         <jvmarg value="-Xmx4g"/>
         <jvmarg value="-Djava.system.class.loader=com.goldencode.asm.AsmClassLoader"/>
         <jvmarg value="-Djava.util.logging.config.file=${fwd.home}/cfg/logging.properties"/>
         <jvmarg value="-Dfile.encoding=UTF-8"/>
         <jvmarg value="-Ddmo_package=${pkgroot.dot}.dmo"/>
         <jvmarg value="-Ddatabase_name=${db.logical.name}"/>
         <jvmarg value="-Dconnection.password=${sql.admin.pass}"/>
         <jvmarg value="-Dconnection.username=${sql.admin}"/>
         <jvmarg value="-Dconnection.url=${sql.url.mariadb}"/>
         <arg line="
          -exportPath ${data.rel}/export/${db.logical.name}
          -lobsPath ${data.rel}/export/${db.logical.name}/lobs
          -maxThreads ${db.export_threads}
          -encoding UTF-8"/>
         <classpath refid="export.classpath"/>
      </java>
      <record name="export_db_mariadb_${db.name}_${LOG_STAMP}.log" action="stop"/>
   </target>
   
</project> 
