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": {