aboutsummaryrefslogtreecommitdiffstats
path: root/mdbc-server/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'mdbc-server/src/main')
-rwxr-xr-xmdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java2
-rw-r--r--mdbc-server/src/main/java/org/onap/music/mdbc/query/QueryProcessor.java44
2 files changed, 42 insertions, 4 deletions
diff --git a/mdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java b/mdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java
index f1ac851..b4d7bb9 100755
--- a/mdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java
+++ b/mdbc-server/src/main/java/org/onap/music/mdbc/MdbcConnection.java
@@ -500,7 +500,7 @@ public class MdbcConnection implements Connection {
public void preStatementHook(final String sql) throws MDBCServiceException, SQLException {
//TODO: verify ownership of keys here
//Parse tables from the sql query
- Map<String, List<SQLOperation>> tableToInstruction = QueryProcessor.parseSqlQuery(sql);
+ Map<String, List<SQLOperation>> tableToInstruction = QueryProcessor.parseSqlQuery(sql, table_set);
//Check ownership of keys
String defaultSchema = dbi.getSchema();
List<Range> queryTables = MDBCUtils.getTables(defaultSchema, tableToInstruction);
diff --git a/mdbc-server/src/main/java/org/onap/music/mdbc/query/QueryProcessor.java b/mdbc-server/src/main/java/org/onap/music/mdbc/query/QueryProcessor.java
index fc41cf6..06ad252 100644
--- a/mdbc-server/src/main/java/org/onap/music/mdbc/query/QueryProcessor.java
+++ b/mdbc-server/src/main/java/org/onap/music/mdbc/query/QueryProcessor.java
@@ -25,7 +25,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-
+import java.util.Set;
import org.apache.calcite.avatica.util.Casing;
import org.apache.calcite.avatica.util.Quoting;
import org.apache.calcite.sql.SqlBasicCall;
@@ -73,10 +73,13 @@ public class QueryProcessor {
/**
*
* @param query
+ * @param tables set of tables found in sql database. This is only used as a cross reference,
+ * the parser will try to find tables in the query first, regardless of whether they
+ * are in this set
* @return map of table name to {@link org.onap.music.mdbc.query.SQLOperation}
* @throws SqlParseException
*/
- public static Map<String, List<SQLOperation>> parseSqlQuery(String query) throws SQLException {
+ public static Map<String, List<SQLOperation>> parseSqlQuery(String query, Set<String> tables) throws SQLException {
logger.info(EELFLoggerDelegate.applicationLogger, "Parsing query: "+query);
query = query.trim();
if (query.endsWith(";")) {
@@ -94,7 +97,7 @@ public class QueryProcessor {
sqlNode = getSqlParser(query).parseStmt();
} catch (SqlParseException e) {
logger.error(EELFLoggerDelegate.errorLogger, "Unable to parse query: " + query +". " + e.getMessage());
- throw new SQLException("Unable to parse query: " + query);
+ return basicStringParser(query, tables);
}
SqlBasicVisitor<Void> visitor = new SqlBasicVisitor<Void>() {
@@ -209,5 +212,40 @@ public class QueryProcessor {
opList.add(op);
tableOpsMap.put(identifier.toString(), opList);
}
+
+ /**
+ * Parse the string using basic string methods if parsing library fails
+ * @param query
+ * @return
+ * @throws SQLException
+ */
+ private static Map<String, List<SQLOperation>> basicStringParser(String query, Set<String> tables) throws SQLException {
+ if (tables==null) {
+ throw new SQLException("Unable to parse sql query: No tables to look for.");
+ }
+ Map<String, List<SQLOperation>> tableOpsMap = new HashMap<>();
+ SQLOperation op;
+ if (query.toUpperCase().startsWith("INSERT")) {
+ op = SQLOperation.INSERT;
+ } else if (query.toUpperCase().startsWith("UPDATE")) {
+ op = SQLOperation.UPDATE;
+ } else if (query.toUpperCase().startsWith("DELETE")) {
+ op = SQLOperation.DELETE;
+ } else if (query.toUpperCase().startsWith("SELECT")) {
+ op = SQLOperation.SELECT;
+ } else {
+ throw new SQLException("Unable to parse sql query: " + query);
+ }
+ for (String table: tables) {
+ if (query.toLowerCase().contains(table.toLowerCase())) {
+ List<SQLOperation> opList = tableOpsMap.get(table);
+ if (opList == null) opList = new ArrayList<>();
+ opList.add(op);
+ tableOpsMap.put(table.toString(), opList);
+ }
+ }
+ return tableOpsMap;
+ }
+
}