You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2015/06/30 13:08:10 UTC

[1/2] incubator-ignite git commit: # ignite-843 Added load schema from postgres .

Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-843 8e63378bd -> 7850b0dd3


# ignite-843 Added load schema from postgres .


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/40f5a313
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/40f5a313
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/40f5a313

Branch: refs/heads/ignite-843
Commit: 40f5a31323e32cb0f40acdc304aa30587548ee69
Parents: 5359918
Author: Andrey <an...@gridgain.com>
Authored: Tue Jun 30 18:08:24 2015 +0700
Committer: Andrey <an...@gridgain.com>
Committed: Tue Jun 30 18:08:24 2015 +0700

----------------------------------------------------------------------
 .../nodejs/public/javascripts/dataStructures.js |  37 +++-
 modules/webconfig/nodejs/routes/persistences.js | 204 ++++++++++++++++++-
 2 files changed, 233 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/40f5a313/modules/webconfig/nodejs/public/javascripts/dataStructures.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/javascripts/dataStructures.js b/modules/webconfig/nodejs/public/javascripts/dataStructures.js
index 8f64ed7..2462708 100644
--- a/modules/webconfig/nodejs/public/javascripts/dataStructures.js
+++ b/modules/webconfig/nodejs/public/javascripts/dataStructures.js
@@ -44,6 +44,41 @@ eventGroups = {
         'EVT_IGFS_META_UPDATED', 'EVT_IGFS_DIR_CREATED', 'EVT_IGFS_DIR_RENAMED', 'EVT_IGFS_DIR_DELETED']
 };
 
-if (exports) {
+jdbcTypes = {
+    BIT: {value: "BIT", code: -7, label: "BIT"},
+    TINYINT: {value: "TINYINT", code: -6, label: "TINYINT"},
+    SMALLINT: {value: "SMALLINT", code: 5, label: "SMALLINT"},
+    INTEGER: {value: "INTEGER", code: 4, label: "INTEGER"},
+    BIGINT: {value: "BIGINT", code: -5, label: "BIGINT"},
+    FLOAT: {value: "FLOAT", code: 6, label: "FLOAT"},
+    REAL: {value: "REAL", code: 7, label: "REAL"},
+    DOUBLE: {value: "DOUBLE", code: 8, label: "DOUBLE"},
+    NUMERIC: {value: "NUMERIC", code: 2, label: "NUMERIC"},
+    DECIMAL: {value: "DECIMAL", code: 3, label: "DECIMAL"},
+    CHAR: {value: "CHAR", code: 1, label: "CHAR"},
+    VARCHAR: {value: "VARCHAR", code: 12, label: "VARCHAR"},
+    DATE: {value: "DATE", code: 91, label: "DATE"},
+    TIME: {value: "TIME", code: 92, label: "TIME"},
+    TIMESTAMP: {value: "TIMESTAMP", code: 93, label: "TIMESTAMP"},
+    BINARY: {value: "BINARY", code: -2, label: "BINARY"}
+};
+
+javaTypes = {
+    INTEGER: {value: "java.lang.Integer", label: "Integer"},
+    LONG: {value: "java.lang.Long", label: "Long"},
+    BIGDECIMAL: {value: "java.math.BigDecimal", label: "BigDecimal"},
+    FLOAT: {value: "java.lang.Float", label: "Float"},
+    DOUBLE: {value: "java.lang.Double", label: "Double"},
+    STRING: {value: "java.lang.String", label: "String"},
+    BOOLEAN: {value: "java.lang.Boolean", label: "Boolean"},
+    BYTE_ARRAY: {value: "byte[]", label: "byte[]"},
+    DATE: {value: "java.sql.Date", label: "Date"},
+    TIME: {value: "java.sql.Time", label: "Time"},
+    TIMESTAMP: {value: "java.sql.Timestamp", label: "Timestamp"}
+};
+
+if (typeof window === 'undefined') {
     exports.eventGroups = eventGroups;
+    exports.jdbcTypes = jdbcTypes;
+    exports.javaTypes = javaTypes;
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/40f5a313/modules/webconfig/nodejs/routes/persistences.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/routes/persistences.js b/modules/webconfig/nodejs/routes/persistences.js
index e1f726d..b1dfdb7 100644
--- a/modules/webconfig/nodejs/routes/persistences.js
+++ b/modules/webconfig/nodejs/routes/persistences.js
@@ -17,6 +17,7 @@
 
 var router = require('express').Router();
 var db = require('../db');
+var ds = require('../public/javascripts/dataStructures.js'), jdbcTypes = ds.jdbcTypes, javaTypes = ds.javaTypes;
 
 /**
  * Send spaces and persistences accessed for user account.
@@ -88,9 +89,56 @@ router.post('/remove', function(req, res) {
     })
 });
 
+// simple countdown latch
+function CDL(countdown, completion) {
+    this.countDown = function() {
+        if(--countdown < 1) completion();
+    };
+}
+
+/**
+ * @param name Source name.
+ * @return String converted to java class name notation.
+ */
+function toJavaClassName(name) {
+    var len = name.length;
+
+    var buf = [];
+
+    var capitalizeNext = true;
+
+    for (var i = 0; i < len; i++) {
+        var ch = name.charAt(i);
+
+        if (' ' == ch || '_' == ch)
+            capitalizeNext = true;
+        else if (capitalizeNext) {
+            buf.push(ch.toUpperCase());
+
+            capitalizeNext = false;
+        }
+        else
+            buf.push(ch.toLowerCase());
+    }
+
+    return buf.join("");
+}
+
+/**
+ * @param name Source name.
+ * @return String converted to java field name notation.
+ */
+function toJavaFieldName(name) {
+    var javaName = toJavaClassName(name);
+
+    return javaName.charAt(0).toLowerCase() + javaName.substring(1);
+}
+
+
 //
 router.post('/pg', function(req, res) {
     var pg = require('pg');
+    var util = require('util');
 
     var host = req.body.host;
     var port = req.body.port;
@@ -100,22 +148,164 @@ router.post('/pg', function(req, res) {
 
     var dbName = req.body.dbName;
 
-    var connectionString = sprintf('postgres://%s:%s@%s:%d/%s', username, password, host, port, dbName);
+    var connectionString = util.format('postgres://%s:%s@%s:%d/%s', username, password, host, port, dbName);
 
     pg.connect(connectionString, function(err, client, done) {
-        if(err)
+        var sendError = function (err) {
+            done();
+
             res.status(500).send(err.message);
+        };
+
+        if(err)
+            return sendError(err);
 
-        client.query('select * from information_schema.tables', function(err, result) {
-            //call `done()` to release the client back to the pool
+        var sendResponse = function () {
             done();
 
+            console.log(JSON.stringify(tables));
+
+            res.status(200).send(tables);
+        }, jdbcType = function (dataType) {
+            switch (dataType) {
+                case 'smallint':
+                case 'int2':
+                    return jdbcTypes.SMALLINT;
+                case 'integer':
+                case 'int':
+                case 'int4':
+                    return jdbcTypes.INTEGER;
+                case 'oid':
+                case 'bigint':
+                case 'int8':
+                    return jdbcTypes.BIGINT;
+                case 'money':
+                    return jdbcTypes.DOUBLE;
+                case 'decimal':
+                case 'numeric':
+                    return jdbcTypes.NUMERIC;
+                case 'float4':
+                    return jdbcTypes.REAL;
+                case 'float':
+                case 'float8':
+                    return jdbcTypes.DOUBLE;
+                case 'char':
+                case 'bpchar':
+                    return jdbcTypes.CHAR;
+                case 'varchar':
+                case 'text':
+                case 'name':
+                    return jdbcTypes.VARCHAR;
+                case 'bytea':
+                    return jdbcTypes.BINARY;
+                case 'boolean':
+                case 'bool':
+                case 'bit':
+                    return jdbcTypes.BIT;
+                case 'date':
+                    return jdbcTypes.DATE;
+                case 'time':
+                case 'timetz':
+                    return jdbcTypes.TIME;
+                case 'timestamp':
+                case 'timestamptz':
+                    return jdbcTypes.TIMESTAMP;
+            }
+        }, javaType = function (dataType) {
+            switch (dataType) {
+                case jdbcTypes.SMALLINT:
+                case jdbcTypes.INTEGER:
+                    return javaTypes.INTEGER;
+                case jdbcTypes.BIGINT:
+                    return javaTypes.LONG;
+                case jdbcTypes.DOUBLE:
+                    return javaTypes.DOUBLE;
+                case jdbcTypes.NUMERIC:
+                    return javaTypes.BIGDECIMAL;
+                case jdbcTypes.REAL:
+                    return javaTypes.FLOAT;
+                case jdbcTypes.CHAR:
+                case jdbcTypes.VARCHAR:
+                    return javaTypes.STRING;
+                case jdbcTypes.BINARY:
+                    return javaTypes.BYTE_ARRAY;
+                case jdbcTypes.BIT:
+                    return javaTypes.BOOLEAN;
+                case jdbcTypes.DATE:
+                    return javaTypes.DATE;
+                case jdbcTypes.TIME:
+                    return javaTypes.TIME;
+                case jdbcTypes.TIMESTAMP:
+                    return javaTypes.TIMESTAMP;
+            }
+        };
+
+        var tables = [];
+
+        client.query(
+            'SELECT table_schema, table_name ' +
+            'FROM information_schema.tables ' +
+            'WHERE table_schema = ANY (current_schemas(false)) ' +
+            'ORDER BY table_schema, table_name', function(err, result) {
+
             if(err)
-                res.status(500).send(err.message);
+                return sendError(err);
+
+            if (result.rows.length > 0) {
+                // usage
+                var latch = new CDL(result.rows.length, sendResponse);
+
+                result.rows.forEach(function (table) {
+
+                    var indisprimary = client.query(
+                        "SELECT a.attname " +
+                        "FROM pg_index i " +
+                        "JOIN pg_attribute a " +
+                        "  ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey) " +
+                        "WHERE  i.indrelid = $1::regclass AND i.indisprimary", [table.table_schema + '.' + table.table_name],
+                        function (err, result) {
+                            if (err)
+                                return sendError(err);
+
+                            var pks = result.rows.map(function(row) {
+                                return row.attname;
+                            });
+
+                            client.query(
+                                'SELECT column_name, udt_name, is_nullable ' +
+                                'FROM information_schema.columns ' +
+                                'WHERE table_schema = $1 AND table_name = $2', [table.table_schema, table.table_name],
+                                function (err, result) {
+                                    if (err)
+                                        return sendError(err);
+
+                                    var cols = [];
+
+                                    result.rows.forEach(function (column) {
+                                        var dataType = jdbcType(column.udt_name);
+
+                                        cols.push({
+                                            pk: pks.indexOf(column.column_name) >= 0,
+                                            use: true,
+                                            notNull: column.is_nullable == 'NO',
+                                            dbName: column.column_name, dbType: dataType,
+                                            javaName: toJavaFieldName(column.column_name), javaType: javaType(dataType) });
+                                    });
+
+                                    var valClsName = toJavaClassName(table.table_name);
 
-            console.log(result.rows[0]);
+                                    tables.push({
+                                        use: true,
+                                        schemaName: table.table_schema, tableName: table.table_name,
+                                        keyClass: valClsName + 'Key', valueClass: valClsName,
+                                        columns: cols
+                                    });
 
-            res.sendStatus(200);
+                                    latch.countDown();
+                                })
+                        });
+                });
+            }
         });
     });
 });


[2/2] incubator-ignite git commit: Merge remote-tracking branch 'origin/ignite-843' into ignite-843

Posted by an...@apache.org.
Merge remote-tracking branch 'origin/ignite-843' into ignite-843


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/7850b0dd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/7850b0dd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/7850b0dd

Branch: refs/heads/ignite-843
Commit: 7850b0dd30d54818693599152c74376ab70cb1e0
Parents: 40f5a31 8e63378
Author: Andrey <an...@gridgain.com>
Authored: Tue Jun 30 18:08:45 2015 +0700
Committer: Andrey <an...@gridgain.com>
Committed: Tue Jun 30 18:08:45 2015 +0700

----------------------------------------------------------------------
 .../javascripts/controllers/persistences.js     | 21 ++++++++-
 .../nodejs/public/stylesheets/style.css         |  2 +-
 .../nodejs/public/stylesheets/style.less        | 18 +++++++-
 modules/webconfig/nodejs/views/persistence.jade | 46 +++++++++++---------
 4 files changed, 63 insertions(+), 24 deletions(-)
----------------------------------------------------------------------