diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fe8dbef..edba37f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,5 @@ test: script: - - wget https://git.softwaregroup-bg.com/ut5/ut-tools/raw/master/gitlab/gitlab-ci.sh -O gitlab-ci.sh + - wget https://raw.githubusercontent.com/softwaregroup-bg/ut-tools/master/gitlab/gitlab-ci.sh -O gitlab-ci.sh - chmod +x gitlab-ci.sh - ./gitlab-ci.sh \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 6750d05..488d827 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,118 @@ +# [7.12.0](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.11.0...v7.12.0) (2019-04-17) + + +### Features + +* convert objects parameters to JSON ([9800354](https://github.com/softwaregroup-bg/ut-port-sql/commit/9800354)) + + + +# [7.11.0](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.10.1...v7.11.0) (2019-04-16) + + +### Bug Fixes + +* stringify objects when encrypting ([f7e3e8e](https://github.com/softwaregroup-bg/ut-port-sql/commit/f7e3e8e)) + + +### Features + +* allow using '-' as prefix separator ([41d2069](https://github.com/softwaregroup-bg/ut-port-sql/commit/41d2069)) + + + +## [7.10.1](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.10.0...v7.10.1) (2019-03-27) + + +### Bug Fixes + +* support encryption in TVP ([5a1ca7f](https://github.com/softwaregroup-bg/ut-port-sql/commit/5a1ca7f)) + + + +# [7.10.0](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.9.2...v7.10.0) (2019-03-27) + + +### Features + +* allow seed data coming from .js or .json ([b15d772](https://github.com/softwaregroup-bg/ut-port-sql/commit/b15d772)) + + + +## [7.9.2](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.9.1...v7.9.2) (2019-03-22) + + + +## [7.9.1](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.9.0...v7.9.1) (2019-03-14) + + +### Bug Fixes + +* recursion safeguard ([b997705](https://github.com/softwaregroup-bg/ut-port-sql/commit/b997705)) + + + +# [7.9.0](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.8.2...v7.9.0) (2019-03-13) + + +### Bug Fixes + +* check for varbinary ([70a6f4a](https://github.com/softwaregroup-bg/ut-port-sql/commit/70a6f4a)) +* check this.cbc ([c87762d](https://github.com/softwaregroup-bg/ut-port-sql/commit/c87762d)) + + +### Features + +* crypto activated by field/param prefix ([a2b473a](https://github.com/softwaregroup-bg/ut-port-sql/commit/a2b473a)) +* support ?# before the modifiers ([36c8c81](https://github.com/softwaregroup-bg/ut-port-sql/commit/36c8c81)) + + + +## [7.8.2](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.8.1...v7.8.2) (2019-02-25) + + +### Bug Fixes + +* only create when create.user is configured ([4d52389](https://github.com/softwaregroup-bg/ut-port-sql/commit/4d52389)) + + + +## [7.8.1](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.8.0...v7.8.1) (2019-02-19) + + +### Bug Fixes + +* handle schemas in import order ([7763192](https://github.com/softwaregroup-bg/ut-port-sql/commit/7763192)) + + + +# [7.8.0](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.7.2...v7.8.0) (2019-02-19) + + +### Features + +* access whole config subtrees as JSON when interpolating ([37b81ab](https://github.com/softwaregroup-bg/ut-port-sql/commit/37b81ab)) + + + +## [7.7.2](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.7.1...v7.7.2) (2019-02-14) + + +### Bug Fixes + +* update mssql ([982e6c0](https://github.com/softwaregroup-bg/ut-port-sql/commit/982e6c0)) + + + +## [7.7.1](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.7.0...v7.7.1) (2019-02-14) + + +### Bug Fixes + +* interpolate falsy values correctly ([d6aa73d](https://github.com/softwaregroup-bg/ut-port-sql/commit/d6aa73d)) + + + # [7.7.0](https://github.com/softwaregroup-bg/ut-port-sql/compare/v7.6.0...v7.7.0) (2019-02-08) @@ -687,304 +802,304 @@ -## [5.4.4](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.4.3...v5.4.4) (2016-08-02) +## [5.4.4](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.4.3...v5.4.4) (2016-08-02) -## [5.4.3](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.4.2...v5.4.3) (2016-07-26) +## [5.4.3](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.4.2...v5.4.3) (2016-07-26) ### Bug Fixes -* let, const (#2) ([f678e6c](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/f678e6c)) +* let, const (#2) ([f678e6c](https://git.softwaregroup.com/ut5/ut-port-sql/commit/f678e6c)) -## [5.4.2](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.4.1...v5.4.2) (2016-07-26) +## [5.4.2](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.4.1...v5.4.2) (2016-07-26) -## [5.4.1](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.65...v5.4.1) (2016-07-11) +## [5.4.1](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.65...v5.4.1) (2016-07-11) ### Features -* upgrade dependencies ([2826f09](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/2826f09)) +* upgrade dependencies ([2826f09](https://git.softwaregroup.com/ut5/ut-port-sql/commit/2826f09)) -## [5.3.65](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.64...v5.3.65) (2016-06-23) +## [5.3.65](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.64...v5.3.65) (2016-06-23) ### Features -* add support for saving documentation when doc=true in the config ([0f090fa](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/0f090fa)) +* add support for saving documentation when doc=true in the config ([0f090fa](https://git.softwaregroup.com/ut5/ut-port-sql/commit/0f090fa)) -## [5.3.64](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.63...v5.3.64) (2016-06-20) +## [5.3.64](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.63...v5.3.64) (2016-06-20) ### Features -* add support for time type ([6800701](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/6800701)) +* add support for time type ([6800701](https://git.softwaregroup.com/ut5/ut-port-sql/commit/6800701)) -## [5.3.63](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.62...v5.3.63) (2016-06-20) +## [5.3.63](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.62...v5.3.63) (2016-06-20) ### Features -* add support for time columns in a table type ([9652a77](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/9652a77)) +* add support for time columns in a table type ([9652a77](https://git.softwaregroup.com/ut5/ut-port-sql/commit/9652a77)) -## [5.3.62](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.61...v5.3.62) (2016-06-16) +## [5.3.62](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.61...v5.3.62) (2016-06-16) -## [5.3.61](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.60...v5.3.61) (2016-06-15) +## [5.3.61](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.60...v5.3.61) (2016-06-15) ### Features -* upgrade mssql ([7990d16](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/7990d16)) +* upgrade mssql ([7990d16](https://git.softwaregroup.com/ut5/ut-port-sql/commit/7990d16)) -## [5.3.60](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.59...v5.3.60) (2016-06-03) +## [5.3.60](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.59...v5.3.60) (2016-06-03) ### Features -* add parser for default expression ([a6d5450](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/a6d5450)) -* add support for default values and datetime2 precision in TVP ([5475910](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/5475910)) -* support parsing default values for table columns ([abdaa51](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/abdaa51)) -* support sending default values in TVP and fix datetime2 handling ([83a407b](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/83a407b)) +* add parser for default expression ([a6d5450](https://git.softwaregroup.com/ut5/ut-port-sql/commit/a6d5450)) +* add support for default values and datetime2 precision in TVP ([5475910](https://git.softwaregroup.com/ut5/ut-port-sql/commit/5475910)) +* support parsing default values for table columns ([abdaa51](https://git.softwaregroup.com/ut5/ut-port-sql/commit/abdaa51)) +* support sending default values in TVP and fix datetime2 handling ([83a407b](https://git.softwaregroup.com/ut5/ut-port-sql/commit/83a407b)) -## [5.3.59](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.58...v5.3.59) (2016-06-02) +## [5.3.59](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.58...v5.3.59) (2016-06-02) ### Features -* pass @[@procid](https://github.com/procid) instead of procedure name ([619cc1b](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/619cc1b)) +* pass @[@procid](https://github.com/procid) instead of procedure name ([619cc1b](https://git.softwaregroup.com/ut5/ut-port-sql/commit/619cc1b)) -## [5.3.58](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.57...v5.3.58) (2016-06-01) +## [5.3.58](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.57...v5.3.58) (2016-06-01) -## [5.3.57](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.56...v5.3.57) (2016-06-01) +## [5.3.57](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.56...v5.3.57) (2016-06-01) ### Features -* add support capturing parameters in [@callParams](https://github.com/callParams) ([d116c43](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/d116c43)) +* add support capturing parameters in [@callParams](https://github.com/callParams) ([d116c43](https://git.softwaregroup.com/ut5/ut-port-sql/commit/d116c43)) -## [5.3.56](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.55...v5.3.56) (2016-05-30) +## [5.3.56](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.55...v5.3.56) (2016-05-30) ### Features -* add support for endpoint/method syntax ([4a5d41f](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/4a5d41f)) +* add support for endpoint/method syntax ([4a5d41f](https://git.softwaregroup.com/ut5/ut-port-sql/commit/4a5d41f)) -## [5.3.55](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.54...v5.3.55) (2016-05-26) +## [5.3.55](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.54...v5.3.55) (2016-05-26) ### Bug Fixes -* remove comment ([f47d03d](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/f47d03d)) -* remove fields filtration by default and handle in implementation ([1fc3223](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/1fc3223)) +* remove comment ([f47d03d](https://git.softwaregroup.com/ut5/ut-port-sql/commit/f47d03d)) +* remove fields filtration by default and handle in implementation ([1fc3223](https://git.softwaregroup.com/ut5/ut-port-sql/commit/1fc3223)) ### Features -* add automatig XML building from JSON ([744f517](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/744f517)) +* add automatig XML building from JSON ([744f517](https://git.softwaregroup.com/ut5/ut-port-sql/commit/744f517)) -## [5.3.54](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.53...v5.3.54) (2016-05-25) +## [5.3.54](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.53...v5.3.54) (2016-05-25) ### Bug Fixes -* improve itteration algorithm ([74e04bb](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/74e04bb)) +* improve itteration algorithm ([74e04bb](https://git.softwaregroup.com/ut5/ut-port-sql/commit/74e04bb)) ### Features -* XML parsing functionality ([76b4630](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/76b4630)) +* XML parsing functionality ([76b4630](https://git.softwaregroup.com/ut5/ut-port-sql/commit/76b4630)) -## [5.3.53](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.52...v5.3.53) (2016-05-17) +## [5.3.53](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.52...v5.3.53) (2016-05-17) ### Bug Fixes -* improve error handling ([02a9e49](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/02a9e49)) +* improve error handling ([02a9e49](https://git.softwaregroup.com/ut5/ut-port-sql/commit/02a9e49)) -## [5.3.52](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.51...v5.3.52) (2016-05-17) +## [5.3.52](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.51...v5.3.52) (2016-05-17) ### Features -* improve error logging ([6e7e6ee](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/6e7e6ee)) +* improve error logging ([6e7e6ee](https://git.softwaregroup.com/ut5/ut-port-sql/commit/6e7e6ee)) -## [5.3.51](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.50...v5.3.51) (2016-05-10) +## [5.3.51](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.50...v5.3.51) (2016-05-10) ### Features -* support passing $meta and using . in parameter/column names([706fe1f](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/706fe1f)) +* support passing $meta and using . in parameter/column names([706fe1f](https://git.softwaregroup.com/ut5/ut-port-sql/commit/706fe1f)) -## [5.3.50](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.49...v5.3.50) (2016-05-06) +## [5.3.50](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.49...v5.3.50) (2016-05-06) ### Features -* generate TTU automatically for all tables based on their structure([0c769cb](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/0c769cb)) +* generate TTU automatically for all tables based on their structure([0c769cb](https://git.softwaregroup.com/ut5/ut-port-sql/commit/0c769cb)) -## [5.3.49](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.48...v5.3.49) (2016-04-28) +## [5.3.49](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.48...v5.3.49) (2016-04-28) ### Bug Fixes -* **call-sp:** Default parameters should not be overridden with NULL when properties not specified.([55c7ef9](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/55c7ef9)) +* **call-sp:** Default parameters should not be overridden with NULL when properties not specified.([55c7ef9](https://git.softwaregroup.com/ut5/ut-port-sql/commit/55c7ef9)) ### Features -* **resultsets-order:** Include output parameters with predefined key when using naming resultsets.([25914da](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/25914da)) +* **resultsets-order:** Include output parameters with predefined key when using naming resultsets.([25914da](https://git.softwaregroup.com/ut5/ut-port-sql/commit/25914da)) -## [5.3.48](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.47...v5.3.48) (2016-04-27) +## [5.3.48](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.47...v5.3.48) (2016-04-27) -## [5.3.47](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.46...v5.3.47) (2016-04-25) +## [5.3.47](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.46...v5.3.47) (2016-04-25) ### Features -* allow retry to be configured and fail when retry is disabled ([55783de](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/55783de)) +* allow retry to be configured and fail when retry is disabled ([55783de](https://git.softwaregroup.com/ut5/ut-port-sql/commit/55783de)) -## [5.3.46](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.45...v5.3.46) (2016-04-22) +## [5.3.46](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.45...v5.3.46) (2016-04-22) ### Features -* add support for creating database ([04ab4fb](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/04ab4fb)) +* add support for creating database ([04ab4fb](https://git.softwaregroup.com/ut5/ut-port-sql/commit/04ab4fb)) -## [5.3.45](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.44...v5.3.45) (2016-04-19) +## [5.3.45](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.44...v5.3.45) (2016-04-19) ### Bug Fixes -* fix naming convention for auditCall ([edbec62](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/edbec62)) +* fix naming convention for auditCall ([edbec62](https://git.softwaregroup.com/ut5/ut-port-sql/commit/edbec62)) -## [5.3.44](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.43...v5.3.44) (2016-04-15) +## [5.3.44](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.43...v5.3.44) (2016-04-15) ### Features -* add Gitlab-ci and Jenkins scripts ([4591399](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/4591399)) +* add Gitlab-ci and Jenkins scripts ([4591399](https://git.softwaregroup.com/ut5/ut-port-sql/commit/4591399)) -## [5.3.43](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.42...v5.3.43) (2016-04-05) +## [5.3.43](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.42...v5.3.43) (2016-04-05) ### Features -* report error location in file ([1f60345](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/1f60345)) +* report error location in file ([1f60345](https://git.softwaregroup.com/ut5/ut-port-sql/commit/1f60345)) -## [5.3.42](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.41...v5.3.42) (2016-04-05) +## [5.3.42](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.41...v5.3.42) (2016-04-05) ### Features -* **parser:** add function and params comment as documentation ([fbb7e8a](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/fbb7e8a)) -* **parser:** add support for alter ([ce74eab](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/ce74eab)) -* **parser:** add table and procedure comment as description in mssql ([91075e5](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/91075e5)) +* **parser:** add function and params comment as documentation ([fbb7e8a](https://git.softwaregroup.com/ut5/ut-port-sql/commit/fbb7e8a)) +* **parser:** add support for alter ([ce74eab](https://git.softwaregroup.com/ut5/ut-port-sql/commit/ce74eab)) +* **parser:** add table and procedure comment as description in mssql ([91075e5](https://git.softwaregroup.com/ut5/ut-port-sql/commit/91075e5)) -## [5.3.41](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.40...v5.3.41) (2016-04-04) +## [5.3.41](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.40...v5.3.41) (2016-04-04) ### Features -* update ut-error dependency ([fed374c](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/fed374c)) +* update ut-error dependency ([fed374c](https://git.softwaregroup.com/ut5/ut-port-sql/commit/fed374c)) -## [5.3.40](https://git.softwaregroup-bg.com/ut5/ut-port-sql/compare/v5.3.38...v5.3.40) (2016-03-31) +## [5.3.40](https://git.softwaregroup.com/ut5/ut-port-sql/compare/v5.3.38...v5.3.40) (2016-03-31) ### Bug Fixes -* switch to nexus ([ac00ce1](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/ac00ce1)) -* use constant dependencies ([595be31](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/595be31)) +* switch to nexus ([ac00ce1](https://git.softwaregroup.com/ut5/ut-port-sql/commit/ac00ce1)) +* use constant dependencies ([595be31](https://git.softwaregroup.com/ut5/ut-port-sql/commit/595be31)) ### Features -* ut-tools upgrade ([468bc52](https://git.softwaregroup-bg.com/ut5/ut-port-sql/commit/468bc52)) +* ut-tools upgrade ([468bc52](https://git.softwaregroup.com/ut5/ut-port-sql/commit/468bc52)) diff --git a/index.js b/index.js index 5141fd6..ef09e23 100644 --- a/index.js +++ b/index.js @@ -18,6 +18,8 @@ const VAR_RE = /\$\{([^}]*)\}/g; const ENCRYPT_RE = /(?:NULL|0x.*)\/\*encrypt (.*)\*\//gi; const ROW_VERSION_INNER_TYPE = 'BINARY'; const serverRequire = require; +const dotprop = require('dot-prop'); +const isEncrypted = item => item && ((item.def && item.def.type === 'varbinary' && item.def.size % 16 === 0) || (item.length % 16 === 0) || /^encrypted/.test(item.name)); // patch for https://github.com/tediousjs/tedious/pull/710 require('tedious').TYPES.Time.writeParameterData = function writeParameterData(buffer, parameter, options) { @@ -67,7 +69,14 @@ function changeRowVersionType(field) { } function interpolate(txt, params = {}) { - return txt.replace(VAR_RE, (placeHolder, label) => (params[label] || placeHolder)); + return txt.replace(VAR_RE, (placeHolder, label) => { + let value = dotprop.get(params, label); + switch (typeof value) { + case 'undefined': return placeHolder; + case 'object': return JSON.stringify(value); + default: return value; + } + }); }; module.exports = function({utPort}) { @@ -94,6 +103,7 @@ module.exports = function({utPort}) { skipTableType: [], paramsOutName: 'out', doc: false, + maxNesting: 5, connection: { options: { debug: { @@ -130,11 +140,12 @@ module.exports = function({utPort}) { }) .then(this.refreshView.bind(this, true)) .then(this.loadSchema.bind(this, null)) - .then(this.updateSchema.bind(this)) + .then(this.updateSchema.bind(this, {paths: 'schema', retry: this.config.retrySchemaUpdate, load: true})) .then(this.refreshView.bind(this, false)) .then(this.linkSP.bind(this)) .then(this.doc.bind(this)) .then((v) => { this.connectionReady = true; return v; }) + .then(this.updateSchema.bind(this, {paths: 'seed', retry: false, load: false})) .catch((err) => { try { this.connection.close(); } catch (e) {}; if (this.config.retry) { @@ -149,7 +160,7 @@ module.exports = function({utPort}) { start() { this.cbc = this.config.cbc && crypto.cbc(this.config.cbc); this.bus && this.bus.attachHandlers(this.methods, this.config.imports); - this.methods.imported && Object.values(this.methods.imported).forEach(value => { + this.methods.importedMap && Array.from(this.methods.importedMap.values()).forEach(value => { if (Array.isArray(value.skipTableType)) { this.config.skipTableType = this.config.skipTableType.concat(value.skipTableType); }; @@ -202,7 +213,7 @@ module.exports = function({utPort}) { $meta.debug = !!this.bus.config.debug; let methodName = ($meta && $meta.method); if (methodName) { - let parts = methodName.match(/^([^[]*)(\[[0+?^]?])?$/); + let parts = methodName.match(/^([^[#?]*)[^[]*(\[[0+?^]?])?$/); let modifier; if (parts) { methodName = parts[1]; @@ -302,35 +313,35 @@ module.exports = function({utPort}) { }); }); } - getSchema() { + getPaths(name) { let result = []; - if (this.config.schema) { - let schema; - if (typeof (this.config.schema) === 'function') { - schema = this.config.schema(); + if (this.config[name]) { + let folder; + if (typeof (this.config[name]) === 'function') { + folder = this.config[name](); } else { - schema = this.config.schema; + folder = this.config[name]; } - if (Array.isArray(schema)) { - result = schema.slice(); + if (Array.isArray(folder)) { + result = folder.slice(); } else { - result.push({path: schema}); + result.push({path: folder}); } } - this.methods.imported && Object.entries(this.methods.imported).forEach(function([name, value]) { - if (this.includesConfig('updates', name, true)) { - value.schema && Array.prototype.push.apply(result, value.schema); + this.methods.importedMap && Array.from(this.methods.importedMap.entries()).forEach(function([imported, value]) { + if (this.includesConfig('updates', imported, true)) { + value[name] && Array.prototype.push.apply(result, value[name]); } }.bind(this)); - return result.reduce((all, schema) => { - schema = (typeof schema === 'function') ? schema(this) : schema; - schema && all.push(schema); + return result.reduce((all, item) => { + item = (typeof item === 'function') ? item(this) : item; + item && all.push(item); return all; }, []); } - updateSchema(schema) { + updateSchema({paths, retry, load}, schema) { this.checkConnection(); - let busConfig = flatten(this.bus.config); + let busConfig = this.bus.config; function replaceAuditLog(statement) { let parserSP = require('./parsers/mssqlSP'); @@ -472,8 +483,27 @@ module.exports = function({utPort}) { } } + const addSP = (queries, {fileName, objectName, objectId, config}) => { + const params = require(fileName); + queries.push({ + fileName, + objectName, + objectId, + callSP: () => this.methods[objectName].call( + this, + typeof params === 'function' ? params(config) : params, + { + auth: { + actorId: 0 + }, + method: objectName, + userName: 'SYSTEM' + }) + }); + }; + function getObjectName(fileName) { - return fileName.replace(/\.sql$/i, '').replace(/^[^$]*\$/, ''); // remove "prefix$" and ".sql" suffix + return fileName.replace(/\.(sql|js|json)$/i, '').replace(/^[^$-]*[$-]/, ''); // remove "prefix[$-]" and ".sql/.js/.json" suffix } function shouldCreateTT(tableName) { @@ -523,16 +553,16 @@ module.exports = function({utPort}) { } let self = this; - let schemas = this.getSchema(); + let folders = this.getPaths(paths); let failedQueries = []; let hashDropped = false; - if (!schemas || !schemas.length) { + if (!folders || !folders.length) { return schema; } return new Promise((resolve, reject) => { let objectList = []; let promise = Promise.resolve(); - schemas.forEach((schemaConfig) => { + folders.forEach((schemaConfig) => { promise = promise .then(() => { return new Promise((resolve, reject) => { @@ -562,37 +592,52 @@ module.exports = function({utPort}) { if (!fs.statSync(fileName).isFile()) { return; } - schemaConfig.linkSP && (objectList[objectId] = fileName); - let fileContent = fs.readFileSync(fileName).toString(); - addQuery(queries, { - fileName: fileName, - objectName: objectName, - objectId: objectId, - fileContent: fileContent, - createStatement: getCreateStatement(fileContent, fileName, objectName) - }); - if (shouldCreateTT(objectId) && !objectIds[objectId + 'tt']) { - let tt = tableToType(fileContent.trim().replace(/^ALTER /i, 'CREATE ')); - if (tt) { + switch (path.extname(fileName).toLowerCase()) { + case '.sql': + schemaConfig.linkSP && (objectList[objectId] = fileName); + let fileContent = fs.readFileSync(fileName).toString(); addQuery(queries, { fileName: fileName, - objectName: objectName + 'TT', - objectId: objectId + 'tt', - fileContent: tt, - createStatement: tt + objectName: objectName, + objectId: objectId, + fileContent: fileContent, + createStatement: getCreateStatement(fileContent, fileName, objectName) }); - } - let ttu = tableToTTU(fileContent.trim().replace(/^ALTER /i, 'CREATE ')); - if (ttu) { - addQuery(queries, { + if (shouldCreateTT(objectId) && !objectIds[objectId + 'tt']) { + let tt = tableToType(fileContent.trim().replace(/^ALTER /i, 'CREATE ')); + if (tt) { + addQuery(queries, { + fileName: fileName, + objectName: objectName + 'TT', + objectId: objectId + 'tt', + fileContent: tt, + createStatement: tt + }); + } + let ttu = tableToTTU(fileContent.trim().replace(/^ALTER /i, 'CREATE ')); + if (ttu) { + addQuery(queries, { + fileName: fileName, + objectName: objectName + 'TTU', + objectId: objectId + 'ttu', + fileContent: ttu, + createStatement: ttu + }); + } + }; + break; + case '.js': + case '.json': + addSP(queries, { fileName: fileName, - objectName: objectName + 'TTU', - objectId: objectId + 'ttu', - fileContent: ttu, - createStatement: ttu + objectName: objectName, + objectId: objectId, + config: schemaConfig.config }); - } - } + break; + default: + throw new Error('Unsupported file extension: ' + fileName); + }; }); let request = self.getRequest(); @@ -608,14 +653,14 @@ module.exports = function({utPort}) { } queries.forEach((query) => { innerPromise = innerPromise.then(() => { - return request - .batch(query.content) + let operation = query.callSP ? query.callSP() : request.batch(query.content); + return operation .then(() => updated.push(query.objectName)) .catch((err) => { err.message = err.message + ' (' + query.fileName + ':' + (err.lineNumber || 1) + ':1)'; let newError = sqlPortErrors['portSQL.updateSchema'](err); newError.fileName = query.fileName; - if (!this.config.retrySchemaUpdate) { + if (!retry) { throw newError; } else { failedQueries.push(query); @@ -631,7 +676,7 @@ module.exports = function({utPort}) { message: updated, $meta: { mtid: 'event', - opcode: 'updateSchema' + opcode: 'update.' + paths } }); return resolve(); @@ -653,6 +698,7 @@ module.exports = function({utPort}) { .then(() => (objectList)); }) .then(function(objectList) { + if (!load) return schema; return self.loadSchema(objectList); }); } @@ -702,6 +748,7 @@ module.exports = function({utPort}) { } callSP(name, params, flatten, fileName) { let self = this; + let nesting = this.config.maxNesting; let outParams = []; params && params.forEach(function(param) { param.out && outParams.push(param.name); @@ -731,8 +778,10 @@ module.exports = function({utPort}) { return data; } let result = {}; - function recurse(cur, prop) { - if (Object(cur) !== cur) { + function recurse(cur, prop, depth) { + if (depth > nesting) throw new Error('Unsupported deep nesting for property ' + prop); + if (typeof cur === 'function') { + } else if (Object(cur) !== cur) { result[prop] = cur; } else if (Array.isArray(cur)) { // for (let i = 0, l = cur.length; i < l; i += 1) { @@ -746,14 +795,14 @@ module.exports = function({utPort}) { let isEmpty = true; for (let p in cur) { isEmpty = false; - recurse(cur[p], prop ? prop + delimiter + p : p); + recurse(cur[p], prop ? prop + delimiter + p : p, depth + 1); } if (isEmpty && prop) { result[prop] = {}; } } } - recurse(data, ''); + recurse(data, '', 1); return result; } function getValue(column, value, def, updated) { @@ -763,7 +812,10 @@ module.exports = function({utPort}) { if (value === undefined) { return def; } else if (value) { - if (/^(date.*|smalldate.*)$/.test(column.type.declaration)) { + if (self.cbc && isEncrypted({name: column.name, def: {type: column.type.declaration, size: column.length}})) { + if (!Buffer.isBuffer(value) && typeof value === 'object') value = JSON.stringify(value); + return self.cbc.encrypt(Buffer.from(value)); + } else if (/^(date.*|smalldate.*)$/.test(column.type.declaration)) { // set a javascript date for 'date', 'datetime', 'datetime2' 'smalldatetime' return new Date(value); } else if (column.type.declaration === 'time') { @@ -774,6 +826,8 @@ module.exports = function({utPort}) { return xmlBuilder.buildObject(obj); } else if (value.type === 'Buffer') { return Buffer.from(value.data); + } else if (typeof value === 'object') { + return JSON.stringify(value); } } return value; @@ -785,7 +839,17 @@ module.exports = function({utPort}) { let debug = this.isDebug(); let debugParams = {}; request.multiple = true; - $meta.globalId = uuid.v1(); + $meta.globalId = ($meta && $meta.requestHeaders && $meta.requestHeaders['x-requestuid']) || uuid.v1(); + $meta.requestDateTime = ($meta && + $meta.requestHeaders && + $meta.requestHeaders['x-requestuiddatetime'] && + $meta.requestHeaders['x-requestuiddatetime'] != null && + $meta.requestHeaders['x-requestuiddatetime']) || new Date().getTime(); + $meta.noAudit = ($meta && + $meta.requestHeaders && + $meta.requestHeaders['x-noaudit'] && + $meta.requestHeaders['x-noaudit'] != null && + $meta.requestHeaders['x-noaudit']) || 0; params && params.forEach(function(param) { let value; if (param.name === 'meta') { @@ -795,8 +859,8 @@ module.exports = function({utPort}) { } else { value = data[param.name]; } - if (param.encrypt) { - value = self.cbc.encrypt(value); + if (param.encrypt && value != null) { + value = self.cbc.encrypt(Buffer.from(value)); } let hasValue = value !== void 0; let type = sqlType(param.def); @@ -894,7 +958,7 @@ module.exports = function({utPort}) { Object.keys(resultset.columns).forEach(column => { switch (resultset.columns[column].type.declaration) { case 'varbinary': - if (self.cbc && resultset.columns[column].length % 16 === 0) { + if (self.cbc && isEncrypted(resultset.columns[column])) { encryptedColumns.push(column); } break; @@ -1065,9 +1129,9 @@ module.exports = function({utPort}) { flatten = '_'; } }); - binding.params && binding.params.forEach(function(param) { + binding.params && binding.params.forEach(param => { (update.indexOf(param.name) >= 0) && (param.update = param.name.replace(/\$update$/i, '')); - if (param.def && param.def.type === 'varbinary' && param.def.size % 16 === 0 && this.cbc) { + if (isEncrypted(param) && this.cbc) { param.encrypt = true; }; if (param.def && param.def.type === 'table') { @@ -1103,7 +1167,7 @@ module.exports = function({utPort}) { return table; }; } - }.bind(this)); + }); this.methods[flatName] = this.callSP(binding.name, binding.params, flatten, procedure.fileName); } }.bind(this)); @@ -1112,7 +1176,7 @@ module.exports = function({utPort}) { } loadSchema(objectList, hash) { let self = this; - let schema = this.getSchema(); + let schema = this.getPaths('schema'); let cacheFile = name => path.join(this.bus.config.workDir, 'ut-port-sql', name ? name + '.json' : ''); if (hash) { let cacheFileName = cacheFile(hash); @@ -1203,7 +1267,7 @@ module.exports = function({utPort}) { refreshView(drop, data) { this.checkConnection(); if (this.config.offline) return drop ? this.config.offline : data; - let schema = this.getSchema(); + let schema = this.getPaths('schema'); if ((Array.isArray(schema) && !schema.length) || !schema) { if (drop && this.config.cache) { return this.getRequest() @@ -1230,7 +1294,7 @@ module.exports = function({utPort}) { } this.checkConnection(); let self = this; - let schemas = this.getSchema(); + let schemas = this.getPaths('schema'); let parserSP = require('./parsers/mssqlSP'); return new Promise(function(resolve, reject) { let docList = []; @@ -1396,7 +1460,7 @@ module.exports = function({utPort}) { }); this.connection = new mssql.ConnectionPool(sanitize(this.config.connection)); - if (this.config.create) { + if (this.config.create && this.config.create.user) { let conCreate = new mssql.ConnectionPool( sanitize({...this.config.connection, ...{user: '', password: '', database: ''}, ...this.config.create}) // expect explicit user/pass ); @@ -1452,26 +1516,4 @@ module.exports = function({utPort}) { }); object[fieldName] = fieldValue; } - - function flatten(data) { - let result = {}; - function recurse(cur, prop) { - if (Object(cur) !== cur) { - result[prop] = cur; - } else if (Array.isArray(cur) || typeof cur === 'function') { - result[prop] = cur; - } else { - let isEmpty = true; - Object.keys(cur).forEach(function(p) { - isEmpty = false; - recurse(cur[p], prop ? prop + '.' + p : p); - }); - if (isEmpty && prop) { - result[prop] = {}; - } - } - } - recurse(data, ''); - return result; - } }; diff --git a/package.json b/package.json index 8b4aac6..931187b 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,23 @@ { "name": "ut-port-sql", - "version": "7.7.0", + "version": "7.12.0", "main": "./index.js", "dependencies": { + "dot-prop": "4.2.0", "fs-plus": "3.0.2", "json-stringify-deterministic": "1.0.1", "through2": "2.0.3", - "mssql": "4.3.0", + "mssql": "4.3.1", "uuid": "3.3.2", "xml2js": "0.4.19" }, "devDependencies": { - "tap": "^12.5.2", - "ut-tools": "^6.8.10", + "tap": "^12.6.0", + "ut-tools": "^6.14.1", "pegjs": "0.10.0" }, "peerDependencies": { + "ut-bus": "^7.1.1", "tedious": "^2.7.1" }, "scripts": {