blob: a010290632ddce7722ae309f376f03bae586f7e9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.nlpcraft.examples.sql.db
import java.io.File
import java.sql.SQLException
import com.typesafe.scalalogging.LazyLogging
import org.apache.commons.io.FilenameUtils
import org.h2.jdbcx.JdbcDataSource
import org.h2.tools.Server
/**
* H2 database server. Starts standalone H2 TCP instance and loads up demo database from `northwind.sql`.
*/
object SqlServer extends LazyLogging {
private final val H2_PORT: Int = 9092
private final val H2_BASEDIR = new File(System.getProperty("user.home"), "nlpcraft-examples/h2").getAbsolutePath
private final val SRV_PARAMS = Seq(
"-baseDir", H2_BASEDIR,
"-tcpPort", H2_PORT.toString,
"-tcpAllowOthers"
)
private final val INIT_FILE = "nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/northwind.sql"
final val H2_URL: String = s"jdbc:h2:tcp://localhost:$H2_PORT/nlp2sql"
@volatile private var srv: Server = _
@volatile private var started: Boolean = false
/**
* Starts the H2 server.
*/
def start(): Unit = {
if (started)
throw new IllegalStateException("Server already started.")
srv = Server.createTcpServer(SRV_PARAMS:_*).start
logger.info(s"H2 server start parameters: ${SRV_PARAMS.mkString(" ")}")
logger.info(s"H2 server status: ${srv.getStatus}")
val ds = new JdbcDataSource()
// Unix format used to avoid escape files separator for windows.
ds.setUrl(s"$H2_URL;INIT=RUNSCRIPT FROM '${FilenameUtils.separatorsToUnix(new File(INIT_FILE).getAbsolutePath)}'")
try {
ds.getConnection
logger.info(s"Database schema initialized for: $H2_URL")
}
catch {
case e: SQLException
// Table or view already exists - https://www.h2database.com/javadoc/org/h2/api/ErrorCode.html
if (e.getErrorCode != 42101)
throw e
logger.info(
s"Database '$H2_URL' is NOT initialized because data already exists. " +
s"To re-initialize - delete files in '$H2_BASEDIR' folder and start again. "
)
}
started = true
}
/**
* Stops H2 server.
*/
def stop(): Unit = {
if (!started)
throw new IllegalStateException("Server already stopped.")
if (srv != null)
srv.stop()
started = false
logger.info(s"H2 server stopped.")
}
}
/**
* H2 database server runner for command line tooling.
*/
object SqlServerRunner extends App {
SqlServer.start()
}