diff --git a/build.properties.example b/build.properties.example index 47e70e0..11c0077 100644 --- a/build.properties.example +++ b/build.properties.example @@ -1,5 +1,17 @@ -hibernate.url=jdbc:postgresql://localhost/pyx +# for production use, use postgres +#hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +#hibernate.driver_class=org.postgresql.Driver +#hibernate.url=jdbc:postgresql://localhost/pyx + +# for local use, you can also use sqlite +hibernate.dialect=net.socialgamer.cah.hibernate.SqliteDialect +hibernate.driver_class=org.sqlite.JDBC +hibernate.url=jdbc:sqlite:pyx.sqlite + +# these likely need specified even with sqlite, even though they don't matter hibernate.username=pyx hibernate.password=CorrectHorseBatteryStaple -hibernate.sql.show=true -hibernate.sql.format=true + +# debugging information +hibernate.sql.show=false +hibernate.sql.format=false diff --git a/pom.xml b/pom.xml index 2f914b2..7161a12 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,13 @@ UTF-8 + + + + hibernatesqlite-maven + https://hibernate-sqlite.googlecode.com/svn/trunk/mavenrepo + + @@ -264,6 +271,11 @@ javax.servlet-api 3.0.1 + + org.xerial + sqlite-jdbc + 3.8.7 + org.slf4j slf4j-log4j12 diff --git a/pyx.sqlite b/pyx.sqlite new file mode 100644 index 0000000..36ab7fe Binary files /dev/null and b/pyx.sqlite differ diff --git a/src/main/filtered-resources/WEB-INF/classes/hibernate.cfg.xml b/src/main/filtered-resources/WEB-INF/classes/hibernate.cfg.xml index 75f1d33..55e20f0 100644 --- a/src/main/filtered-resources/WEB-INF/classes/hibernate.cfg.xml +++ b/src/main/filtered-resources/WEB-INF/classes/hibernate.cfg.xml @@ -4,11 +4,11 @@ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> - org.postgresql.Driver + ${hibernate.dialect} + ${hibernate.driver_class} ${hibernate.url} ${hibernate.username} ${hibernate.password} - org.hibernate.dialect.PostgreSQLDialect org.hibernate.transaction.JDBCTransactionFactory ${hibernate.sql.show} diff --git a/src/main/java/net/socialgamer/cah/hibernate/SqliteDialect.java b/src/main/java/net/socialgamer/cah/hibernate/SqliteDialect.java new file mode 100644 index 0000000..0e7eb39 --- /dev/null +++ b/src/main/java/net/socialgamer/cah/hibernate/SqliteDialect.java @@ -0,0 +1,193 @@ +/* + * The author disclaims copyright to this source code. In place of + * a legal notice, here is a blessing: + * + * May you do good and not evil. + * May you find forgiveness for yourself and forgive others. + * May you share freely, never taking more than you give. + * + */ +// via https://gist.github.com/virasak/54436 + +package net.socialgamer.cah.hibernate; + +import java.sql.Types; + +import org.hibernate.Hibernate; +import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.function.SQLFunctionTemplate; +import org.hibernate.dialect.function.StandardSQLFunction; +import org.hibernate.dialect.function.VarArgsSQLFunction; + + +public class SqliteDialect extends Dialect { + public SqliteDialect() { + super(); + registerColumnType(Types.BIT, "integer"); + registerColumnType(Types.TINYINT, "tinyint"); + registerColumnType(Types.SMALLINT, "smallint"); + registerColumnType(Types.INTEGER, "integer"); + registerColumnType(Types.BIGINT, "bigint"); + registerColumnType(Types.FLOAT, "float"); + registerColumnType(Types.REAL, "real"); + registerColumnType(Types.DOUBLE, "double"); + registerColumnType(Types.NUMERIC, "numeric"); + registerColumnType(Types.DECIMAL, "decimal"); + registerColumnType(Types.CHAR, "char"); + registerColumnType(Types.VARCHAR, "varchar"); + registerColumnType(Types.LONGVARCHAR, "longvarchar"); + registerColumnType(Types.DATE, "date"); + registerColumnType(Types.TIME, "time"); + registerColumnType(Types.TIMESTAMP, "timestamp"); + registerColumnType(Types.BINARY, "blob"); + registerColumnType(Types.VARBINARY, "blob"); + registerColumnType(Types.LONGVARBINARY, "blob"); + // registerColumnType(Types.NULL, "null"); + registerColumnType(Types.BLOB, "blob"); + registerColumnType(Types.CLOB, "clob"); + registerColumnType(Types.BOOLEAN, "integer"); + + registerFunction("concat", new VarArgsSQLFunction(Hibernate.STRING, "", "||", "")); + registerFunction("mod", new SQLFunctionTemplate(Hibernate.INTEGER, "?1 % ?2")); + registerFunction("substr", new StandardSQLFunction("substr", Hibernate.STRING)); + registerFunction("substring", new StandardSQLFunction("substr", Hibernate.STRING)); + } + + @Override + public boolean supportsIdentityColumns() { + return true; + } + + /* + * public boolean supportsInsertSelectIdentity() { + * return true; // As specify in NHibernate dialect + * } + */ + + @Override + public boolean hasDataTypeInIdentityColumn() { + return false; // As specify in NHibernate dialect + } + + /* + * public String appendIdentitySelectToInsert(String insertString) { + * return new StringBuffer(insertString.length()+30). // As specify in NHibernate dialect + * append(insertString). + * append("; ").append(getIdentitySelectString()). + * toString(); + * } + */ + + @Override + public String getIdentityColumnString() { + // return "integer primary key autoincrement"; + return "integer"; + } + + @Override + public String getIdentitySelectString() { + return "select last_insert_rowid()"; + } + + @Override + public boolean supportsLimit() { + return true; + } + + @Override + public String getLimitString(final String query, final boolean hasOffset) { + return new StringBuffer(query.length() + 20).append(query) + .append(hasOffset ? " limit ? offset ?" : " limit ?").toString(); + } + + @Override + public boolean supportsTemporaryTables() { + return true; + } + + @Override + public String getCreateTemporaryTableString() { + return "create temporary table if not exists"; + } + + @Override + public boolean dropTemporaryTableAfterUse() { + return false; + } + + @Override + public boolean supportsCurrentTimestampSelection() { + return true; + } + + @Override + public boolean isCurrentTimestampSelectStringCallable() { + return false; + } + + @Override + public String getCurrentTimestampSelectString() { + return "select current_timestamp"; + } + + @Override + public boolean supportsUnionAll() { + return true; + } + + @Override + public boolean hasAlterTable() { + return false; // As specify in NHibernate dialect + } + + @Override + public boolean dropConstraints() { + return false; + } + + @Override + public String getAddColumnString() { + return "add column"; + } + + @Override + public String getForUpdateString() { + return ""; + } + + @Override + public boolean supportsOuterJoinForUpdate() { + return false; + } + + @Override + public String getDropForeignKeyString() { + throw new UnsupportedOperationException( + "No drop foreign key syntax supported by SQLiteDialect"); + } + + @Override + public String getAddForeignKeyConstraintString(final String constraintName, + final String[] foreignKey, + final String referencedTable, final String[] primaryKey, + final boolean referencesPrimaryKey) { + throw new UnsupportedOperationException( + "No add foreign key syntax supported by SQLiteDialect"); + } + + @Override + public String getAddPrimaryKeyConstraintString(final String constraintName) { + throw new UnsupportedOperationException( + "No add primary key syntax supported by SQLiteDialect"); + } + + @Override + public boolean supportsIfExistsBeforeTableName() { + return true; + } + +@Override + public boolean supportsCascadeDelete() { + return false; + } +}