You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2020/11/19 17:55:10 UTC
[cayenne] 02/03: Execution method has been overridden for FrontBase
This is an automated email from the ASF dual-hosted git repository.
ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 271e680af0378aa63730e8aaa79c048567c959f3
Author: andreykravchenko <an...@objectstyle.com>
AuthorDate: Thu Nov 12 13:53:55 2020 +0300
Execution method has been overridden for FrontBase
---
.../cayenne/access/jdbc/SQLTemplateAction.java | 5 +-
.../dba/frontbase/FrontBaseActionBuilder.java | 45 +++++++++
.../cayenne/dba/frontbase/FrontBaseAdapter.java | 13 +++
.../dba/frontbase/FrontBaseTemplateAction.java | 107 +++++++++++++++++++++
4 files changed, 166 insertions(+), 4 deletions(-)
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
index 07e6353..95f409b 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
@@ -41,7 +41,6 @@ import org.apache.cayenne.access.types.ExtendedType;
import org.apache.cayenne.access.types.ExtendedTypeMap;
import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.dba.TypesMapping;
-import org.apache.cayenne.dba.frontbase.FrontBaseAdapter;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DefaultScalarResultSegment;
@@ -189,9 +188,7 @@ public class SQLTemplateAction implements SQLAction {
boolean iteratedResult = callback.isIteratedResult();
int generatedKeys = query.isReturnGeneratedKeys() ? Statement.RETURN_GENERATED_KEYS : Statement.NO_GENERATED_KEYS;
PreparedStatement statement = connection.prepareStatement(compiled.getSql(), generatedKeys);
- if (statement == null && this.dbAdapter instanceof FrontBaseAdapter) {
- statement = connection.prepareStatement(compiled.getSql());
- }
+
try {
bind(statement, compiled.getBindings());
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseActionBuilder.java
new file mode 100644
index 0000000..badb988
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseActionBuilder.java
@@ -0,0 +1,45 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dba.frontbase;
+
+import org.apache.cayenne.access.DataNode;
+import org.apache.cayenne.dba.JdbcActionBuilder;
+import org.apache.cayenne.query.SQLAction;
+import org.apache.cayenne.query.SQLTemplate;
+
+/**
+ * An action builder for FrontBaseActionBuilder.
+ *
+ * @since 4.2
+ */
+public class FrontBaseActionBuilder extends JdbcActionBuilder {
+ /**
+ * @param dataNode
+ * @since 4.2
+ */
+ public FrontBaseActionBuilder(DataNode dataNode) {
+ super(dataNode);
+ }
+
+ @Override
+ public SQLAction sqlAction(SQLTemplate query) {
+ return new FrontBaseTemplateAction(query, dataNode);
+ }
+}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java
index d2f40e1..28c6677 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java
@@ -26,6 +26,7 @@ import java.util.Iterator;
import java.util.List;
import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.access.DataNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
import org.apache.cayenne.access.types.ExtendedType;
import org.apache.cayenne.access.types.ExtendedTypeFactory;
@@ -40,6 +41,8 @@ import org.apache.cayenne.dba.TypesMapping;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.query.Query;
+import org.apache.cayenne.query.SQLAction;
import org.apache.cayenne.resource.ResourceLocator;
/**
@@ -215,4 +218,14 @@ public class FrontBaseAdapter extends JdbcAdapter {
protected PkGenerator createPkGenerator() {
return new FrontBasePkGenerator(this);
}
+
+ /**
+ * Uses FrontBaseActionBuilder to create the right action.
+ *
+ * @since 4.2
+ */
+ @Override
+ public SQLAction getAction(Query query, DataNode node) {
+ return query.createSQLAction(new FrontBaseActionBuilder(node));
+ }
}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseTemplateAction.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseTemplateAction.java
new file mode 100644
index 0000000..5e3b7eb
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseTemplateAction.java
@@ -0,0 +1,107 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dba.frontbase;
+
+import org.apache.cayenne.access.DataNode;
+import org.apache.cayenne.access.OperationObserver;
+import org.apache.cayenne.access.jdbc.SQLStatement;
+import org.apache.cayenne.access.jdbc.SQLTemplateAction;
+import org.apache.cayenne.query.SQLTemplate;
+
+import java.sql.*;
+import java.util.Collection;
+
+/**
+ * @since 4.2
+ */
+public class FrontBaseTemplateAction extends SQLTemplateAction {
+ /**
+ * @param query
+ * @param dataNode
+ * @since 4.2
+ */
+ public FrontBaseTemplateAction(SQLTemplate query, DataNode dataNode) {
+ super(query, dataNode);
+ }
+
+ @Override
+ protected void execute(Connection connection, OperationObserver callback, SQLStatement compiled,
+ Collection<Number> updateCounts) throws SQLException, Exception {
+
+ long t1 = System.currentTimeMillis();
+ boolean iteratedResult = callback.isIteratedResult();
+ PreparedStatement statement = connection.prepareStatement(compiled.getSql());
+
+ try {
+ bind(statement, compiled.getBindings());
+
+ // process a mix of results
+ boolean isResultSet = statement.execute();
+
+ if(query.isReturnGeneratedKeys()) {
+ ResultSet generatedKeysResultSet = statement.getGeneratedKeys();
+ if (generatedKeysResultSet != null) {
+ processSelectResult(compiled, connection, statement, generatedKeysResultSet, callback, t1);
+ }
+ }
+
+ boolean firstIteration = true;
+ while (true) {
+ if (firstIteration) {
+ firstIteration = false;
+ } else {
+ isResultSet = statement.getMoreResults();
+ }
+
+ if (isResultSet) {
+
+ ResultSet resultSet = statement.getResultSet();
+ if (resultSet != null) {
+
+ try {
+ processSelectResult(compiled, connection, statement, resultSet, callback, t1);
+ } finally {
+ if (!iteratedResult) {
+ resultSet.close();
+ }
+ }
+
+ // ignore possible following update counts and bail early on iterated results
+ if (iteratedResult) {
+ break;
+ }
+ }
+ } else {
+ int updateCount = statement.getUpdateCount();
+ if (updateCount == -1) {
+ break;
+ }
+
+ updateCounts.add(updateCount);
+ dataNode.getJdbcEventLogger().logUpdateCount(updateCount);
+ }
+ }
+ } finally {
+ if (!iteratedResult) {
+ statement.close();
+ }
+ }
+ }
+}