--- /dev/null
+/*
+ * 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()
+ {
+
+ }
+
+
+ }
+
+
+}
+
+
+
// static array of all projects.
public Gee.HashMap<string,Project> projects;
-
+
public bool projects_loaded = false;
public Gee.HashMap<string,JsRender.JsRender> files ;
//tree : false,
public string xtype;
+
+ public Json.Object json_project_data;
+
bool is_scanned;
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>();
return;
}
- var obj = node.get_object ();
+ var obj = node.get_object ();
var xtype = obj.get_string_member("xtype");
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?
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;
}
}
-
\ No newline at end of file
+