diff --git a/built/db_updater.d.ts b/built/db_updater.d.ts index 6bf6404..27ca3ea 100644 --- a/built/db_updater.d.ts +++ b/built/db_updater.d.ts @@ -1,3 +1,4 @@ +import * as qtopology from "qtopology"; /** * Simple callback. */ @@ -10,6 +11,18 @@ export interface SimpleResultCallback { export interface Connection { query(script: string, callback: SimpleResultCallback): any; } +/** + * Simple callback. + */ +export interface Glob { + sync(path: string): string[]; +} +/** + * Simple callback. + */ +export interface Fs { + readFileSync(name: string, encoding: string): string; +} /** * Options for automatic DB upgrade */ @@ -18,6 +31,13 @@ export interface DbUpgraderOptions { conn: Connection; settings_table: string; version_record_key: string; + log_prefix?: string; + glob?: Glob; + fs?: Fs; + use_init_script?: boolean; + init_script_name?: string; + sql_template_get?: string; + sql_template_update?: string; } /** * This class handles automatic upgrades of underlaying database. @@ -27,10 +47,25 @@ export declare class DbUpgrader { private conn; private settings_table; private version_record_key; + private inner_glob; + private inner_fs; + private log_prefix; + private init_script_name; + private use_init_script; + private sql_template_update; + private sql_template_get; + private curr_version; + private files; /** Simple constructor */ constructor(options: DbUpgraderOptions); /** Internal logging utility method */ private log(s); + /** This method just checks if database version is in sync with code version. */ + check(callback: qtopology.SimpleCallback): void; /** Sequentially executes upgrade files. */ - run(callback: any): void; + run(callback: qtopology.SimpleCallback): void; + private runInitScript(callback); + private getCurrentVersionFromDb(callback); + private checkFilesInScriptsDir(xcallback); + private updateVersionInDb(ver, callback); } diff --git a/built/db_updater.js b/built/db_updater.js index 96e4a2b..b428b82 100644 --- a/built/db_updater.js +++ b/built/db_updater.js @@ -21,78 +21,75 @@ class DbUpgrader { this.conn = options.conn; this.settings_table = options.settings_table || "Settings"; this.version_record_key = options.version_record_key || "dbver"; + this.inner_glob = options.glob || glob; + this.inner_fs = options.fs || fs; + this.log_prefix = options.log_prefix || "[qtopology-mysql DbUpgrader] "; + this.init_script_name = options.init_script_name || "init.sql"; + this.use_init_script = true; + if (options.use_init_script != undefined) { + this.use_init_script = options.use_init_script; + } + this.sql_template_get = options.sql_template_get || + "select value from ${tab} where name = '${key}';"; + this.sql_template_update = options.sql_template_update || + "update ${tab} set value = '${ver}' where name = '${key}';"; + this.curr_version = -1; + this.files = []; } /** Internal logging utility method */ log(s) { - qtopology.logger().debug("[qtopology-mysql DbUpgrader] " + s); + qtopology.logger().debug(this.log_prefix + s); } - /** Sequentially executes upgrade files. */ - run(callback) { + /** This method just checks if database version is in sync with code version. */ + check(callback) { let self = this; - let files = []; - let xfiles = []; - let curr_version = -1; async.series([ (xcallback) => { - let file_name = "init.sql"; - self.log("Executing upgrade file: " + file_name); - let script = fs.readFileSync(path.join(self.scripts_dir, file_name), "utf8"); - self.conn.query(script, (err) => { - if (err) { - console.log(err); - } - xcallback(err); - }); + self.getCurrentVersionFromDb(xcallback); + }, + (xcallback) => { + self.checkFilesInScriptsDir(xcallback); }, (xcallback) => { - self.log("Fetching files in script directory: " + self.scripts_dir); - files = glob.sync(self.scripts_dir + "/v*.sql"); - let xfiles = files.map(x => { - let r = new FileRec(); - r.file = x; - r.file_short = path.basename(x); - return r; - }); - xfiles.forEach(x => { - let tmp = path.basename(x.file); - x.ver = +(tmp.replace("v", "").replace(".sql", "")); - }); - xfiles.sort((a, b) => { return a.ver - b.ver; }); - files = xfiles; + self.log("Finished."); + if (self.files.length == 0) { + return xcallback(new Error("Directory with SQL version upgrades is empty.")); + } + let code_version = self.files[self.files.length - 1].ver; + if (code_version != self.curr_version) { + return xcallback(new Error(`Version mismatch in QTopology SQL: ${self.curr_version} in db, ${code_version}`)); + } xcallback(); + } + ], callback); + } + /** Sequentially executes upgrade files. */ + run(callback) { + let self = this; + async.series([ + (xcallback) => { + self.runInitScript(xcallback); }, (xcallback) => { - self.log("Fetching version from database..."); - let script = "select name, value from " + self.settings_table + " where name = '" + self.version_record_key + "';"; - self.conn.query(script, function (err, rows) { - if (err) - return xcallback(err); - if (rows.length > 0) { - curr_version = rows[0].value; - } - self.log("Current version: " + curr_version); - xcallback(); - }); + self.checkFilesInScriptsDir(xcallback); }, (xcallback) => { - self.log("Detecting applicable upgrade files..."); - files = files.filter(x => x.ver > curr_version); - files = files.sort((a, b) => { return a.ver - b.ver; }); - xcallback(); + self.getCurrentVersionFromDb(xcallback); }, (xcallback) => { - self.log("Number of applicable upgrade files: " + files.length); - async.eachSeries(files, (item, xxcallback) => { + self.log("Detecting applicable upgrade files..."); + self.files = self.files.filter(x => x.ver > self.curr_version); + self.files = self.files.sort((a, b) => { return a.ver - b.ver; }); + self.log("Number of applicable upgrade files: " + self.files.length); + async.eachSeries(self.files, (item, xxcallback) => { self.log("Executing upgrade file: " + item.file_short); - let script = fs.readFileSync(item.file, "utf8"); + let script = this.inner_fs.readFileSync(item.file, "utf8"); self.conn.query(script, (err) => { if (err) { console.log(err); return xxcallback(err); } - self.log("Updating version in db to " + item.ver); - let script2 = `update ${self.settings_table} set value = '${item.ver}' where name = '${self.version_record_key}'`; - self.conn.query(script2, xxcallback); + self.updateVersionInDb(item.ver, xxcallback); }); }, xcallback); }, @@ -102,6 +99,59 @@ class DbUpgrader { } ], callback); } + runInitScript(callback) { + let self = this; + if (!self.use_init_script) { + return callback(); + } + self.log("Executing upgrade file: " + self.init_script_name); + let fname = path.join(self.scripts_dir, self.init_script_name); + let script = this.inner_fs.readFileSync(fname, "utf8"); + self.conn.query(script, callback); + } + getCurrentVersionFromDb(callback) { + let self = this; + self.log("Fetching version from database..."); + let script = self.sql_template_get + .replace("${tab}", self.settings_table) + .replace("${key}", self.version_record_key); + self.conn.query(script, (err, rows) => { + if (err) + return callback(err); + if (rows.length > 0) { + self.curr_version = rows[0].value; + } + self.log("Current version: " + self.curr_version); + callback(); + }); + } + checkFilesInScriptsDir(xcallback) { + let self = this; + self.log("Checking files in script directory: " + self.scripts_dir); + let file_names = this.inner_glob.sync(path.join(self.scripts_dir, "v*.sql")); + let xfiles = file_names.map(x => { + let r = new FileRec(); + r.file = x; + r.file_short = path.basename(x); + return r; + }); + xfiles.forEach(x => { + let tmp = path.basename(x.file); + x.ver = +(tmp.replace("v", "").replace(".sql", "")); + }); + xfiles.sort((a, b) => { return a.ver - b.ver; }); + self.files = xfiles; + xcallback(); + } + updateVersionInDb(ver, callback) { + let self = this; + self.log("Updating version in db to " + ver); + let script = self.sql_template_update + .replace("${ver}", "" + ver) + .replace("${tab}", self.settings_table) + .replace("${key}", self.version_record_key); + self.conn.query(script, callback); + } } exports.DbUpgrader = DbUpgrader; //# sourceMappingURL=db_updater.js.map \ No newline at end of file diff --git a/built/db_updater.js.map b/built/db_updater.js.map index 1782f24..83a80f2 100644 --- a/built/db_updater.js.map +++ b/built/db_updater.js.map @@ -1 +1 @@ -{"version":3,"file":"db_updater.js","sourceRoot":"","sources":["../src/db_updater.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"db_updater.js","sourceRoot":"","sources":["../src/db_updater.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/built/mysql_storage.d.ts b/built/mysql_storage.d.ts index 0c3f008..bd05785 100644 --- a/built/mysql_storage.d.ts +++ b/built/mysql_storage.d.ts @@ -1,12 +1,14 @@ import * as qtopology from "qtopology"; +export { DbUpgrader } from "./db_updater"; export interface MySqlStorageParams { host: string; port: number; database: string; user: string; password: string; - retries: number; - retry_timeout: number; + retries?: number; + retry_timeout?: number; + db_check_only?: boolean; } export interface MySqlTopologyManager { insert(uuid: string, config: any, overwrite: boolean, callback: qtopology.SimpleCallback): any; @@ -16,6 +18,7 @@ export declare class MySqlStorage implements qtopology.CoordinationStorage { private name; private options; private next_refresh; + private db_check_only; constructor(options: MySqlStorageParams); init(callback: qtopology.SimpleCallback): void; close(callback: qtopology.SimpleCallback): void; diff --git a/built/mysql_storage.js b/built/mysql_storage.js index 2279d3c..eadd970 100644 --- a/built/mysql_storage.js +++ b/built/mysql_storage.js @@ -7,6 +7,8 @@ const path = require("path"); const qtopology = require("qtopology"); const dbu = require("./db_updater"); const qh = require("./query_helper"); +var db_updater_1 = require("./db_updater"); +exports.DbUpgrader = db_updater_1.DbUpgrader; ////////////////////////////////////////////////////////////////////// const table_names = { qtopology_message: "qtopology_message", @@ -25,6 +27,7 @@ class MySqlStorage { this.options.retries = this.options.retries || 1; this.options.retry_timeout = this.options.retry_timeout || 10 * 1000; // retry each 10 sec this.next_refresh = 0; + this.db_check_only = this.options.db_check_only || false; this.pool = mysql.createPool({ database: options.database, host: options.host, @@ -36,6 +39,7 @@ class MySqlStorage { }); } init(callback) { + let self = this; this.pool.getConnection((err, conn) => { if (err) return callback(err); @@ -45,7 +49,12 @@ class MySqlStorage { settings_table: "qtopology_settings", version_record_key: "db_version" }); - db_upgrader.run(callback); + if (self.db_check_only) { + db_upgrader.check(callback); + } + else { + db_upgrader.run(callback); + } }); } close(callback) { diff --git a/built/mysql_storage.js.map b/built/mysql_storage.js.map index 8f775cf..fa4b8c6 100644 --- a/built/mysql_storage.js.map +++ b/built/mysql_storage.js.map @@ -1 +1 @@ -{"version":3,"file":"mysql_storage.js","sourceRoot":"","sources":["../src/mysql_storage.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"mysql_storage.js","sourceRoot":"","sources":["../src/mysql_storage.ts"],"names":[],"mappings":";;AAAA,MAAM,YAAY,GAAG,IAAI,CAAC;AAG1B,+BAA+B;AAC/B,+BAA+B;AAC/B,6BAA6B;AAC7B,uCAAuC;AAEvC,oCAAoC;AACpC,qCAAqC;AAErC,2CAA0C;AAAjC,kCAAA,UAAU,CAAA;AAmBnB,sEAAsE;AAEtE,MAAM,WAAW,GAAG;IAChB,iBAAiB,EAAE,mBAAmB;IACtC,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,0BAA0B,EAAE,4BAA4B;IACxD,gBAAgB,EAAE,kBAAkB;IACpC,wBAAwB,EAAE,0BAA0B;CACvD,CAAC;AAEF,sEAAsE;AACtE,gDAAgD;AAEhD;IAQI,YAAY,OAA2B;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,yBAAyB;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,oBAAoB;QAC1F,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,YAAY;YAClC,kBAAkB,EAAE,IAAI;YACxB,eAAe,EAAE,EAAE;SACtB,CAAC,CAAC;IACP,CAAC;IAED,IAAI,CAAC,QAAkC;QACnC,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAClC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC;gBACjC,IAAI,EAAE,IAAI;gBACV,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;gBAC3C,cAAc,EAAE,oBAAoB;gBACpC,kBAAkB,EAAE,YAAY;aACnC,CAAC,CAAC;YACH,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;gBACrB,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;YAAC,IAAI,CAAC,CAAC;gBACJ,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,QAAkC;QACpC,QAAQ,GAAG,QAAQ,IAAI,cAAc,CAAC,CAAC;QACvC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,QAAQ,EAAE,CAAC;QACf,CAAC;IACL,CAAC;IAEO,GAAG,CAAC,CAAC;QACT,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IAEM,MAAM,CAAC,KAAK,CACf,KAAa,EACb,OAAe,EACf,gBAAuC,EACvC,IAAuD,EACvD,QAA6C;QAE7C,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,QAAQ,CAAC;QACb,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,gBAAgB,GAAG,gBAAgB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACpD,KAAK,CAAC,QAAQ,CACV,CAAC,SAAS,EAAE,EAAE;YACV,IAAI,CAAC,CAAC,GAAG,EAAE,iBAAiB,EAAE,EAAE;gBAC5B,UAAU,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBACrD,SAAS,GAAG,iBAAiB,CAAC;gBAC9B,QAAQ,GAAG,GAAG,CAAC;gBACf,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;oBACb,SAAS,EAAE,CAAC;gBAChB,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,UAAU,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAChD,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,EACD,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,GAAG,GAAG,KAAK,CAAC,EACpC,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA,CAAC,CAAC,CAC1C,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,GAAW,EAAE,GAAQ,EAAE,QAA6C;QAC9E,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;YAC1B,YAAY,CAAC,KAAK,CACd,IAAI,CAAC,OAAO,CAAC,OAAO,EACpB,IAAI,CAAC,OAAO,CAAC,aAAa,EAC1B,CAAC,GAAG,EAAE,EAAE;gBACJ,IAAI,SAAS,GAAQ,GAAG,CAAC;gBACzB,MAAM,CAAC,CAAC,SAAS,IAAI,CACjB,SAAS,CAAC,QAAQ,IAAI,OAAO;oBAC7B,SAAS,CAAC,IAAI,IAAI,2BAA2B;oBAC7C,SAAS,CAAC,IAAI,IAAI,8BAA8B;oBAChD,CAAC,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,kCAAkC,CAAC,IAAI,CAAC,CAAC,CAClG,CAAC,CAAC;YACP,CAAC,EACD,CAAC,SAAS,EAAE,EAAE;gBACV,8CAA8C;gBAC9C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;oBACjC,EAAE,CAAC,CAAC,GAAG,CAAC;wBAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBAC/B,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;wBACpC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;4BACN,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;4BAChC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;4BAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;4BAClB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;4BACxC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;wBAC1B,CAAC;wBACD,IAAI,SAAS,GAAQ,GAAG,CAAC;wBACzB,EAAE,CAAC,CAAC,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,kCAAkC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BAC/E,uEAAuE;4BACvE,GAAG,CAAC,OAAO,EAAE,CAAC;wBAClB,CAAC;wBAAC,IAAI,CAAC,CAAC;4BACJ,GAAG,CAAC,OAAO,EAAE,CAAC;wBAClB,CAAC;wBACD,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACzB,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC;YACP,CAAC,EACD,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;gBACV,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACN,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;oBAChC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAClB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;oBACxC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC1B,CAAC;gBACD,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;QACX,CAAC;QAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACT,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACpB,QAAQ,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACL,CAAC;IAED,WAAW,CAAC,IAAY,EAAE,QAA0E;QAChG,IAAI,GAAG,GAAG,2CAA2C,CAAC;QACtD,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAClC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAqC,CAAC;YAC1C,GAAG,GAAG,EAAE,CAAC;YACT,IAAI,aAAa,GAAG,EAAE,CAAC;YACvB,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtB,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnF,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC;YACD,KAAK,CAAC,IAAI,CACN,aAAa,EACb,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;gBAChB,IAAI,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACtC,CAAC,EACD,CAAC,GAAU,EAAE,EAAE;gBACX,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACP,CAAC;IAED,UAAU,CAAC,IAAY,EAAE,QAAwE;QAC7F,IAAI,GAAG,GAAG,2CAA2C,CAAC;QACtD,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAClC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAG,GAAmC,IAAI,CAAC;YAC/C,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrB,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC/E,IAAI,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1E,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC3B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC;YAAC,IAAI,CAAC,CAAC;gBACJ,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,uBAAuB,CAAC,QAAkE;QACtF,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CACrB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,EAC1C,WAAW,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAChC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;gBACnB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;gBAC5C,GAAG,CAAC,IAAI,CAAC;oBACL,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE;oBAClC,WAAW,EAAE,GAAG,CAAC,SAAS;iBAC7B,CAAC,CAAC;YACP,CAAC;YACD,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,eAAe,CAAC,QAAkE;QAC9E,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEO,yBAAyB,CAAC,GAAW,EAAE,GAAQ,EAAE,QAAoE;QACzH,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAC/B,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;gBACnB,GAAG,CAAC,IAAI,CAAC;oBACL,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO;oBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,eAAe,EAAE,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;iBACpF,CAAC,CAAC;YACP,CAAC;YACD,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACP,CAAC;IACD,iBAAiB,CAAC,QAAoE;QAClF,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CACrB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,EACxF,WAAW,CAAC,kBAAkB,EAC9B,EAAE,CACL,CAAC;QACF,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IACD,sBAAsB,CAAC,IAAY,EAAE,QAAoE;QACrG,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CACrB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,EACxF,WAAW,CAAC,kBAAkB,EAC9B,EAAE,MAAM,EAAE,IAAI,EAAE,CACnB,CAAC;QACF,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IACD,eAAe,CAAC,IAAY,EAAE,QAAwE;QAClG,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CACrB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,EAC3G,WAAW,CAAC,kBAAkB,EAC9B,EAAE,IAAI,EAAE,IAAI,EAAE,CACjB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAChC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC1F,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACnE,QAAQ,CAAC,IAAI,EAAE;gBACX,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE;gBAClC,WAAW,EAAE,GAAG,CAAC,SAAS;gBAC1B,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,GAAG,CAAC,GAAG;aACf,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED,cAAc,CAAC,IAAY,EAAE,QAAkC;QAC3D,mGAAmG;QACnG,yDAAyD;QACzD,IAAI,GAAG,GAAG,uCAAuC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,UAAU,CAAC,IAAY,EAAE,QAAmC;QACxD,IAAI,GAAG,GAAG,mCAAmC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,uBAAuB,CAAC,IAAY,EAAE,QAAkC;QACpE,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,GAAG,iDAAiD,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,oBAAoB,CAAC,IAAY,EAAE,QAAiD;QAChF,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,GAAG,8CAA8C,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAClC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAChI,CAAC,CAAC,CAAC;IACP,CAAC;IACD,cAAc,CAAC,IAAY,EAAE,IAAY,EAAE,QAAkC;QACzE,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACnK,GAAG,IAAI,4CAA4C,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,iBAAiB,CAAC,IAAY,EAAE,MAAc,EAAE,MAAc,EAAE,KAAa,EAAE,QAAkC;QAC7G,IAAI,GAAG,GAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACvE,IAAI,MAAM,GAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACT,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QAC3B,CAAC;QACD,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA;QACtE,GAAG,IAAI,4CAA4C,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,cAAc,CAAC,IAAY,EAAE,GAAW,EAAE,QAAkC;QACxE,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,WAAW,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9G,GAAG,IAAI,4CAA4C,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,eAAe,CAAC,IAAY,EAAE,MAAc,EAAE,QAAkC;QAC5E,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,WAAW,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAClH,GAAG,IAAI,0CAA0C,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,gBAAgB,CAAC,IAAY,EAAE,OAAe,EAAE,QAAkC;QAC9E,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,WAAW,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACpH,GAAG,IAAI,0CAA0C,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,gBAAgB,CAAC,IAAY,EAAE,MAAW,EAAE,QAAkC;QAC1E,IAAI,GAAG,GAAG,kDAAkD,CAAC;QAC7D,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YACjC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CACN,GAAG,EACH,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAChD,QAAQ,CAAC,CAAC;IAClB,CAAC;IACD,eAAe,CAAC,IAAY,EAAE,QAAkC;QAC5D,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACzF,GAAG,IAAI,4CAA4C,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,cAAc,CAAC,IAAY,EAAE,QAAkC;QAC3D,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACzF,GAAG,IAAI,4CAA4C,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,cAAc,CAAC,IAAY,EAAE,QAAkC;QAC3D,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACzE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,aAAa,CAAC,QAAqE;QAC/E,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,mBAAmB,CAAC,MAAc,EAAE,GAAW,EAAE,OAAY,EAAE,UAAkB,EAAE,QAAkC;QACjH,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CACrB;YACI,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,GAAG;YACR,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAChC,OAAO,EAAE,IAAI,IAAI,EAAE;YACnB,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;SACjD,EACD,WAAW,CAAC,iBAAiB,CAAC,CAAA;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,kBAAkB,CAAC,QAAkE;QACjF,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CACrB,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,EACtD,WAAW,CAAC,iBAAiB,EAC7B,EAAE,CACL,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAChC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACnB,MAAM,CAAC;oBACH,IAAI,EAAE,CAAC,CAAC,MAAM;oBACd,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;oBAC3B,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,WAAW,EAAE,CAAC,CAAC,WAAW;iBAC7B,CAAC;YACN,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,oBAAoB,CAAC,IAAY,EAAE,OAAgB,EAAE,QAAkC;QAC3F,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACrC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC/B,EAAE,CAAC,CAAC,GAAG,CAAC;oBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,CAAC,mBAAmB,CACpB,IAAI,CAAC,MAAM,EACX,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,EACzG,EAAE,IAAI,EAAE,IAAI,EAAE,EACd,EAAE,GAAG,IAAI,EACT,QAAQ,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IACD,YAAY,CAAC,IAAY,EAAE,QAAkC;QACzD,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,QAAkC;QACzD,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,kBAAkB,CAAC,IAAY,EAAE,QAAkC;QAC/D,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACrC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAG,GAAG,IAAI,CAAC;YACf,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtD,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,6CAA6C,GAAG,IAAI,CAAC,CAAC,CAAC;YACrF,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnG,CAAC,CAAC,CAAC;IACP,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,QAAkC;QACzD,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAC/B,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;YAC5C,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAC3D,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAA;oBACvH,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACpC,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,QAAQ,CAAC,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC,CAAC;gBACnF,CAAC;YACL,CAAC;YAAC,IAAI,CAAC,CAAC;gBACJ,QAAQ,CAAC,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC,CAAC;YACtF,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,cAAc,CAAC,IAAY,EAAE,QAAkC;QAC3D,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtG,CAAC;IACD,kBAAkB,CAAC,IAAY,EAAE,QAA2E;QACxG,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CACrB,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,0BAA0B,EAC7C,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAClC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAsC,CAAC;YAC3C,GAAG,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACb,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzC,GAAG,CAAC,IAAI,CAAC;oBACL,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;oBAChC,WAAW,EAAE,CAAC,CAAC,SAAS;oBACxB,eAAe,EAAE,CAAC,CAAC,eAAe;iBACrC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACP,CAAC;IACD,gBAAgB,CAAC,IAAY,EAAE,QAAyE;QACpG,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CACrB,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,wBAAwB,EAC3C,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAClC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAoC,CAAC;YACzC,GAAG,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACb,GAAG,CAAC,IAAI,CAAC;oBACL,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,EAAE,EAAE,CAAC,CAAC,EAAE;iBACX,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AApgBD,oCAogBC"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4796ae6..0bb9afd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "qtopology-mysql", - "version": "2.0.2", + "version": "2.0.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c3b926e..e7f36ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "qtopology-mysql", - "version": "2.0.2", + "version": "2.0.4", "description": "MySQL-based coordination storage for QTopology", "main": "built/mysql_storage.js", "typings": "./built/mysql_storage", diff --git a/src/db_updater.ts b/src/db_updater.ts index 4baaca9..7509ae9 100644 --- a/src/db_updater.ts +++ b/src/db_updater.ts @@ -1,4 +1,3 @@ -import * as os from "os"; import * as async from "async"; import * as fs from "fs"; import * as path from "path"; @@ -31,6 +30,20 @@ export interface Connection { query(script: string, callback: SimpleResultCallback); } +/** + * Simple callback. + */ +export interface Glob { + sync(path: string): string[]; +} + +/** + * Simple callback. + */ +export interface Fs { + readFileSync(name: string, encoding: string): string +} + /** * Options for automatic DB upgrade */ @@ -39,6 +52,13 @@ export interface DbUpgraderOptions { conn: Connection; settings_table: string; version_record_key: string; + log_prefix?: string; + glob?: Glob; + fs?: Fs; + use_init_script?: boolean; + init_script_name?: string; + sql_template_get?: string; + sql_template_update?: string; } /** @@ -50,6 +70,16 @@ export class DbUpgrader { private conn: Connection; private settings_table: string; private version_record_key: string; + private inner_glob: Glob; + private inner_fs: Fs; + private log_prefix: string; + private init_script_name: string; + private use_init_script: boolean; + private sql_template_update: string; + private sql_template_get: string; + + private curr_version: number; + private files: FileRec[]; /** Simple constructor */ constructor(options: DbUpgraderOptions) { @@ -57,83 +87,86 @@ export class DbUpgrader { this.conn = options.conn; this.settings_table = options.settings_table || "Settings"; this.version_record_key = options.version_record_key || "dbver"; + this.inner_glob = options.glob || glob; + this.inner_fs = options.fs || fs; + this.log_prefix = options.log_prefix || "[qtopology-mysql DbUpgrader] "; + this.init_script_name = options.init_script_name || "init.sql"; + this.use_init_script = true; + if (options.use_init_script != undefined) { + this.use_init_script = options.use_init_script; + } + this.sql_template_get = options.sql_template_get || + "select value from ${tab} where name = '${key}';"; + this.sql_template_update = options.sql_template_update || + "update ${tab} set value = '${ver}' where name = '${key}';"; + + this.curr_version = -1; + this.files = []; } /** Internal logging utility method */ private log(s: string) { - qtopology.logger().debug("[qtopology-mysql DbUpgrader] " + s); + qtopology.logger().debug(this.log_prefix + s); } - /** Sequentially executes upgrade files. */ - run(callback) { + /** This method just checks if database version is in sync with code version. */ + check(callback: qtopology.SimpleCallback) { let self = this; - let files = []; - let xfiles = []; - let curr_version = -1; async.series( [ (xcallback) => { - let file_name = "init.sql"; - self.log("Executing upgrade file: " + file_name); - let script = fs.readFileSync(path.join(self.scripts_dir, file_name), "utf8"); - self.conn.query(script, (err) => { - if (err) { - console.log(err); - } - xcallback(err); - }); + self.getCurrentVersionFromDb(xcallback); + }, + (xcallback) => { + self.checkFilesInScriptsDir(xcallback); }, (xcallback) => { - self.log("Fetching files in script directory: " + self.scripts_dir); - files = glob.sync(self.scripts_dir + "/v*.sql"); - let xfiles = files.map(x => { - let r = new FileRec(); - r.file = x; - r.file_short = path.basename(x); - return r - }); - xfiles.forEach(x => { - let tmp = path.basename(x.file); - x.ver = +(tmp.replace("v", "").replace(".sql", "")); - }); - xfiles.sort((a, b) => { return a.ver - b.ver; }); - files = xfiles; + self.log("Finished."); + if (self.files.length == 0) { + return xcallback(new Error("Directory with SQL version upgrades is empty.")); + } + let code_version = self.files[self.files.length - 1].ver; + if (code_version != self.curr_version) { + return xcallback(new Error(`Version mismatch in QTopology SQL: ${self.curr_version} in db, ${code_version}`)); + } xcallback(); + } + ], callback); + } + + /** Sequentially executes upgrade files. */ + run(callback: qtopology.SimpleCallback) { + let self = this; + + async.series( + [ + (xcallback) => { + self.runInitScript(xcallback); }, (xcallback) => { - self.log("Fetching version from database..."); - let script = "select name, value from " + self.settings_table + " where name = '" + self.version_record_key + "';"; - self.conn.query(script, function (err, rows) { - if (err) return xcallback(err); - if (rows.length > 0) { - curr_version = rows[0].value; - } - self.log("Current version: " + curr_version); - xcallback(); - }); + self.checkFilesInScriptsDir(xcallback); }, (xcallback) => { - self.log("Detecting applicable upgrade files..."); - files = files.filter(x => x.ver > curr_version); - files = files.sort((a, b) => { return a.ver - b.ver; }); - xcallback(); + self.getCurrentVersionFromDb(xcallback); }, (xcallback) => { - self.log("Number of applicable upgrade files: " + files.length); + self.log("Detecting applicable upgrade files..."); + self.files = self.files.filter(x => x.ver > self.curr_version); + self.files = self.files.sort((a, b) => { return a.ver - b.ver; }); + + self.log("Number of applicable upgrade files: " + self.files.length); async.eachSeries( - files, + self.files, (item: FileRec, xxcallback) => { self.log("Executing upgrade file: " + item.file_short); - let script = fs.readFileSync(item.file, "utf8"); + let script = this.inner_fs.readFileSync(item.file, "utf8"); self.conn.query(script, (err) => { if (err) { console.log(err); return xxcallback(err); } - self.log("Updating version in db to " + item.ver); - let script2 = `update ${self.settings_table} set value = '${item.ver}' where name = '${self.version_record_key}'`; - self.conn.query(script2, xxcallback); + self.updateVersionInDb(item.ver, xxcallback); }); }, xcallback); @@ -144,4 +177,61 @@ export class DbUpgrader { } ], callback); } + + private runInitScript(callback: qtopology.SimpleCallback) { + let self = this; + + if (!self.use_init_script) { + return callback(); + } + self.log("Executing upgrade file: " + self.init_script_name); + let fname = path.join(self.scripts_dir, self.init_script_name); + let script = this.inner_fs.readFileSync(fname, "utf8"); + self.conn.query(script, callback); + } + + private getCurrentVersionFromDb(callback: qtopology.SimpleCallback) { + let self = this; + self.log("Fetching version from database..."); + let script = self.sql_template_get + .replace("${tab}", self.settings_table) + .replace("${key}", self.version_record_key); + self.conn.query(script, (err, rows) => { + if (err) return callback(err); + if (rows.length > 0) { + self.curr_version = rows[0].value; + } + self.log("Current version: " + self.curr_version); + callback(); + }); + } + + private checkFilesInScriptsDir(xcallback: qtopology.SimpleCallback) { + let self = this; + self.log("Checking files in script directory: " + self.scripts_dir); + let file_names = this.inner_glob.sync(path.join(self.scripts_dir, "v*.sql")); + let xfiles: FileRec[] = file_names.map(x => { + let r = new FileRec(); + r.file = x; + r.file_short = path.basename(x); + return r; + }); + xfiles.forEach(x => { + let tmp = path.basename(x.file); + x.ver = +(tmp.replace("v", "").replace(".sql", "")); + }); + xfiles.sort((a, b) => { return a.ver - b.ver; }); + self.files = xfiles; + xcallback(); + } + + private updateVersionInDb(ver: number, callback: qtopology.SimpleCallback) { + let self = this; + self.log("Updating version in db to " + ver); + let script = self.sql_template_update + .replace("${ver}", "" + ver) + .replace("${tab}", self.settings_table) + .replace("${key}", self.version_record_key); + self.conn.query(script, callback); + } } diff --git a/src/mysql_storage.ts b/src/mysql_storage.ts index 5ac0bca..fcbaa71 100644 --- a/src/mysql_storage.ts +++ b/src/mysql_storage.ts @@ -9,6 +9,8 @@ import * as qtopology from "qtopology"; import * as dbu from "./db_updater"; import * as qh from "./query_helper"; +export { DbUpgrader } from "./db_updater"; + ///////////////////////////////////////////////////////////////////// export interface MySqlStorageParams { @@ -17,8 +19,9 @@ export interface MySqlStorageParams { database: string; user: string; password: string; - retries: number; - retry_timeout: number; + retries?: number; + retry_timeout?: number; + db_check_only?: boolean; } export interface MySqlTopologyManager { @@ -45,6 +48,7 @@ export class MySqlStorage implements qtopology.CoordinationStorage { private name: string; private options: MySqlStorageParams; private next_refresh: number; + private db_check_only: boolean; constructor(options: MySqlStorageParams) { this.name = null; // this will be set later @@ -52,6 +56,7 @@ export class MySqlStorage implements qtopology.CoordinationStorage { this.options.retries = this.options.retries || 1; this.options.retry_timeout = this.options.retry_timeout || 10 * 1000; // retry each 10 sec this.next_refresh = 0; + this.db_check_only = this.options.db_check_only || false; this.pool = mysql.createPool({ database: options.database, host: options.host, @@ -64,6 +69,7 @@ export class MySqlStorage implements qtopology.CoordinationStorage { } init(callback: qtopology.SimpleCallback) { + let self = this; this.pool.getConnection((err, conn) => { if (err) return callback(err); let db_upgrader = new dbu.DbUpgrader({ @@ -72,7 +78,11 @@ export class MySqlStorage implements qtopology.CoordinationStorage { settings_table: "qtopology_settings", version_record_key: "db_version" }); - db_upgrader.run(callback); + if (self.db_check_only) { + db_upgrader.check(callback); + } else { + db_upgrader.run(callback); + } }); } diff --git a/tests/db_updater.tests.js b/tests/db_updater.tests.js new file mode 100644 index 0000000..bce6cb7 --- /dev/null +++ b/tests/db_updater.tests.js @@ -0,0 +1,771 @@ +"use strict"; + +let path = require("path"); +let assert = require("assert"); +let qtopology = require("qtopology"); +let dbu = require("../built/db_updater"); + +////////////////////////////////////////////////////////////////////////////////////// + +const scripts_dir = path.normalize("some/scripts/dir"); +const settings_table = "SomeWeirdNameForSettingsTable"; +const version_record_key = "SomeWeirdNameForASetting"; + +qtopology.logger().setLevel("none"); + +describe('DB updater', function () { + describe('run', function () { + it('should handle empty query result', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + case path.join(scripts_dir, "init.sql"): return "init.sql"; + case "v1.sql": return "v1.sql"; + case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `select value from ${settings_table} where name = '${version_record_key}';`: + return cb(null, []); + case `update ${settings_table} set value = '1' where name = '${version_record_key}';`: + case `update ${settings_table} set value = '2' where name = '${version_record_key}';`: + return cb(null, []); + case `init.sql`: + return cb(null, []); + case `v1.sql`: + return cb(null, []); + case `v2.sql`: + return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + it('should handle DB lower', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + case path.join(scripts_dir, "init.sql"): return "init.sql"; + //case "v1.sql": return "v1.sql"; + case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `select value from ${settings_table} where name = '${version_record_key}';`: + return cb(null, [{ name: "", value: "1"}]); + //case `update ${settings_table} set value = '1' where name = '${version_record_key}';`: + case `update ${settings_table} set value = '2' where name = '${version_record_key}';`: + return cb(null, []); + case `init.sql`: + return cb(null, []); + // case `v1.sql`: + // return cb(null, []); + case `v2.sql`: + return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + it('should handle DB at latest', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + case path.join(scripts_dir, "init.sql"): return "init.sql"; + //case "v1.sql": return "v1.sql"; + //case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `select value from ${settings_table} where name = '${version_record_key}';`: + return cb(null, [{ name: "", value: "2"}]); + //case `update ${settings_table} set value = '1' where name = '${version_record_key}';`: + // case `update ${settings_table} set value = '2' where name = '${version_record_key}';`: + // return cb(null, []); + case `init.sql`: + return cb(null, []); + // case `v1.sql`: + // return cb(null, []); + // case `v2.sql`: + // return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + }); + describe('run with injected init script name', function () { + it('should handle empty query result', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + case path.join(scripts_dir, "init2.sql"): return "init2.sql"; + case "v1.sql": return "v1.sql"; + case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `select value from ${settings_table} where name = '${version_record_key}';`: + return cb(null, []); + case `update ${settings_table} set value = '1' where name = '${version_record_key}';`: + case `update ${settings_table} set value = '2' where name = '${version_record_key}';`: + return cb(null, []); + case `init2.sql`: + return cb(null, []); + case `v1.sql`: + return cb(null, []); + case `v2.sql`: + return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs, + init_script_name: "init2.sql" + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + it('should handle DB lower', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + case path.join(scripts_dir, "init2.sql"): return "init2.sql"; + //case "v1.sql": return "v1.sql"; + case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `select value from ${settings_table} where name = '${version_record_key}';`: + return cb(null, [{ name: "", value: "1"}]); + //case `update ${settings_table} set value = '1' where name = '${version_record_key};'`: + case `update ${settings_table} set value = '2' where name = '${version_record_key}';`: + return cb(null, []); + case `init2.sql`: + return cb(null, []); + // case `v1.sql`: + // return cb(null, []); + case `v2.sql`: + return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs, + init_script_name: "init2.sql" + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + it('should handle DB at latest', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + case path.join(scripts_dir, "init2.sql"): return "init2.sql"; + //case "v1.sql": return "v1.sql"; + //case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `select value from ${settings_table} where name = '${version_record_key}';`: + return cb(null, [{ name: "", value: "2"}]); + //case `update ${settings_table} set value = '1' where name = '${version_record_key}';`: + // case `update ${settings_table} set value = '2' where name = '${version_record_key}';`: + // return cb(null, []); + case `init2.sql`: + return cb(null, []); + // case `v1.sql`: + // return cb(null, []); + // case `v2.sql`: + // return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs, + init_script_name: "init2.sql" + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + }); + describe('run with no init script', function () { + it('should handle empty query result', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + //case path.join(scripts_dir, "init2.sql"): return "init2.sql"; + case "v1.sql": return "v1.sql"; + case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `select value from ${settings_table} where name = '${version_record_key}';`: + return cb(null, []); + case `update ${settings_table} set value = '1' where name = '${version_record_key}';`: + case `update ${settings_table} set value = '2' where name = '${version_record_key}';`: + return cb(null, []); + // case `init2.sql`: + // return cb(null, []); + case `v1.sql`: + return cb(null, []); + case `v2.sql`: + return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs, + use_init_script: false + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + it('should handle DB lower', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + //case path.join(scripts_dir, "init2.sql"): return "init2.sql"; + //case "v1.sql": return "v1.sql"; + case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `select value from ${settings_table} where name = '${version_record_key}';`: + return cb(null, [{ name: "", value: "1"}]); + //case `update ${settings_table} set value = '1' where name = '${version_record_key}';`: + case `update ${settings_table} set value = '2' where name = '${version_record_key}';`: + return cb(null, []); + // case `init2.sql`: + // return cb(null, []); + // case `v1.sql`: + // return cb(null, []); + case `v2.sql`: + return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs, + use_init_script: false + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + it('should handle DB at latest', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + //case path.join(scripts_dir, "init2.sql"): return "init2.sql"; + //case "v1.sql": return "v1.sql"; + //case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `select value from ${settings_table} where name = '${version_record_key}';`: + return cb(null, [{ name: "", value: "2"}]); + //case `update ${settings_table} set value = '1' where name = '${version_record_key}';`: + // case `update ${settings_table} set value = '2' where name = '${version_record_key}';`: + // return cb(null, []); + // case `init2.sql`: + // return cb(null, []); + // case `v1.sql`: + // return cb(null, []); + // case `v2.sql`: + // return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs, + use_init_script: false + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + }); + describe('run with injected update and get SQL', function () { + it('should handle empty query result', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + case path.join(scripts_dir, "init.sql"): return "init.sql"; + case "v1.sql": return "v1.sql"; + case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `sql tmpl get ${settings_table} ${version_record_key}`: + return cb(null, []); + case `sql tmpl update ${settings_table} ${version_record_key} 1`: + case `sql tmpl update ${settings_table} ${version_record_key} 2`: + return cb(null, []); + case `init.sql`: + return cb(null, []); + case `v1.sql`: + return cb(null, []); + case `v2.sql`: + return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs, + sql_template_get: "sql tmpl get ${tab} ${key}", + sql_template_update: "sql tmpl update ${tab} ${key} ${ver}" + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + it('should handle DB lower', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + case path.join(scripts_dir, "init.sql"): return "init.sql"; + //case "v1.sql": return "v1.sql"; + case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `sql tmpl get ${settings_table} ${version_record_key}`: + return cb(null, [{ name: "", value: "1"}]); + //case `sql tmpl update ${settings_table} ${version_record_key} 1`: + case `sql tmpl update ${settings_table} ${version_record_key} 2`: + return cb(null, []); + case `init.sql`: + return cb(null, []); + // case `v1.sql`: + // return cb(null, []); + case `v2.sql`: + return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs, + sql_template_get: "sql tmpl get ${tab} ${key}", + sql_template_update: "sql tmpl update ${tab} ${key} ${ver}" + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + it('should handle DB at latest', function (done) { + let mock_fs = { + readFileSync: (fname) => { + switch (fname) { + case path.join(scripts_dir, "init.sql"): return "init.sql"; + //case "v1.sql": return "v1.sql"; + //case "v2.sql": return "v2.sql"; + } + assert.fail("Unexpected file to read: " + fname); + } + }; + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + switch (sql) { + case `sql tmpl get ${settings_table} ${version_record_key}`: + return cb(null, [{ name: "", value: "2"}]); + // case `sql tmpl update ${settings_table} ${version_record_key} 1`: + // case `sql tmpl update ${settings_table} ${version_record_key} 2`: + // return cb(null, []); + case `init.sql`: + return cb(null, []); + // case `v1.sql`: + // return cb(null, []); + // case `v2.sql`: + // return cb(null, []); + } + assert.fail("Unexpected sql: " + sql); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key, + fs: mock_fs, + sql_template_get: "sql tmpl get ${tab} ${key}", + sql_template_update: "sql tmpl update ${tab} ${key} ${ver}" + }); + target.run((err) => { + assert.ok(err == null); + done(); + }); + }); + }); + describe('check', function () { + it('should handle empty query result', function (done) { + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let mock_conn = { + query: (sql, cb) => { + assert.equal(sql, `select value from ${settings_table} where name = '${version_record_key}';`); + cb(null, []); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key + }); + target.check((err) => { + assert.ok(err); + done(); + }); + }); + it('should handle query error', function (done) { + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let curr_value = 2; + let mock_conn = { + query: (sql, cb) => { + assert.equal(sql, `select value from ${settings_table} where name = '${version_record_key}';`); + cb(new Error("Some error")); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key + }); + target.check((err) => { + assert.ok(err); + assert.equal(err.message, "Some error"); + done(); + }); + }); + it('should handle empty scripts dir', function (done) { + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return []; + } + }; + let curr_value = 2; + let mock_conn = { + query: (sql, cb) => { + assert.equal(sql, `select value from ${settings_table} where name = '${version_record_key}';`); + cb(null, [{ value: curr_value }]); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key + }); + target.check((err) => { + assert.equal(err.message, "Directory with SQL version upgrades is empty."); + done(); + }); + }); + it('should handle ok status', function (done) { + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let curr_value = 2; + let mock_conn = { + query: (sql, cb) => { + assert.equal(sql, `select value from ${settings_table} where name = '${version_record_key}';`); + cb(null, [{ value: curr_value }]); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key + }); + target.check((err) => { + assert.ok(err == null); + done(); + }); + }); + it('should handle DB lower', function (done) { + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let curr_value = 1; + let mock_conn = { + query: (sql, cb) => { + assert.equal(sql, `select value from ${settings_table} where name = '${version_record_key}';`); + cb(null, [{ value: curr_value }]); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key + }); + target.check((err) => { + assert.ok(err.message.startsWith("Version mismatch in QTopology SQL")); + done(); + }); + }); + it('should handle DB higher', function (done) { + let mock_glob = { + sync: (p) => { + assert.equal(p, path.normalize(scripts_dir + "/v*.sql")); + return ["v1.sql", "v2.sql"]; + } + }; + let curr_value = 3; + let mock_conn = { + query: (sql, cb) => { + assert.equal(sql, `select value from ${settings_table} where name = '${version_record_key}';`); + cb(null, [{ value: curr_value }]); + } + } + let target = new dbu.DbUpgrader({ + conn: mock_conn, + glob: mock_glob, + scripts_dir: scripts_dir, + settings_table: settings_table, + version_record_key: version_record_key + }); + target.check((err) => { + assert.ok(err.message.startsWith("Version mismatch in QTopology SQL")); + done(); + }); + }); + }); +}); diff --git a/tests/query_helper.tests.1.js b/tests/mysql_storage.tests.js similarity index 100% rename from tests/query_helper.tests.1.js rename to tests/mysql_storage.tests.js