2 * Renderer for Roo Database code
4 * - Concept - this code does the SQL queries
5 * pulls data from information_schema (on mysql only at present..)
6 * Sends it down the line to the Javascript code. to generate structures
10 // should this be in palete...
14 class RooDatabase : Object
16 public Project.Project project;
20 public Gda.Connection cnc;
22 public RooDatabase (Project.Project project)
24 this.project = project;
25 this.DBTYPE = this.project.json_project_data.get_string_member("DBTYPE");
26 this.cnc = Gda.Connection.open_from_string (
28 "DB_NAME=" + this.project.json_project_data.get_string_member("DBNAME"),
29 "USERNAME=" + this.project.json_project_data.get_string_member("DBUSERNAME") +
30 ";PASSWORD=" + this.project.json_project_data.get_string_member("DBPASSWORD"),
31 Gda.ConnectionOptions.NONE
38 public Json.Array readTables()
41 if (this.DBTYPE == "PostgreSQL") {
43 return this.fetchAll(this.cnc.execute_select_command(
44 """select c.relname FROM pg_catalog.pg_class c
45 LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
46 WHERE c.relkind IN ('r','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
47 AND pg_catalog.pg_table_is_visible(c.oid)
51 if (this.DBTYPE == "MySQL") {
52 return this.fetchAll(this.cnc.execute_select_command( "SHOW TABLES" ));
54 return new Json.Array();
58 public Json.Array readTable(string tablename) {
59 if (this.DBTYPE== "PostgreSQL") {
61 return this.fetchAll(this.cnc.execute_select_command(
68 CASE WHEN f.attnotnull = 't' THEN 'NO' ELSE 'YES' END AS isNull,
69 pg_catalog.format_type(f.atttypid,f.atttypmod) AS Type,
70 CASE WHEN p.contype = 'p' THEN 't' ELSE 'f' END AS primarykey,
71 CASE WHEN p.contype = 'u' THEN 't' ELSE 'f' END AS uniquekey,
72 CASE WHEN p.contype = 'f' THEN g.relname END AS foreignkey,
73 CASE WHEN p.contype = 'f' THEN p.confkey END AS foreignkey_fieldnum,
74 CASE WHEN p.contype = 'f' THEN g.relname END AS foreignkey,
75 CASE WHEN p.contype = 'f' THEN p.conkey END AS foreignkey_connnum,
76 CASE WHEN f.atthasdef = 't' THEN d.adsrc END AS default
77 FROM pg_attribute f JOIN pg_class c ON c.oid = f.attrelid
78 JOIN pg_type t ON t.oid = f.atttypid
79 LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum
80 LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
81 LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY ( p.conkey )
82 LEFT JOIN pg_class AS g ON p.confrelid = g.oid
83 WHERE c.relkind = 'r'::char AND n.nspname = 'public'
84 AND c.relname = '""" + tablename + """' AND f.attnum > 0 ORDER BY number;
89 if (this.DBTYPE== "MySQL") {
90 return this.fetchAll(this.cnc.execute_select_command( "DESCRIBE " + tablename ));
92 return new Json.Array();
98 public Json.Array readForeignKeys(string table)
100 var ret = new Json.Array();
101 // technically we should use FK stuff in mysql, but for the momemnt use my hacky FK()
102 if (this.DBTYPE != "MySQL") {
106 var jarr = this.fetchAll(this.cnc.execute_select_command(
112 information_schema.TABLES
114 TABLE_NAME = '""" + table + """'
116 TABLE_SCHEMA = '""" + this.project.json_project_data.get_string_member("DBNAME") + """'
120 if (jarr.get_length() < 1) {
123 var contents = jarr.get_string_element(0);
125 GLib.Regex exp = /FK\(([^\)]+)\)/;
129 if ( exp.match (contents, 0, out mi) ) {
133 } catch (GLib.Error e) {
136 var ar = str.split("\n");
137 for (var i = 0; i < ar.length; i++) {
138 var kv = ar[i].split("=");
139 var o = new Json.Object();
140 o.set_string_member("key", kv[0].strip());
141 var lr = kv[1].split(":");
142 o.set_string_member("table", lr[0].strip());
143 o.set_string_member("col", lr[1].strip());
144 ret.add_object_element(o);
151 public Json.Array fetchAll(Gda.DataModel qnr)
153 var cols = new Gee.ArrayList<string>();
155 for (var i =0;i < qnr.get_n_columns(); i++) {
156 cols.add(qnr.get_column_name(i));
158 //print(Json.stringify(cols, null,4));
159 var iter = qnr.create_iter();
160 var res = new Json.Array();
161 //print(this.get_n_rows());
163 for (var r = 0; r < qnr.get_n_rows(); r++) {
167 if (cols.size == 1) {
168 res.add_string_element(qnr.get_value_at(0,r).get_string());
172 var add = new Json.Object();
174 for (var i = 0; i < cols.size; i++) {
176 var val = qnr.get_value_at(i,r);
177 var type = val.type().name();
178 if (type == "GdaBinary" || type == "GdaBlob") {
179 add.set_string_member(n, val.value.to_string(1024));
182 add.set_string_member(n, val.get_string());
186 res.add_object_element(add);