Merge branch 'master' of http://git.roojs.com/app.Builder.js
authorAlan Knowles <alan@roojs.com>
Mon, 13 Apr 2015 09:58:26 +0000 (17:58 +0800)
committerAlan Knowles <alan@roojs.com>
Mon, 13 Apr 2015 09:58:26 +0000 (17:58 +0800)
src/Builder4/FakeServer.vala
src/JsRender/RooDatabase.vala [new file with mode: 0644]
src/Makefile.am
src/Project/Project.vala
src/c/jscore_object_call_as_function.o [deleted file]

index 402dcbb..d7afd5e 100644 (file)
  * the idea is nicked from geary.
  * 
  */
-
+public errordomain FakeServerError {
+               FILE_DOES_NOT_EXIST
+       }
+       
 public class FakeServer : Object
 {
+       
        WebKit.WebView view;
        
        public FakeServer(WebKit.WebView wkview)
@@ -45,6 +49,7 @@ public class FakeServer : Object
                var  file = File.new_for_path ( GLib.Environment.get_home_dir() + "/gitlive" + request.get_path());
                if (!file.query_exists()) {
                        print("Skip file missing = %s/gitlive%s\n", GLib.Environment.get_home_dir() , request.get_path());
+                       request.finish_error(new FakeServerError.FILE_DOES_NOT_EXIST ("My error msg"));
                        return;
                }
                var info = file.query_info(
diff --git a/src/JsRender/RooDatabase.vala b/src/JsRender/RooDatabase.vala
new file mode 100644 (file)
index 0000000..a6c907f
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * Renderer for Roo Database code
+ * 
+ * - Concept - this code does the SQL queries
+ *   pulls data from information_schema (on mysql only at present..)
+ *   Sends it down the line to the Javascript code. to generate structures 
+ * 
+ */
+ // should this be in palete...
+namespace JsRender {
+
+  
+    class RooDatabase : Object 
+    {
+        public Project.Project project;
+
+       public string DBTYPE;
+     
+        public Gda.Connection cnc;
+        
+               public RooDatabase (Project.Project project)
+        {
+            this.project = project;
+           this.DBTYPE = this.project.json_project_data.get_string_member("DBTYPE");
+            this.cnc = Gda.Connection.open_from_string (
+                               this.DBTYPE,
+                               "DB_NAME=" + this.project.json_project_data.get_string_member("DBNAME"), 
+                               "USERNAME=" + this.project.json_project_data.get_string_member("DBUSERNAME") + 
+                               ";PASSWORD=" + this.project.json_project_data.get_string_member("DBPASSWORD"),
+                               Gda.ConnectionOptions.NONE
+                       );
+            
+        }
+        
+          
+        
+        public Json.Array readTables()
+        {
+                       
+                       if (this.DBTYPE == "PostgreSQL") {
+                               
+                               return this.fetchAll(this.cnc.execute_select_command( 
+                                       """select c.relname FROM pg_catalog.pg_class c 
+                                               LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
+                                               WHERE c.relkind IN ('r','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
+                                               AND pg_catalog.pg_table_is_visible(c.oid) 
+                                       """));
+                               
+                       }
+                       if (this.DBTYPE == "MySQL") { 
+                               return this.fetchAll(this.cnc.execute_select_command( "SHOW TABLES" ));
+                       }
+                       return new Json.Array();
+                       
+               }
+               
+               public Json.Array readTable(string tablename) {
+                       if (this.DBTYPE== "PostgreSQL") {
+                               
+                               return this.fetchAll(this.cnc.execute_select_command( 
+                                       """
+                                       
+                                        SELECT 
+                                               f.attnum AS number, 
+                                               f.attname AS Field, 
+                                               f.attnum, 
+                                               CASE WHEN f.attnotnull = 't' THEN 'NO' ELSE 'YES' END AS isNull,  
+                                               pg_catalog.format_type(f.atttypid,f.atttypmod) AS Type, 
+                                               CASE WHEN p.contype = 'p' THEN 't' ELSE 'f' END AS primarykey, 
+                                               CASE WHEN p.contype = 'u' THEN 't' ELSE 'f' END AS uniquekey, 
+                                               CASE WHEN p.contype = 'f' THEN g.relname END AS foreignkey, 
+                                               CASE WHEN p.contype = 'f' THEN p.confkey END AS foreignkey_fieldnum, 
+                                               CASE WHEN p.contype = 'f' THEN g.relname END AS foreignkey, 
+                                               CASE WHEN p.contype = 'f' THEN p.conkey END AS foreignkey_connnum, 
+                                               CASE WHEN f.atthasdef = 't' THEN d.adsrc END AS default 
+                                               FROM pg_attribute f JOIN pg_class c ON c.oid = f.attrelid 
+                                                               JOIN pg_type t ON t.oid = f.atttypid 
+                                                               LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum 
+                                                               LEFT JOIN pg_namespace n ON n.oid = c.relnamespace 
+                                                               LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY ( p.conkey ) 
+                                                               LEFT JOIN pg_class AS g ON p.confrelid = g.oid 
+                                               WHERE c.relkind = 'r'::char AND n.nspname = 'public' 
+                                               AND c.relname = '""" + tablename + """' AND f.attnum > 0 ORDER BY number;
+                                                       
+                                       """));
+                               
+                       }
+                       if (this.DBTYPE== "MySQL") { 
+                               return this.fetchAll(this.cnc.execute_select_command( "DESCRIBE " + tablename ));
+                       }
+                       return  new Json.Array();
+                       
+                       
+                       
+               }
+               
+               public Json.Array readForeignKeys(string table)
+        {
+                       var ret =   new Json.Array();
+                       // technically we should use FK stuff in mysql, but for the momemnt use my hacky FK()
+                       if (this.DBTYPE != "MySQL") { 
+                               return  ret;
+                       }
+                       
+                       var jarr = this.fetchAll(this.cnc.execute_select_command( 
+                                       """
+                                       
+                                        SELECT 
+                                               TABLE_COMMENT 
+                                               FROM
+                                               information_schema.TABLES
+                                               WHERE
+                                               TABLE_NAME = '""" + table + """'
+                                               AND
+                                               TABLE_SCHEMA = '""" + this.project.json_project_data.get_string_member("DBNAME") + """'
+                                       """
+                                       ));
+                                       
+                       if (jarr.get_length() < 1) {
+                               return  ret;
+                       }
+                       var contents = jarr.get_string_element(0);
+                       
+                        GLib.Regex exp = /FK\(([^\)]+)\)/;
+                        string str = "";
+                        try {
+                               GLib.MatchInfo mi;
+                               if ( exp.match (contents, 0, out mi) ) {
+                                       mi.next();
+                                       str = mi.fetch(0);
+                               }
+                       } catch (GLib.Error e) {
+                               return  ret;
+                       }
+                       var ar = str.split("\n");
+                       for (var i = 0; i < ar.length; i++) {
+                               var kv = ar[i].split("=");
+                               var o = new Json.Object();
+                               o.set_string_member("key", kv[0].strip());
+                               var lr = kv[1].split(":");
+                               o.set_string_member("table", lr[0].strip());
+                               o.set_string_member("col", lr[1].strip());
+                               ret.add_object_element(o);
+                       }
+                       return ret;
+                               
+        
+        
+               }
+        public Json.Array fetchAll(Gda.DataModel qnr)
+               {
+                       var cols = new Gee.ArrayList<string>();
+                       
+                       for (var i =0;i < qnr.get_n_columns(); i++) {
+                               cols.add(qnr.get_column_name(i));
+                       }
+                       //print(Json.stringify(cols, null,4));
+                       var iter = qnr.create_iter();
+                       var res = new Json.Array();
+                       //print(this.get_n_rows());
+                       
+                       for (var r = 0; r < qnr.get_n_rows(); r++) {
+                               
+                               // single clo..
+                               //print("GOT ROW");
+                               if (cols.size == 1) {
+                                       res.add_string_element(qnr.get_value_at(0,r).get_string());
+                                       continue;
+                               }
+                               
+                               var add = new Json.Object();
+                               
+                               for (var i = 0; i < cols.size; i++) { 
+                                       var n = cols.get(i);
+                                       var val = qnr.get_value_at(i,r);
+                                       var type = val.type().name();
+                                       if (type == "GdaBinary" || type == "GdaBlob") {
+                                               add.set_string_member(n, "?? big string ??");
+                                               continue;
+                                       }
+                                       add.set_string_member(n, val.get_string());
+                                       
+                               }
+                               
+                               res.add_object_element(add);
+                               
+                       }
+                       return res;
+
+               }
+               
+               public void test()
+               {
+
+               }
+               
+               
+       }
+       
+       
+}
+
+        
+    
index adf6869..8d42466 100644 (file)
@@ -29,7 +29,7 @@ bin_PROGRAMS = builder
 
 builder_PKGS = \
                --pkg glib-2.0  \
-        --pkg gobject-2.0  \
+               --pkg gobject-2.0  \
                --pkg  gtk+-3.0 \
                --pkg  gtksourceview-3.0 \
                --pkg  libxml-2.0 \
@@ -43,7 +43,8 @@ builder_PKGS = \
                --pkg javascriptcore \
                $(builder_LIBVALA) \
                --pkg vte-2.90 \
-               --pkg posix
+               --pkg posix \
+               --pkg libgda-5.0
 
 
 builder_SOURCES = \
@@ -90,7 +91,8 @@ builder_SOURCES = \
                Builder4/MainWindow.vala \
                Builder4/WindowState.vala \
                Builder4/FakeServer.vala \
-               Resources.vala 
+               Resources.vala \
+               JsRender/RooDatabase.vala 
 
 
 builder_VALAFLAGS = \
index 3972c81..421a278 100644 (file)
@@ -21,7 +21,7 @@ namespace Project {
 
        // static array of all projects.
        public Gee.HashMap<string,Project>  projects;
-
+       
        
        public bool  projects_loaded = false;
 
@@ -40,6 +40,9 @@ namespace Project {
                public Gee.HashMap<string,JsRender.JsRender> files ;
                //tree : false,
                public  string xtype;
+               
+               public Json.Object json_project_data;
+               
                 
                bool is_scanned; 
           
@@ -47,7 +50,8 @@ namespace Project {
                public Project (string path) {
                    
                        this.name = GLib.Path.get_basename(path); // default..
-
+                       this.json_project_data = new Json.Object();
+                       
                        this.is_scanned = false;
                        this.paths = new Gee.HashMap<string,string>();
                        this.files = new Gee.HashMap<string,JsRender.JsRender>();
@@ -131,7 +135,7 @@ namespace Project {
                                return;
                        }
                        
-                       var obj = node.get_object ();
+                       var obj = node.get_object ();
                        var xtype =  obj.get_string_member("xtype");
 
 
@@ -147,7 +151,9 @@ namespace Project {
 
                        
                        var proj = factory(xtype, fpath);
-
+                       
+                       proj.json_project_data  = obj; // store the original object...
+                       
                        proj.fn =  Path.get_basename(jsonfile).split(".")[0];
 
                        // might not exist?
@@ -236,60 +242,41 @@ namespace Project {
                public string toJSON(bool show_all)
                {
                    
-                       var builder = new Json.Builder ();
-
-                       builder.begin_object ();
-
-                       builder.set_member_name ("name");
-                       builder.add_string_value (this.name);
-
-
-                       builder.set_member_name ("fn");
-                       builder.add_string_value (this.fn);
-
-                       builder.set_member_name ("xtype");
-                       builder.add_string_value (this.xtype);
-
-                       builder.set_member_name ("runhtml");
-                       builder.add_string_value (this.runhtml);
-
-
-                       builder.set_member_name ("rootURL");
-                       builder.add_string_value (this.rootURL);
                        
-                       builder.set_member_name ("base_template");
-                       builder.add_string_value (this.base_template);                  
-                       // file ??? try/false?
-                       builder.set_member_name ("paths");
-
-
-                       builder.begin_object ();
+                       this.json_project_data.set_string_member("name", this.name);
+                       this.json_project_data.set_string_member("fn", this.fn);
+                       this.json_project_data.set_string_member("xtype", this.xtype);
+                       this.json_project_data.set_string_member("runhtml", this.runhtml);
+                       this.json_project_data.set_string_member("rootURL", this.rootURL);
+                       this.json_project_data.set_string_member("base_template", this.base_template);
+                       this.json_project_data.set_string_member("rootURL", this.rootURL);
+                       var paths = new Json.Object(); 
 
 
                        var iter = this.paths.map_iterator();
                        while (iter.next()) {
-                               builder.set_member_name (iter.get_key());
-                               builder.add_string_value("path");
+                               paths.set_string_member(iter.get_key(), "path");
                        }
-                       builder.end_object ();
+                       this.json_project_data.set_object_member("paths", paths);
+
                        
                        if (show_all) {
-                               builder.set_member_name ("files");
-                               builder.begin_array ();
+                               var files = new Json.Array();
+                               
+                               
                                var fiter = this.files.map_iterator();
                                while (fiter.next()) {
-                                   builder.add_string_value (fiter.get_key());
+                                   files.add_string_element (fiter.get_key());
                                }
+                               this.json_project_data.set_array_member("files", files);
                                
-                               
-                               builder.end_array ();
                        }
 
                
-                       builder.end_object ();
-
                        var  generator = new Json.Generator ();
-                       var  root = builder.get_root ();
+                       var  root = new Json.Node(Json.NodeType.OBJECT);
+                       root.init_object(this.json_project_data);
                        generator.set_root (root);
                        if (show_all) {
                                generator.pretty = true;
@@ -535,4 +522,4 @@ namespace Project {
                  
        }
 }
\ No newline at end of file
diff --git a/src/c/jscore_object_call_as_function.o b/src/c/jscore_object_call_as_function.o
deleted file mode 100644 (file)
index c9e8d59..0000000
Binary files a/src/c/jscore_object_call_as_function.o and /dev/null differ