You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by de...@apache.org on 2016/08/09 05:55:22 UTC
empire-db git commit: EMPIREDB-247
Repository: empire-db
Updated Branches:
refs/heads/EMPIREDB-247 [created] e89108aa2
EMPIREDB-247
Project: http://git-wip-us.apache.org/repos/asf/empire-db/repo
Commit: http://git-wip-us.apache.org/repos/asf/empire-db/commit/e89108aa
Tree: http://git-wip-us.apache.org/repos/asf/empire-db/tree/e89108aa
Diff: http://git-wip-us.apache.org/repos/asf/empire-db/diff/e89108aa
Branch: refs/heads/EMPIREDB-247
Commit: e89108aa2e31e88eced42d1c56cdf283d3751c08
Parents: e769f0f
Author: Jan Glaubitz <ja...@glaubitz.org>
Authored: Tue Aug 9 07:55:00 2016 +0200
Committer: Jan Glaubitz <ja...@glaubitz.org>
Committed: Tue Aug 9 07:55:00 2016 +0200
----------------------------------------------------------------------
.../java/org/apache/empire/db/DBCommand.java | 14 ++++++++++
.../java/org/apache/empire/db/DBDatabase.java | 28 ++++++++++++++++++++
.../org/apache/empire/db/DBDriverFeature.java | 3 ++-
.../empire/db/mysql/DBDatabaseDriverMySQL.java | 12 +++++++++
4 files changed, 56 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/empire-db/blob/e89108aa/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
index f3eff01..6941cc8 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
@@ -42,6 +42,7 @@ import org.apache.empire.db.expr.set.DBSetExpr;
import org.apache.empire.exceptions.InternalException;
import org.apache.empire.exceptions.MiscellaneousErrorException;
import org.apache.empire.exceptions.ObjectNotValidException;
+import org.apache.empire.exceptions.NotSupportedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -1131,6 +1132,19 @@ public abstract class DBCommand extends DBCommandExpr
}
/**
+ * Creates the Insert or Update ("UPSERT") SQL-Command.
+ *
+ * This depends on your Database (driver) and might not be supported.
+ * Check DBDatabaseDriver.isSupported(PERFORM_UPSERT)
+ *
+ * @return the SQL-Command
+ */
+ public synchronized String getInsertOrUpdate()
+ {
+ throw new NotSupportedException(this, "getInsertOrUpdate");
+ }
+
+ /**
* Creates the delete SQL-Command.
*
* @param table the table object
http://git-wip-us.apache.org/repos/asf/empire-db/blob/e89108aa/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
index bd4a754..5d84c30 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
@@ -1387,6 +1387,34 @@ public abstract class DBDatabase extends DBObject
}
/**
+ * Executes an Insert or Update Statement from a command object
+ *
+ * This depends on your Database (driver) and might not be supported.
+ * Check DBDatabaseDriver.isSupported(PERFORM_UPSERT)
+ *
+ * @param cmd the command object containing the update command
+ * @param conn a valid connection to the database.
+ * @return the number of records that have been updated or inserted with the supplied statement
+ */
+ public final int executeInsertOrUpdate(DBCommand cmd, Connection conn)
+ {
+ if (getDriver().isSupported(DBDriverFeature.PERFORM_UPSERT))
+ {
+ return executeSQL(cmd.getInsertOrUpdate(), cmd.getParamValues(), conn);
+ }
+ else
+ {
+ log.warn("{} is not supported by your Database(driver). Falling back to two statements");
+ int count = executeUpdate(cmd, conn);
+ if (count < 1) {
+ // nothing updated -> INSERT
+ count += executeInsert(cmd, conn);
+ }
+ return count;
+ }
+ }
+
+ /**
* Executes a Delete statement from a command object
* @param from the database table from which to delete records
* @param cmd the command object containing the delete constraints
http://git-wip-us.apache.org/repos/asf/empire-db/blob/e89108aa/empire-db/src/main/java/org/apache/empire/db/DBDriverFeature.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDriverFeature.java b/empire-db/src/main/java/org/apache/empire/db/DBDriverFeature.java
index c0004e4..7cb7758 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDriverFeature.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDriverFeature.java
@@ -28,5 +28,6 @@ public enum DBDriverFeature {
CREATE_SCHEMA,
SEQUENCES,
QUERY_LIMIT_ROWS,
- QUERY_SKIP_ROWS
+ QUERY_SKIP_ROWS,
+ PERFORM_UPSERT
}
http://git-wip-us.apache.org/repos/asf/empire-db/blob/e89108aa/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java b/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
index b758b74..2429660 100644
--- a/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
+++ b/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
@@ -121,6 +121,17 @@ public class DBDatabaseDriverMySQL extends DBDatabaseDriver
addWhere(buf);
return buf.toString();
}
+
+ @Override
+ public synchronized String getInsertOrUpdate()
+ {
+ StringBuilder buf = new StringBuilder(getInsert());
+ buf.append(" ON DUPLICATE KEY UPDATE ");
+ long context = CTX_NAME | CTX_VALUE;
+ addListExpr(buf, set, context, ", ");
+ return buf.toString();
+ }
+
}
// Properties
@@ -571,6 +582,7 @@ public class DBDatabaseDriverMySQL extends DBDatabaseDriver
case SEQUENCES: return useSequenceTable;
case QUERY_LIMIT_ROWS: return true;
case QUERY_SKIP_ROWS: return true;
+ case PERFORM_UPSERT: return true;
default:
// All other features are not supported by default
return false;