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;
+ }
+}