change flavor from enum to interface, fix int/long bug in JDBC pool, add queue implementation
parent
7198e766c3
commit
1047be8456
@ -1,5 +1,5 @@
|
||||
group = org.xbib
|
||||
name = database
|
||||
version = 0.0.5
|
||||
version = 1.0.0
|
||||
|
||||
org.gradle.warning.mode = ALL
|
||||
|
@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
@ -1,4 +1,13 @@
|
||||
import org.xbib.jdbc.query.Flavor;
|
||||
import org.xbib.jdbc.query.flavor.Derby;
|
||||
import org.xbib.jdbc.query.flavor.Hsql;
|
||||
import org.xbib.jdbc.query.flavor.Oracle;
|
||||
import org.xbib.jdbc.query.flavor.Postgresql;
|
||||
import org.xbib.jdbc.query.flavor.SqlServer;
|
||||
|
||||
module org.xbib.jdbc.query {
|
||||
uses Flavor;
|
||||
requires transitive org.xbib.jdbc.connection.pool;
|
||||
exports org.xbib.jdbc.query;
|
||||
provides Flavor with Derby, Hsql, Oracle, Postgresql, SqlServer;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,196 @@
|
||||
package org.xbib.jdbc.query.flavor;
|
||||
|
||||
import org.xbib.jdbc.query.Flavor;
|
||||
|
||||
import java.sql.Date;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
|
||||
public class BigQuery implements Flavor {
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "bigQuery";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supports(String url) {
|
||||
return url.startsWith("jdbc:bigquery:");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String driverClass() {
|
||||
return "com.simba.googlebigquery.jdbc42.Driver";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNormalizedUpperCase() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeInteger() {
|
||||
return "int64";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBoolean() {
|
||||
// BigQuery has a native boolean type, but we're not trying to use it
|
||||
return "string";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLong() {
|
||||
return "int64";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeFloat() {
|
||||
return "float64";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDouble() {
|
||||
return "float64";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBigDecimal(int size, int precision) {
|
||||
return "numeric";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringVar(int length) {
|
||||
return "string";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringFixed(int length) {
|
||||
return "string";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeClob() {
|
||||
return "string";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBlob() {
|
||||
return "bytes";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDate() {
|
||||
return "datetime";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLocalDate() {
|
||||
return "date";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useStringForClob() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useBytesForBlob() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceNextVal(String sequenceName) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceSelectNextVal(String sequenceName) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceDrop(String dbtestSeq) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tableDrop(String table) {
|
||||
return "drop table " + table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsInsertReturning() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dbTimeMillis() {
|
||||
return "current_timestamp()";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCacheClause(int nbrValuesToCache) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOrderClause(boolean order) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCycleClause(boolean cycle) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String fromAny() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dateAsSqlFunction(Timestamp date, Calendar calendar) {
|
||||
// Construct a datetime literal
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS000");
|
||||
dateFormat.setCalendar(calendar);
|
||||
return String.format("datetime '%s'", dateFormat.format(date));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String localDateAsSqlFunction(Date date) {
|
||||
// Construct a datetime literal
|
||||
return String.format("datetime '%s'", date.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOptions() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutoCommitOnly() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String writeNextIntoQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readNextFromQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String succeedInQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String failInQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
@ -0,0 +1,194 @@
|
||||
package org.xbib.jdbc.query.flavor;
|
||||
|
||||
import org.xbib.jdbc.query.Flavor;
|
||||
|
||||
import java.sql.Date;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
|
||||
public class Derby implements Flavor {
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "derby";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supports(String url) {
|
||||
return url.startsWith("jdbc:derby:");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String driverClass() {
|
||||
return "org.apache.derby.jdbc.EmbeddedDriver";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNormalizedUpperCase() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeInteger() {
|
||||
return "integer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBoolean() {
|
||||
return "char(1)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLong() {
|
||||
return "bigint";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeFloat() {
|
||||
return "real";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDouble() {
|
||||
return "double";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBigDecimal(int size, int precision) {
|
||||
return "numeric(" + size + "," + precision + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringVar(int length) {
|
||||
return "varchar(" + length + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringFixed(int length) {
|
||||
return "char(" + length + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeClob() {
|
||||
return "clob";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBlob() {
|
||||
return "blob";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDate() {
|
||||
return "timestamp";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLocalDate() {
|
||||
return "date";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useStringForClob() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useBytesForBlob() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceNextVal(String sequenceName) {
|
||||
return "next value for " + sequenceName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceSelectNextVal(String sequenceName) {
|
||||
return "values next value for " + sequenceName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceDrop(String sequenceName) {
|
||||
return "drop sequence " + sequenceName + " restrict";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tableDrop(String table) {
|
||||
return "drop table " + table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsInsertReturning() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCacheClause(int nbrValuesToCache) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOrderClause(boolean order) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCycleClause(boolean cycle) {
|
||||
return cycle ? " cycle" : " no cycle";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dbTimeMillis() {
|
||||
return "current_timestamp";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String fromAny() {
|
||||
return " from sysibm.sysdummy1";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dateAsSqlFunction(Timestamp date, Calendar calendar) {
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
dateFormat.setCalendar(calendar);
|
||||
return "timestamp('" + dateFormat.format(date) + "')";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String localDateAsSqlFunction(Date date) {
|
||||
return "'" + date.toString() + "'";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOptions() {
|
||||
return " as bigint";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutoCommitOnly() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String writeNextIntoQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readNextFromQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String succeedInQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String failInQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,192 @@
|
||||
package org.xbib.jdbc.query.flavor;
|
||||
|
||||
import org.xbib.jdbc.query.Flavor;
|
||||
|
||||
import java.sql.Date;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
|
||||
public class Hsql implements Flavor {
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "hsqldb";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supports(String url) {
|
||||
return url.startsWith("jdbc:hsqldb:");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String driverClass() {
|
||||
return "org.hsqldb.jdbc.JDBCDriver";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNormalizedUpperCase() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeInteger() {
|
||||
return "integer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBoolean() {
|
||||
return "char(1)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLong() {
|
||||
return "bigint";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeFloat() {
|
||||
return "double";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDouble() {
|
||||
return "double";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBigDecimal(int size, int precision) {
|
||||
return "numeric(" + size + "," + precision + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringVar(int length) {
|
||||
return "varchar(" + length + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringFixed(int length) {
|
||||
return "char(" + length + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeClob() {
|
||||
return "clob(2G)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBlob() {
|
||||
return "blob(2G)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDate() {
|
||||
return "timestamp(3)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLocalDate() {
|
||||
return "date";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useStringForClob() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useBytesForBlob() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceNextVal(String sequenceName) {
|
||||
return "next value for " + sequenceName + "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceSelectNextVal(String sequenceName) {
|
||||
return "select " + sequenceNextVal(sequenceName) + fromAny();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceDrop(String dbtestSeq) {
|
||||
return "drop sequence if exists " + dbtestSeq;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tableDrop(String table) {
|
||||
return "drop table if exists " + table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOrderClause(boolean order) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCycleClause(boolean cycle) {
|
||||
return cycle ? " cycle" : " no cycle";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String fromAny() {
|
||||
return " from (values(0))";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsInsertReturning() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dbTimeMillis() {
|
||||
return "localtimestamp";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCacheClause(int nbrValuesToCache) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dateAsSqlFunction(Timestamp date, Calendar calendar) {
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS000XXX");
|
||||
dateFormat.setCalendar(calendar);
|
||||
return "cast(timestamp '" + dateFormat.format(date) + "' as timestamp without time zone)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String localDateAsSqlFunction(Date date) {
|
||||
return "'" + date.toString() + "'";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOptions() {
|
||||
return " as bigint";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutoCommitOnly() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String writeNextIntoQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readNextFromQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String succeedInQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
@Override
|
||||
public String failInQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
@ -0,0 +1,200 @@
|
||||
package org.xbib.jdbc.query.flavor;
|
||||
|
||||
import org.xbib.jdbc.query.Flavor;
|
||||
|
||||
import java.sql.Date;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
|
||||
public class Oracle implements Flavor {
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "oracle";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supports(String url) {
|
||||
return url.startsWith("jdbc:oracle:");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String driverClass() {
|
||||
return "oracle.jdbc.OracleDriver";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNormalizedUpperCase() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeFloat() {
|
||||
return "binary_float";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDouble() {
|
||||
return "binary_double";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBigDecimal(int size, int precision) {
|
||||
return "numeric(" + size + "," + precision + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeInteger() {
|
||||
return "numeric(10)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBoolean() {
|
||||
return "char(1 char)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLong() {
|
||||
return "numeric(19)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDate() {
|
||||
return "timestamp(3)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLocalDate() {
|
||||
return "date";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useStringForClob() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useBytesForBlob() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceNextVal(String sequenceName) {
|
||||
return sequenceName + ".nextval";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceSelectNextVal(String sequenceName) {
|
||||
return "select " + sequenceName + ".nextval from dual";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceDrop(String sequenceName) {
|
||||
return "drop sequence " + sequenceName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tableDrop(String table) {
|
||||
return "drop table " + table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringVar(int length) {
|
||||
return "varchar2(" + length + " char)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringFixed(int length) {
|
||||
return "char(" + length + " char)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeClob() {
|
||||
return "clob";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBlob() {
|
||||
return "blob";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOrderClause(boolean order) {
|
||||
return order ? " order" : " noorder";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCycleClause(boolean cycle) {
|
||||
return cycle ? " cycle" : " nocycle";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsInsertReturning() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dbTimeMillis() {
|
||||
return "systimestamp(3)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCacheClause(int nbrValuesToCache) {
|
||||
if (nbrValuesToCache < 2) {
|
||||
return " nocache";
|
||||
}
|
||||
return " cache " + nbrValuesToCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String fromAny() {
|
||||
return " from dual";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dateAsSqlFunction(Timestamp date, Calendar calendar) {
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS000");
|
||||
dateFormat.setCalendar(calendar);
|
||||
return "timestamp '" + dateFormat.format(date) + "'";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String localDateAsSqlFunction(Date date) {
|
||||
return "to_date('" + date.toString() + "', 'yyyy-mm-dd')";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOptions() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutoCommitOnly() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String writeNextIntoQueue(String table) {
|
||||
return "insert into " + table
|
||||
+ " (channel, data, state, delay, modified) "
|
||||
+ "values (?, ?, null, 0, ?)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readNextFromQueue(String table) {
|
||||
return "select id, data from " + table +
|
||||
" where channel = ? and state is NULL and modified <= (CAST (? as TIMESTAMP) - (INTERVAL '1 minute' * delay))" +
|
||||
" order by id asc limit 1 for update skip lock";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String succeedInQueue(String table) {
|
||||
return "update" + table + " set state = 'OK', modified = " + dbTimeMillis() + " where id = ?";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String failInQueue(String table) {
|
||||
return "update" + table + " set state = 'FAIL', modified = " + dbTimeMillis() + " where id = ?";
|
||||
}
|
||||
}
|
@ -0,0 +1,197 @@
|
||||
package org.xbib.jdbc.query.flavor;
|
||||
|
||||
import org.xbib.jdbc.query.Flavor;
|
||||
|
||||
import java.sql.Date;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
|
||||
public class Postgresql implements Flavor {
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "postgresql";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supports(String url) {
|
||||
return url.startsWith("jdbc:postgresql:");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String driverClass() {
|
||||
return "org.postgresql.Driver";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNormalizedUpperCase() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeInteger() {
|
||||
return "integer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBoolean() {
|
||||
return "char(1)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLong() {
|
||||
return "bigint";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeFloat() {
|
||||
return "real";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDouble() {
|
||||
return "double precision";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBigDecimal(int size, int precision) {
|
||||
return "numeric(" + size + "," + precision + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringVar(int length) {
|
||||
return "varchar(" + length + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringFixed(int length) {
|
||||
return "char(" + length + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeClob() {
|
||||
return "text";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBlob() {
|
||||
return "bytea";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDate() {
|
||||
return "timestamp(3)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLocalDate() {
|
||||
return "date";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useStringForClob() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useBytesForBlob() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceNextVal(String sequenceName) {
|
||||
return "nextval('" + sequenceName + "')";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceSelectNextVal(String sequenceName) {
|
||||
return "select nextval('" + sequenceName + "')";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceDrop(String dbtestSeq) {
|
||||
return "drop sequence " + dbtestSeq;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tableDrop(String table) {
|
||||
return "drop table if exists " + table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOrderClause(boolean order) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCycleClause(boolean cycle) {
|
||||
return cycle ? " cycle" : " no cycle";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String fromAny() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsInsertReturning() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dbTimeMillis() {
|
||||
return "date_trunc('milliseconds',localtimestamp)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCacheClause(int nbrValuesToCache) {
|
||||
return " cache " + nbrValuesToCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dateAsSqlFunction(Timestamp date, Calendar calendar) {
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS000");
|
||||
dateFormat.setCalendar(calendar);
|
||||
return "'" + dateFormat.format(date) + " GMT'::timestamp";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String localDateAsSqlFunction(Date date) {
|
||||
return "'" + date.toString() + "'";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOptions() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutoCommitOnly() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String writeNextIntoQueue(String table) {
|
||||
return "insert into " + table
|
||||
+ " (channel, data, state, delay, modified) "
|
||||
+ "values (?, ?, null, 0, ?)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readNextFromQueue(String table) {
|
||||
return "select id, data from " + table +
|
||||
" where channel = ? and state is NULL and pushed_at <= (CAST (? as TIMESTAMP) - (INTERVAL '1 minute' * delay))" +
|
||||
" order by id asc limit 1 for update skip lock";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String succeedInQueue(String table) {
|
||||
return "update" + table + " set state = 'OK', modified = " + dbTimeMillis() + " where id = ?";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String failInQueue(String table) {
|
||||
return "update" + table + " set state = 'FAIL', modified = " + dbTimeMillis() + " where id = ?";
|
||||
}
|
||||
}
|
@ -0,0 +1,197 @@
|
||||
package org.xbib.jdbc.query.flavor;
|
||||
|
||||
import org.xbib.jdbc.query.Flavor;
|
||||
|
||||
import java.sql.Date;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
|
||||
public class SqlServer implements Flavor {
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "sqlServer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supports(String url) {
|
||||
return url.startsWith("jdbc:sqlserver:");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String driverClass() {
|
||||
return "com.microsoft.sqlserver.jdbc.SQLServerDriver";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNormalizedUpperCase() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeFloat() {
|
||||
return "float(24)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDouble() {
|
||||
return "float(53)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBigDecimal(int size, int precision) {
|
||||
return "numeric(" + size + "," + precision + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeInteger() {
|
||||
return "numeric(10)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBoolean() {
|
||||
return "char(1)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLong() {
|
||||
return "numeric(19)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeDate() {
|
||||
return "datetime2(3)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeLocalDate() {
|
||||
return "date";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useStringForClob() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useBytesForBlob() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceNextVal(String sequenceName) {
|
||||
return "next value for " + sequenceName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceSelectNextVal(String sequenceName) {
|
||||
return "select next value for " + sequenceName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceDrop(String dbtestSeq) {
|
||||
return "drop sequence " + dbtestSeq;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tableDrop(String table) {
|
||||
return "drop table " + table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringVar(int length) {
|
||||
return "varchar(" + length + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeStringFixed(int length) {
|
||||
return "char(" + length + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeClob() {
|
||||
return "varchar(max)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String typeBlob() {
|
||||
return "varbinary(max)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOrderClause(boolean order) {
|
||||
// Not supported
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCycleClause(boolean cycle) {
|
||||
return cycle ? " cycle" : " no cycle";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsInsertReturning() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dbTimeMillis() {
|
||||
return "current_timestamp";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceCacheClause(int nbrValuesToCache) {
|
||||
if (nbrValuesToCache < 2) {
|
||||
return " no cache";
|
||||
}
|
||||
return " cache " + nbrValuesToCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String fromAny() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dateAsSqlFunction(Timestamp date, Calendar calendar) {
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS000");
|
||||
dateFormat.setCalendar(calendar);
|
||||
return "cast('" + dateFormat.format(date) + "' as datetime2(3))";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String localDateAsSqlFunction(Date date) {
|
||||
return "'" + date.toString() + "'";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sequenceOptions() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutoCommitOnly() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String writeNextIntoQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readNextFromQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String succeedInQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String failInQueue(String table) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
org.xbib.jdbc.query.flavor.BigQuery
|
||||
org.xbib.jdbc.query.flavor.Derby
|
||||
org.xbib.jdbc.query.flavor.Hsql
|
||||
org.xbib.jdbc.query.flavor.Oracle
|
||||
org.xbib.jdbc.query.flavor.Postgresql
|
||||
org.xbib.jdbc.query.flavor.SqlServer
|
@ -0,0 +1,9 @@
|
||||
handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler
|
||||
.level=ALL
|
||||
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] %5$s %6$s%n
|
||||
java.util.logging.ConsoleHandler.level=ALL
|
||||
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
|
||||
java.util.logging.FileHandler.level=ALL
|
||||
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
|
||||
java.util.logging.FileHandler.pattern=build/marc.log
|
||||
jdk.event.security.level=INFO
|
@ -0,0 +1,3 @@
|
||||
database.url=jdbc:hsqldb:file:build/hsqldb;shutdown=true
|
||||
database.user=SA
|
||||
database.password=
|
Loading…
Reference in New Issue