95b8d52340e179cdc498101f2380c943bf5a87db
[xtuple] / scripts / lib / util / convert_specialized.js
1 /*jshint node:true, indent:2, curly:false, eqeqeq:true, immed:true, latedef:true, newcap:true, noarg:true,
2 regexp:true, undef:true, strict:true, trailing:true, white:true */
3 /*global _:true */
4
5 (function () {
6   "use strict";
7
8   var path = require('path');
9
10   var convertFromMetasql = function (content, filename, defaultSchema) {
11     var lines = content.split("\n"),
12       schema = defaultSchema ? "'" + defaultSchema + "'" : "NULL",
13       group,
14       i = 2,
15       name,
16       notes = "",
17       grade = 0,
18       deleteSql,
19       insertSql;
20
21     if (lines[0].indexOf("-- Group: ") !== 0 ||
22         lines[1].indexOf("-- Name: ") !== 0 ||
23         lines[2].indexOf("-- Notes:") !== 0) {
24       throw new Error("Improperly formatted metasql: " + filename);
25     }
26     group = lines[0].substring("-- Group: ".length).trim();
27     name = lines[1].substring("-- Name: ".length).trim();
28     while (lines[i].indexOf("--") === 0) {
29       notes = notes + lines[i].substring(2) + "\n";
30       i++;
31     }
32     notes = notes.substring(" Notes:".length);
33     if (notes.indexOf("must be grade 10") >= 0) {
34       grade = 10;
35     }
36
37     insertSql = "select saveMetasql (" +
38       "'" + group + "'," +
39       "'" + name + "'," +
40       "$$" + notes + "$$," +
41       "$$" + content + "$$," +
42       "true, " + schema + ", " + grade + ");";
43
44     return insertSql;
45   };
46
47   var convertFromReport = function (content, filename, defaultSchema) {
48     var lines = content.split("\n"),
49       name,
50       grade = "0",
51       tableName = defaultSchema ? defaultSchema + ".pkgreport" : "report",
52       description,
53       disableSql,
54       updateSql,
55       insertSql,
56       enableSql;
57
58     if (lines[3].indexOf(" <name>") !== 0 ||
59         lines[4].indexOf(" <description>") !== 0) {
60       throw new Error("Improperly formatted report");
61     }
62     name = lines[3].substring(" <name>".length).trim();
63     name = name.substring(0, name.indexOf("<"));
64     description = lines[4].substring(" <description>".length).trim();
65     description = description.substring(0, description.indexOf("<"));
66     if (lines[5].indexOf("grade") >= 0) {
67       grade = lines[5].substring(" <grade>".length).trim();
68       grade = grade.substring(0, grade.indexOf("<"));
69     }
70
71     disableSql = "ALTER TABLE " + tableName + " DISABLE TRIGGER ALL;";
72
73     insertSql = "insert into " + tableName + " (report_name, report_descrip, " +
74       "report_source, report_loaddate, report_grade) select " +
75       "'" + name + "'," +
76       "$$" + description + "$$," +
77       "$$" + content + "$$," +
78       "now(), " + grade +
79       " where not exists (select c.report_id from " + tableName + " c " +
80       "where report_name = '" + name +
81       "' and report_grade = " + grade + ");";
82
83     updateSql = "update " + tableName + " set " +
84       " report_descrip = $$" + description +
85       "$$, report_source = $$" + content +
86       "$$, report_loaddate = now() " +
87       "where report_name = '" + name +
88       "' and report_grade = " + grade + ";";
89
90     enableSql = "ALTER TABLE " + tableName + " ENABLE TRIGGER ALL;";
91
92     return disableSql + insertSql + updateSql + enableSql;
93   };
94
95   var convertFromScript = function (content, filename, defaultSchema) {
96     var name = path.basename(filename, '.js'),
97       tableName = defaultSchema ? defaultSchema + ".pkgscript" : "unknown",
98       notes = "", //"xtMfg package",
99       disableSql,
100       insertSql,
101       updateSql,
102       enableSql;
103
104     disableSql = "ALTER TABLE " + tableName + " DISABLE TRIGGER ALL;";
105
106     insertSql = "insert into " + tableName + " (script_name, script_order, script_enabled, " +
107       "script_source, script_notes) select " +
108       "'" + name + "', 0, TRUE, " +
109       "$$" + content + "$$," +
110       "'" + notes + "'" +
111       " where not exists (select c.script_id from " + tableName + " c " +
112       "where script_name = '" + name + "');";
113
114     updateSql = "update " + tableName + " set " +
115       "script_name = '" + name + "', script_order = 0, script_enabled = TRUE, " +
116       "script_source = $$" + content +
117       "$$, script_notes = '" + notes + "' " +
118       "where script_name = '" + name + "';";
119
120     enableSql = "ALTER TABLE " + tableName + " ENABLE TRIGGER ALL;";
121
122     return disableSql + insertSql + updateSql + enableSql;
123   };
124
125   var convertFromUiform = function (content, filename, defaultSchema) {
126     var name = path.basename(filename, '.ui'),
127       tableName = defaultSchema ? defaultSchema + ".pkguiform" : "unknown",
128       notes = "", //"xtMfg package",
129       disableSql,
130       insertSql,
131       updateSql,
132       enableSql;
133
134     disableSql = "ALTER TABLE " + tableName + " DISABLE TRIGGER ALL;";
135
136     insertSql = "insert into " + tableName + " (uiform_name, uiform_order, uiform_enabled, " +
137       "uiform_source, uiform_notes) select " +
138       "'" + name + "', 0, TRUE, " +
139       "$$" + content + "$$," +
140       "'" + notes + "' " +
141       " where not exists (select c.uiform_id from " + tableName + " c " +
142       "where uiform_name = '" + name + "');";
143
144     updateSql = "update " + tableName + " set uiform_name = '" +
145       name + "', uiform_order = 0, uiform_enabled = TRUE, " +
146       "uiform_source = $$" + content + "$$, uiform_notes = '" + notes + "' " +
147       "where uiform_name = '" + name + "';";
148
149     enableSql = "ALTER TABLE " + tableName + " ENABLE TRIGGER ALL;";
150
151     return disableSql + insertSql + updateSql + enableSql;
152   };
153
154   exports.conversionMap = {
155     mql: convertFromMetasql,
156     xml: convertFromReport,
157     js: convertFromScript,
158     ui: convertFromUiform,
159     sql: function (content) {
160       // no op
161       return content;
162     }
163   };
164 }());