You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2015/02/02 05:32:31 UTC
incubator-ignite git commit: # sprint-32: WIP Oracle metadata dialect.
Repository: incubator-ignite
Updated Branches:
refs/heads/ignite-32 7c1a29be3 -> 1a1de0b60
# sprint-32: WIP Oracle metadata dialect.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/1a1de0b6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/1a1de0b6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/1a1de0b6
Branch: refs/heads/ignite-32
Commit: 1a1de0b60928db604c1b5d2e6a49b21f4d4dbd65
Parents: 7c1a29b
Author: AKuznetsov <ak...@gridgain.com>
Authored: Mon Feb 2 11:32:36 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Mon Feb 2 11:32:36 2015 +0700
----------------------------------------------------------------------
.../parser/dialect/OracleMetadataDialect.java | 112 ++++++++++++++++++-
1 file changed, 111 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1a1de0b6/modules/schema-load/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
index ee2881b..222d1b6 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
@@ -22,12 +22,122 @@ import org.apache.ignite.schema.parser.*;
import java.sql.*;
import java.util.*;
+import static java.sql.Types.*;
+
/**
* Oracle specific metadata dialect.
*/
public class OracleMetadataDialect extends DatabaseMetadataDialect {
+ /** SQL to get indexes metadata. */
+ private static final String SQL_INDEXES = "select a.index_owner, a.table_name, a.index_name, a.column_name," +
+ " b.uniqueness" +
+ " FROM all_ind_columns a" +
+ " LEFT JOIN all_indexes b on" +
+ " (a.table_name = b.table_name AND a.table_owner = b.table_owner AND a.index_name = b.index_name)";
+
+ /** SQL to get columns metadata. */
+ private static final String SQL_COLUMNS = "SELECT owner, table_name, column_name, nullable, data_type" +
+ " FROM all_tab_columns" +
+ " WHERE owner = '%s'" +
+ " ORDER BY owner, table_name, column_id";
+
+ /**
+ * @param type Column type from Oracle database.
+ * @return JDBC type.
+ */
+ private static int decodeType(String type) {
+ switch (type) {
+ case "CHAR":
+ case "NCHAR":
+ return CHAR;
+
+ case "VARCHAR2":
+ case "NVARCHAR2":
+ return VARCHAR;
+
+ case "LONG":
+ return LONGVARCHAR;
+
+ case "LONG RAW":
+ return LONGVARBINARY;
+
+ case "FLOAT":
+ return FLOAT;
+
+ case "NUMBER":
+ return NUMERIC;
+
+ case "DATE":
+ return DATE;
+
+ case "TIMESTAMP":
+ return TIMESTAMP;
+
+ case "BFILE":
+ case "BLOB":
+ return BLOB;
+
+ case "CLOB":
+ case "NCLOB":
+ case "XMLTYPE":
+ return CLOB;
+ }
+
+ return OTHER;
+ }
+
+ /**
+ * @param nullable Column nullable attribute from Oracle database.
+ * @return {@code true}
+ */
+ private static boolean decodeNullable(String nullable) {
+ return "Y".equals(nullable);
+ }
+
/** {@inheritDoc} */
@Override public Collection<DbTable> tables(Connection conn, boolean tblsOnly) throws SQLException {
- return null; // TODO: CODE: implement.
+ Collection<DbTable> tbls = new ArrayList<>();
+
+ try (Statement stmt = conn.createStatement()) {
+ Collection<DbColumn> cols = new ArrayList<>();
+
+ try(ResultSet colsRs = stmt.executeQuery(String.format(SQL_COLUMNS, "TEST"))) {
+ String prevSchema = "";
+ String prevTbl = "";
+
+ while (colsRs.next()) {
+ String schema = colsRs.getString("OWNER");
+ String tbl = colsRs.getString("TABLE_NAME");
+
+ if (prevSchema.isEmpty()) {
+ prevSchema = schema;
+ prevTbl = tbl;
+ }
+
+ if (schema.equals(prevSchema) && tbl.equals(prevTbl)) {
+ cols.add(new DbColumn(colsRs.getString("COLUMN_NAME"),
+ decodeType(colsRs.getString("DATA_TYPE")),
+ false,
+ decodeNullable(colsRs.getString("NULLABLE"))
+ ));
+ }
+ else {
+ tbls.add(new DbTable(prevSchema, prevTbl, cols, Collections.<String>emptySet(),
+ Collections.<String>emptySet(), null));
+
+ cols = new ArrayList<>();
+
+ prevSchema = schema;
+ prevTbl = tbl;
+ }
+ }
+
+ if (!cols.isEmpty())
+ tbls.add(new DbTable(prevSchema, prevTbl, cols, Collections.<String>emptySet(),
+ Collections.<String>emptySet(), null));
+ }
+ }
+
+ return tbls;
}
}