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/11/09 10:59:20 UTC
[13/14] empire-db git commit: EMPIREDB-247
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/890fa480
Tree: http://git-wip-us.apache.org/repos/asf/empire-db/tree/890fa480
Diff: http://git-wip-us.apache.org/repos/asf/empire-db/diff/890fa480
Branch: refs/heads/EMPIREDB-247
Commit: 890fa480f564cec82195b026566029d204bfd79c
Parents: d54dcaf
Author: Jan Glaubitz <ja...@glaubitz.org>
Authored: Tue Aug 9 07:55:00 2016 +0200
Committer: Jan Glaubitz <ja...@glaubitz.org>
Committed: Wed Nov 9 11:56:53 2016 +0100
----------------------------------------------------------------------
.../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/890fa480/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/890fa480/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/890fa480/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/890fa480/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;