{"_id":"datahub-restful-core","_rev":"58-bb9f2f0419fba68dd304ed003f5a2171","name":"datahub-restful-core","dist-tags":{"latest":"2.1.2","beta":"1.1.8-beta1","privilege":"1.1.7-privilege7","next":"2.0.0"},"versions":{"1.0.0":{"name":"datahub-restful-core","version":"1.0.0","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","gen":"pegjs ./core/pegjs/sql.pegjs ./pegjs/core/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"node-dev":"^3.1.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"gitHead":"6a7038b0ecc6c55f3d2e0c964ef8db955c206219","_id":"datahub-restful-core@1.0.0","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-yMIlDxGubxTj+VnQSxvY64e/Tu9LKZP+g1c6OwBxi5VFGBq0bNUkFOaVw2koDlCl8FkCTDbLuLNZ0Uwu5NEGoA==","shasum":"b749822c07223b9e9918e17e1772f5c14a150ada","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.0.0.tgz","fileCount":31,"unpackedSize":451475,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwZ+pCRA9TVsSAnZWagAAfeEQAIxnR3GgPAAS1DJ91h2g\nOel/ofbzK8eJaO5bdOyyQs4KoZZd9MQRmjzDx7HW79zn8UG+RTERc//FMela\nvxlDanWhR04AZ2uqdmchEp5n0/SscViiop9At+wjq4z+TWk7QTtXbzs4+81k\nkYfO3V8ZXUoupzyRnXyUND1mWWHTZuxWlrolCZTLjq/i3vmJ1NpR9hJiMxVS\ncFWfBubeM2m7PKtrL3VKIflLfORSW7+wWUeHZi6Kk/yqw0LXh5Di/VXl7Gy1\naZGC9bcBHkPe5obo9S63mPFty5X80NY0jX7/RJUi4RZkUartvC7W07sufVF/\nruTZBRJ66YdiPF6OsBn309fd1OtGPDlB8L33G4cC6qoX7aABYn0J0mUnyNaF\nVf/gj4Rcel1txq+c3zpsmqDnc+7iPRn2anI6pMziO/8eGMnuVgKGqDxO7G/S\na6i5E1vwlEhqFLJAJxE/Mhm44WJSZx/GDUq5FUymCRw0d5JJOcTNBFSGZZPj\nzPj4dg9cSC7V1gcI89LlM5YJ/SReDAq/nkA3uoWkTRVou48PP3LgjVmkD4dt\nBkK6ZHxpsxwSIK2kxWjb8hHnRP+FwohnIFdC1prRYTaf0CdEMRi7vL4SD8U6\nEVMs0Yxv66BLpSUuFyBr/KE5rjo73znT3Vk79xwq9+KEolZfH74/QrPv/bxJ\nyure\r\n=EyqN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCLSuuhQT+ulfmcK9mufmdUTdgC98eUTyhspTHLEkmKZAIgCKBWy+1EzObhCVx0CIDViD84f8lCl361KB5qj+/SDpc="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.0.0_1556193193015_0.5714853634975916"},"_hasShrinkwrap":false},"1.0.1":{"name":"datahub-restful-core","version":"1.0.1","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/pegjs/sql.pegjs ./pegjs/core/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"22f043a2dbd5e81d4d441213388a57341249ae2e","_id":"datahub-restful-core@1.0.1","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-pnwkPPMgmMysbDN8djxBo2AhH5LTWIBCFlXfdI/ZVD1ujz8QhiHmf/v8nyM9iPP8Galu7eAHIATZB/7+1859Nw==","shasum":"615840d535a746bd63478649458bc292628179a4","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.0.1.tgz","fileCount":32,"unpackedSize":452110,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0mGgCRA9TVsSAnZWagAAIjEQAJLdOT8mI9P5hULe4beI\na3qWMyUfpTjlSVAWtLB0Q27TpnJqpJNiN2vFMSVGtglSTcjXf2F6kRRABeYw\n1PSKdnW1lKBuxp0inuqX+nR83hewI7vXgMwqbBFfqjDjFoOZdVVSAITFxZ/B\n8OCTVGqUxJOGOeLn8qT0xnFWTMcccjMkoqvtSyQ4sRBvndRUhUPsPSLRKHX4\ngRHzUQFylv92eymAy3S874tW/lLgh5h1C31c9gzrV7CUax++jZ4sVXsAJAka\nvxWUPohrJ1uUWf4wufLJGhs+WbvZrBdSK5vGRQVXh8XcurcqzUAhnQv+3Naq\n4C9LChQcSjDqIf4QUZzuXS1XkZz+SC+njWrXs/uBV5C0LpqQwcaNstj6M7RM\nA4CvGbdUs2Q7nGZkPMN8OpaMHeMw/guNmBVv4DyW6i5QFO2cE7DCm0bsfvJZ\n1JMrg5MmjYntNN1y4skwDzZYgErZOtJl7H5ivSiAV7A4jaW3W7UlZesuh8Ub\nxtU8LqvxAK7ZWL7eLoT7v6D8I6mPQh34bSFn3qqhTCghXEO92nuZQKw21blM\nlSmQX1noKu3lE5ucA9W5ORRtrp1ZywdQE9QWS7fyvOTlgXJ5ZX49dn1N8SR2\nt2TlA3RbNlaIUCR47hrpSproaUwi6DL5+pFwJX1UVq0xhNx/3VYQ+IXwVf/d\nvQj1\r\n=3Lq1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHqcrj91avFTDetAzWn9LnoRvJ2VF0jiRvtRdy6vFMhoAiEA5GXR2JWWKVIca98HMTXtB7okID/k3o6i6fzVG3H3/E4="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.0.1_1557291423504_0.20389172763163965"},"_hasShrinkwrap":false},"1.0.2":{"name":"datahub-restful-core","version":"1.0.2","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/pegjs/sql.pegjs ./pegjs/core/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"38387f5f0c69d1d20b7814554ffe8ebe0d711315","_id":"datahub-restful-core@1.0.2","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-00p7SFkIrbt2BZviQbh9tdTgwSdE7mIgi+ZdtUPv+cEFNrtzR7SpmbBhJaTPEKJy1uO5NJKipPNcRZZxrSkiwA==","shasum":"7f24d139cee6e1819ddb0c88e56fa4414ae23101","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.0.2.tgz","fileCount":32,"unpackedSize":452110,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0mwXCRA9TVsSAnZWagAApFoP+gL8/lVgIhQwv3vx2M38\nwBV7BuDPlK5AgGjQVYIZ+9aqKicMcbGl+3XDkOePXR5f8kW7rZ5tu+3d1cpq\nnDCgFsg3PcXbEDJ4iXCLm847T+lzM7B/RE1sars3CRuZr9AWV/XHBP1QvnUY\nw6QFHQhX7eF1PrmeWv2SB1ExZn4hobRnmvDmw6iw/zvIS5vZeyOJrOzHcv58\nzlG9peeldiR0hgemH1VoDPEigjaoD6ITvXoknwmfoIX7iGjiGe3o84S0cP6k\nCr9ocBoXbJwfC/eJTp9UWO3UdEJa93ItgDZNkn6oDJeKyJmXakayMH+uCh2I\nm/0ZVnVXLIt3P7Fq5mI04BCk3IQJTNCRQAbyDyX6tkypHV4pfdzHbcTeic/A\n/QZ103J9aC06uX+DF2lIB37xjaKfi5PkPyFLGDfNbvdYb5sJVl7dQ7YOQQIf\notR1oFbxtHk0lTKEyfKpcc/8B7bt1nttKbKCMWV9JLt6881VtbgRm6kLnSVI\nwl0egQ0NkBubIY/BTBN8vNh0XA3/76UI9ByoaoXUPokBsOTSnTS6MONWKRzt\n/ZYdUgjcAQN79WzkB7UcWCzG53ZqcgzidRAY+eHpygGQXzd2xXMy74olKVw9\nSJx9ffCDv0leGxdIJv5rB3FdCrnWjT1QvL82GvaFFM4liEaSO4VH6AIIJtsu\nYLVG\r\n=WcTe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAfM9jzHHIAkYqBh0MD5EOzYBE8xMf8La69xLV5LLVAmAiBo9mfhlaobztbGJrTh2o9boWN7lHhEc1S1XjPoqL1pxQ=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.0.2_1557294103218_0.9357770173223527"},"_hasShrinkwrap":false},"1.0.3":{"name":"datahub-restful-core","version":"1.0.3","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/pegjs/sql.pegjs ./pegjs/core/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"61cf7344f4359c7159ce9e938e757fc02871223b","_id":"datahub-restful-core@1.0.3","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-pVwpdN3xyJ4yCVCSKyG3Qpn2aYEwUGq2FASVA+jX7lKg2cMJ7TDD/hT9gb9FzVD0EMUGPUhv3KwCu9DPvDrfEg==","shasum":"70929c7f781f7a744e32dc55f6a6d4d42bd1ed1e","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.0.3.tgz","fileCount":38,"unpackedSize":492401,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7MqSCRA9TVsSAnZWagAADMEP/A9tQs+8jqZ3FklKgF6l\nSVzU8NzlSqXV/3ew/8vih4zb/vKomRblJSlqqw/JWaMfro+lwn04Fv9RobTA\n4wv6ZfZeoTKil5uBbJS2njTvFlSQool1W80w8dX1W0MWTNNQdqjf6c1cEO0J\nZzolIc74TFfNXXbrz3irTxYh0QUIfpexVLCiBzMPFK/qfCU9fpMsw2bIkq8Q\nwGsZnnWZ6CcwX6ux0Y1F5+HIr2owzPznvwVn8zXjGEYmgcbLW7eYFUpNraCa\nudJFd5OWWDMUsg7dcl1/weTTOI8nyTckuxWAoSzkqg2zw8q0qaeohsXZIDKh\nqiWayoH78cUcMo+GpSEK1K7XIWR99ha2RmlJJJth2CiEppCo7f+djHtnZZiC\nAVEJ3kVsBM3qmtYmRhqqt9olk1NZ0DRE4tv5E3XZccjcYSZBvp2PLXCQkPEU\nvhNwvNh1+FkYNjgaFtMpOutAHJbSJ5YraHLb13uRJrCwhbFfslYPFxqVCtjU\nuSPVX+l4FSoPgCIugkCMZiDZlR2TihT0URkle4BLy2RhTUVcFNMYUjP9ltcC\nH7kRhdwtRe+jgMfrBvKSB5ngX6qhPslf2lOh4LgaEz6WCmFTm1QnkQxU6CdV\neCN2eWdlz3mK67EaLAQJxc+79Euas1/KkJEEhD0XxMe/ibav35YP1teGruqh\n6MFX\r\n=9S+y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIELYNB/cnpnJYZ97/1ijOUUN8EYugLeVzkzbBTTrWudBAiAwyCTgSOV+JcS50g5TbugiLLy/arDjWerMY/h6BiXZ/w=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.0.3_1559022226103_0.8426162222501401"},"_hasShrinkwrap":false},"1.0.4":{"name":"datahub-restful-core","version":"1.0.4","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/pegjs/sql.pegjs ./pegjs/core/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"f6a0f76205d45c0dfe3672a3c9e0e22590ea6eec","_id":"datahub-restful-core@1.0.4","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-VUpZrJst8wcf5yC1dl09IGMl72SxDcCHe99mciDX6r6CxCaNZZkmco46LKUB4TxjKUTSxD7ppJXpcaSffaqpCg==","shasum":"a9da2d0d0f7e9b5a966b9f95443f02333ea1883a","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.0.4.tgz","fileCount":40,"unpackedSize":506617,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7k81CRA9TVsSAnZWagAAuQoP/0gO539fJmkYHkDyDakC\n3j/1sSB7GBfOQZB8E9TBbm9WeHR3sb6dAzCsGDlrYY6KZVWP/i4DBWbAvEzo\nL9uRKzqvCfYpWZ7RDZ7Q+L53wOyE+BP7YTcZBefpU9Z0+wCuAprsZk+c7kHq\np3YrNQ+w9qRZiW6QKeiBAxo3/8fP6hADNBOqJotoS4UMuDIGw/OvxGICDYX+\n1WWWhhTWTy/uM/YnohRQMG895N9IQkIvJzXt3Padng1oO6aXgMVMTYoknGNL\nICYzSQLeodY6TDsrEAQGtvpg2RFF1of5taPF0JCgNbBXswaOulm8Jc6uvCOs\nZda4W8KsRhCOerKJ60KVV++1UperHT0dIKKozLqRXmc/ueQXd0dikpe+SLd7\nUmiDx/R2caaU4MWEPkk3NqM+/cleeMz2jdEdezjeuJqcWWjVWi6ZXGUSOeCr\njsQRvdY1s6bHVS9iyOEmtcaawbkgkMm0wA27b2QYKS2Q2LdOnK9mBrDwgPPi\nbYsTBHE6xYCpBQtANnZS99d4u/6fgsc0KQYu3rrTtFvNq1wj9Zi4h48TP8Wo\nSq7rcIChXPzvn3rVDkADY1lTDJsTdMYpYHN3XttQ7Xfpvu9lwk+TWmNIvCwb\nsGrHTAijgytoZG9wfDT69+p8kWpl5D9eCrGwj0vMkttDnWyGyp8u4ToiJBdd\nKqnp\r\n=PhTz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBrJZqhkIAcqbWwdGvvhcOi37yPRosCxnnYuFgVr+JxmAiBN9CcnOXt2H5kBr2X9mfv3F4mcaJXy6i8G8mMvKb1bOQ=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.0.4_1559121716485_0.4201114719967689"},"_hasShrinkwrap":false},"1.0.5":{"name":"datahub-restful-core","version":"1.0.5","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/pegjs/sql.pegjs ./pegjs/core/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"3e129505b0f9b45edb1385558e0c0d305c63d37d","_id":"datahub-restful-core@1.0.5","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-EXcA1JPh1sfr4wYw/6iF7ICz8s4GP00Zn0QCQWAyvxcrGzpPx/h4Pp4DjO0C2pzwhOsbj2X/gOtj31HOsYZddw==","shasum":"2dc358eeaa57af0e51e7e22922790a0e7e38bb51","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.0.5.tgz","fileCount":40,"unpackedSize":506765,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7nADCRA9TVsSAnZWagAAMncP/220cE11uUyLjiJGQ6Ey\nsQ1E2p6rKl3FtdWBy5TlqSJ9zxpgS2jY1bpmPTMUlj9azWJhMtl+L168lATW\nyeLV0cFx/4IhbRFExCcYZreD40fsgUBdX/+wpJvhEvlKEO7v/lU5JeY6z4lG\nU/QhWmX+Cs8G1RBLveBJn6hZxElgPNYoQUkZJs3CV6ciHz56nKVW/AQi62+G\nAfdXZqemarpC71EtMwPxwuAVQQ/z7yQ0K2qnrZRV/whlrQD8iU9u4gg/b9oa\n2CP0tdy5frPsLNbDHK+DiUmbraDdBxD9Gj/hKT/G+kTGjPvRQ/lCONPtHfvB\nuRl8sfzshHvPLnEBf9A8t59iIwo13jo1hejc0UWIBtlVYIlE2OHzDjfGDDkq\nbbCpWV7xuHhNO+qopPOmns+71v93aOxcztomgC0uEep/MRNBiMy+vOMWvQCw\nP6F8CDbgn8nO+0mYmHUE2EmgivjzOJAgl1yvSqrckd1njcjARYzl0/geQ7ao\ni8gktVPMMKf1NkjeSOZZiMET9EK9a1FG1ELX+y9cOm2hPgiVR0R/I5ugznfw\n/tU2NsLZmI0D/EGtgNQI+f5ItX7IBb1aERZhZ5Da0a77vSQN+FwmMLgOfiU5\nB3UsZYlFSTrJ6liTggIzThPxLl9B934gufSVodec/bdveBgsQ7Pkw6/7KF/A\nxDqS\r\n=rIBM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICoAopV/j2YhiT9pQ3vkJuCsaTweEpAKIKa5bH4exRNlAiA8Wq0UoQvit1lT5W+3rr4l3ZAJQbvbTcte6uajtnHc5g=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.0.5_1559130113733_0.01437064947802158"},"_hasShrinkwrap":false},"1.0.6":{"name":"datahub-restful-core","version":"1.0.6","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/pegjs/sql.pegjs ./pegjs/core/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"6b32e82877b8fe29cf9b8d28a717ef4c33f95e3c","_id":"datahub-restful-core@1.0.6","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ccZ7v1FXv88Ou7za1YZ7hbrMEOxWHc4Qm7WjykKHwBwWNtf/QUlnxFW14ETRD30ytRn5b5j4c5c15jG614GlAw==","shasum":"31ac958a7acd186c0c806cbad0f1e1e99abbd9c9","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.0.6.tgz","fileCount":40,"unpackedSize":506882,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAIOaCRA9TVsSAnZWagAAt3wQAJLJEUsa/aTLRhsNrRmu\n3jOoNdNPrDoFIR/DMp6GjqCtCXlkB4XKKaJOq6OVpTKWEpDdz32GMlj4QcM0\nuR/IQDXpVf/MKSjYErrPxx6mh/16HMl9x3lRT7gum7bxGiXZziaWfHlqcZgt\ndNLKz4Hugfl5LzkGcI3onkgF7kWVWbnf+XRxfdGsfgx6CSn7FaKZAPNU59ER\nhT3J3m3lTT5zKgyPwAvhrtF6yj953V/HFCFXujuZZFn8Oxx9kH8vvcZqiGyi\n93VzBn8mnZTTMdhD8etJaGpMuW1i7pDg0B6jx1ayqP09yR4uDrKXX8Hslu9H\nPqcLDIzqiYFcsgT+HC9i2WMAF2D8hiy9tb0Th4fD7GKbcD7UDNKnn/QcHwaR\nB+gUwjFQ/JRwSUiCzunJdcp6biPdIdALK4a8S/jFQfUrkKu9N3gYp8M6rgOA\nNjVOw0hJ2U/1IiaGbZmc2Gz/91gY0JiI1l6heWq+iDIY729mfzVxNalidbmM\n9mqyQHUYCnQunHp2xm4qVqCGRLHJWOZorlebsqadupbR2wziQ9ULASqYjvBr\ncz/g2Ynukl2X8iIJtxjah1VKTkW4ABtev4hZCjzNhvuFCL84TU3WP2VGBgwJ\n9yOUDz27F9ETJSPnjCLzTGeRWvKjH8gBOQdN8zznucgl2EPG0xy5I4Eu4fMW\n454P\r\n=gMVO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFrqFeKcVXHARd+IYlGO1JMABQoxWvUjSQhILfkGykF+AiBBEB5UDTwhiPYmSqMStf3Z1O6UDKBvij2YsY+fCAXx6Q=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.0.6_1560314777633_0.4957528891498828"},"_hasShrinkwrap":false},"1.0.7":{"name":"datahub-restful-core","version":"1.0.7","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"92aff9df5de0e1b5feb80453d3ca06b91ea19836","_id":"datahub-restful-core@1.0.7","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-xwu57V4Q+OuFOM3NqZlvIV54/1Mw8a80xV+DsrPdE+NWctPjb0LBeFtRaaHZe7Lsmn6Sv3WIJssBqil/whSoUg==","shasum":"cc4739fcd746e98d482901d2664106e3bb811deb","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.0.7.tgz","fileCount":40,"unpackedSize":509401,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAKQ2CRA9TVsSAnZWagAArN8P/RXzY6T1VwtFfwKUIzHm\nwy+zYA8M4n8Wl5tdvjIKId37A/ZVh0bfGJwwD+1tKeMXPyD2RuWdqFm3GvtX\n30/KAbzqzb58sPkc4Nv7scZQVdPFIjxf9nTlwC7JdpWsfiG0TCp1ZtFZchfN\nhPe52+oy3/CEEIJRjJ0OoK6T9jy6uLdFWU0Ye051glOTkoXlh/c5vAGiVaFO\nyZXYJWgrzjH2JifpqfbPwfBV1vVLpGJZbZmFUWgGYXJtp2QKBpvYfojqSLg4\nCUQTpQ3Bzo7S5sqTedaKog39GPrN+UwUQV4kThRrZn9Xxps5DE7anCJs3Jeg\nWSagcKCy19ejfaA3e8ac9KSADjJMBvFdcnYhNw67BGJI/JlOfzMMvoLjdLEZ\ndB9TehVmW4Y3163UtoYXUeVkrQYjOLNi8qrLFKcBd+x6OPrUqEDAJAr5Rih8\n5rpygiCJZ6ivnXahWP017HxdMvu8xw4CfSKoi4mYT/xqkbiSs8iOX7qpZDWb\nX7hnz9OIp18lLpibTURn1++GOGKsylaG8e8ZvqTTcoQEypcmsu/t4i3H/ZgI\nLLfnfL8pI0z5kaZK2uTwAVSTXJO9XszcwwEps4FVkI4LY+6sUJytzlp6fuVG\nhJ9X0u5kUFGOw8FZ7agbt0/jru7NH0GVF7Cy2qiLCv+/TCgR5IZR34O5XjjZ\nhlhK\r\n=uJ76\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCnkKiSZW8UfN6UzBxlqTF9QjBfxfQtbRTZpY3yC1myuQIhAInHL1Q/H2U4bzPepqRb8TcNBHXflaLZ8DQxy7B5z2j+"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.0.7_1560323125912_0.2476011770970179"},"_hasShrinkwrap":false},"1.0.8":{"name":"datahub-restful-core","version":"1.0.8","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"7e326c6c47bc111d8e5b4f6f3ebf0ccf0de6c385","_id":"datahub-restful-core@1.0.8","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-UIgGzKnUgNiUkEnaZfFrw4MU1BrPB/FKa23K+5LGpmRs6xg27z5bDWGyoubwOAARnZq3AxwT6BYflj36zPhWjA==","shasum":"83e3d9b0ebf5006bc431340930ae841e971999af","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.0.8.tgz","fileCount":40,"unpackedSize":520307,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdW25CCRA9TVsSAnZWagAAkQMP/1/Pa3tLWyds34vtA0xG\n9bbMpgBvtrj9/3hGFlhENFzIijnfz4nqkU57+DgspTxNTm4pIYdQrOL3Ie5T\ns5n6kCY5Xye1RrBR7GjFoOYIZz/BRc7DfHYvkZq4j+EqhK5PMfEOhSutKKkU\nLBq1QJJYj80BIbtiy36w65djUj60XIwxqElaeyZT9odaxn8HFeMsp5lsoKQo\n2sJWYI9ANmH6o/nwQ+laLlOpxpiPoM0Djw5tl3OAMVdtlrD8vs2HtFe6m+rr\nDYO0rOFmY+dD2lYynkQpOGxv2xmM9NT80sdGerD7r5uzRofFxcns0tz8DhEN\ntvTYwdlCo9KR4Xns3ywrzevnLXtuUVYRZ7dL3tNUWzgX9bPWiv/5aDk6EZcs\nCqlDidJFFlHu4bW3947PdiiZOWt4/gY8FabZDa5U1CcECYjWG59xAMkpAN66\npHocmIryztA1SFW2nSN8eCcPf/DvRLpV5u7MTZ225moSQ7pZsCFPjBvQy9VN\n+vOMG5fjNmgDKKPbD5Hz0FNCeMgI0h6yPz+Fu1tBNGUWM6t0YhaEh0ZbvuHW\nw8dBWiTV1NDpp3tMltyWvqpZ7ck1rKFtheQcmREY6jcPayon24H/CwjGnciT\nhVsJFkQu/H6DzYI5DQi87x7/9OSivMUnvPOa3p4XrN9He5poHnKnODCeVqSD\nlmqz\r\n=Ie7Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDogXecGlcFS2hV4z6MQiUeZ1tLUac4wobRMQ2aGyknSQIhAO3Ff1+G2GHZWax1d/8Rmjz3EN//6WwlPgDHgt07mrtC"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.0.8_1566273090021_0.5814142115786776"},"_hasShrinkwrap":false},"1.0.9":{"name":"datahub-restful-core","version":"1.0.9","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"7e326c6c47bc111d8e5b4f6f3ebf0ccf0de6c385","_id":"datahub-restful-core@1.0.9","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-mRB142kcnKoVG+l4RbNr4AeKPy5ocFte1gdCBIKNBRC4NWY/MloDRsZwR3eUJLODPIsfaJlkQhTmamH3SGK0Fw==","shasum":"70a4987832db97511e6db8400321b6828880b6d6","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.0.9.tgz","fileCount":40,"unpackedSize":520790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcKzJCRA9TVsSAnZWagAA038P/RwHd5H+XDMZUpyendJI\nDOLF+HaaahdrD5Y4fE/dndv98UgSBkqNiZ5rB3Zj9E0a4sMgwh1Y8XEepWCZ\nBiOfgQxIRAxO066uj7gXzMBhswovKM9rfZgrw+OYR6otHLMkIBolWAmXn5kB\nKENZXt1EFCae3I2jA12dx9fW8GUqaWEKbbpQ/2gRpIjFoBlMSxrA0MOHSCiv\n+COhqNKrbBHkJTmGRXkAnFe6caXs/Nr/+BvhHUoYNlEDNcRdClXvMKZuEbLc\nwNdWMNmEoNh8tpYsgX9+hJ87agZZsc6Yy2Rr9vrymrIi2hvn7RsLUW4ON+Vu\nyGiIrpcDc7zrvO1vGETTEGhDz8NANkq/+4x2sKGJpTg1WSmUOhfroGRCt1La\np7/YlwYZRnKHGrbqHCc9E6geWfOmIJNSNxRxNBX4LfkWf9z6R1CF9IkcbPqO\nZzT+njzzMbwX+eJX4DDujaa6re35Q0tnmXe4c1nJ8nqRDpFhFVYXbioKthoh\nmJEI0mJCrV3/gug7LK5W3hKvY/QbXzSwjU01VlhDxPtXlPdK2NmISfA04ot5\nFecN5way8e+maQNs/INquD9VGx3/I2rLgPUwzLU8D9dQD7b8OJ19k56sD8wH\nhXYAf4CsOs9OF9+gMozmhz1ABZqGP+H4sUi0qYB1oILHTaCiSr+fuMW/OVfb\n7apl\r\n=2UVE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIArT9mfiVqXntV+WI0aYbQZ4pV0uWR+kjUX8ooGHyKxzAiEAtv2VKe8FvxNWUE0nza4mKATBX46rYBStjwNTFaVHKAk="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.0.9_1567665352525_0.937514512150929"},"_hasShrinkwrap":false},"1.1.0":{"name":"datahub-restful-core","version":"1.1.0","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.0","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"7d593751fb15eadba07579e6384cfc92c4b434cb","_id":"datahub-restful-core@1.1.0","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-FEH2A/ev+52PMnQ7yG0rR2/FNcaKawcQGCbBqsBneHuUJtCKfsftfIffP8c92dVYPVBjlWAbcu4uTU0R7SiLqg==","shasum":"0cbbff172ee12dd6150ea6d8740437fac1215f34","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.0.tgz","fileCount":40,"unpackedSize":520918,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcdf4CRA9TVsSAnZWagAAJ08P/Rv/zLIwQS4bkrMiF3Vl\n9R5mAVSuoz6+LCGxKrrEtcaoF88o3LhSL47fQ6NHblfCOlAhZzj7l1Uhe8D7\nSQffGO8PcskZgIaKJ8hXUunQxcgSka/9aipN8Roi6H4IzYdvUCyE+Wgh+sGy\nC2bdCHBZSO6dqqDCqkTtSFDr1GHcK6mwYBxCjR/ZyaPTJnaxv1VNZtP559F+\ncOQ13mDoM2fLE99Gja89M4rTiGyo8WSANs1itYxFSY0S9VvsJzSfbKfo5G+v\ng0Ns2I2aoQcVzvvfv8eJMiUVAw6Wck5y5LFksHiCd0321ScCTn1ojk+YpLhU\nDnSPc1MaUiTRrofXAB0dIJMiQ0YHt8K9c10yiIf1TiS9k5xHi4TV+PG6xeMM\nuc9U0S24wDwBNwR2r3CXyO7BfBjcAiIVC9rIo2dKsxKOpnno/W1YZBBUAsJZ\nZn8V91E+aHR+gRHvDy5CmI7oKKG445yI3p2Dmc3wHjzMPi+xMfJuXjJhg4z0\nIdjk9+Oue9jxE+VFWGxGAlxv/Ir1dXrz3IV9IgEerjt+/cofe5uEJoKeCTKY\ncWHTU0UB3uWakAqDkEEXUwh9VDBa1ZzgV/+CIEg17zeEWSGKBiklC3nf+iJC\ngIz/rczf79dxYMGYkAD5m7DCMe0Fh+iE1YlNFajG3uuwtuyNgGJ4MwqDLFfj\ns94i\r\n=sPz9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDrRAQ7WeA/1oppsyv8ewpPzeFco2AQIHRdo7LfToUp4AIhAJr+9f9kbGXVniDJ4eh5g5wEbz/voPiNY3ZsAIxm+l+d"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.0_1567741943448_0.27686690130171243"},"_hasShrinkwrap":false},"1.1.1-beta":{"name":"datahub-restful-core","version":"1.1.1-beta","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"7d593751fb15eadba07579e6384cfc92c4b434cb","_id":"datahub-restful-core@1.1.1-beta","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-wy7Sc5VwHqAJouevP4Ut7porAXyWLOu5EYxnc1Oq8br3NbwIXy68XntJKihxeWzggD+pAbQ7V1aHwL2SJ5mSQQ==","shasum":"0d13803a5bb193f039bb39deaa43d5dfc963670e","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.1-beta.tgz","fileCount":40,"unpackedSize":539096,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnGNACRA9TVsSAnZWagAAi2sP/0DA100Jaok8dwniZW4v\nr07uIY8sNOqeeADzI8GVBT3cm8dzdAhPbzBI9feIGMr0JBR1RVkapA2fwa7S\ne1WR0ajHlZmm9JsoJFaaWLz18UAAvj+cU6UNUCxLwWfVrY3kcr/ecE0MYPCT\nogZEux7NxeiuGwCy0ljTjNnWG5Ti3cNzgEYBFOqVwaMiOlrOW+cEadUMTqVd\nMFG7fTWVklF8tiRGVbiTJSD+waOVz5GHXapMSZOVs1iJF/1Do7VBHL0GVo7M\nWGmrT3lLTCEkbCppU1wWtQr45m+6sJlKWxXfctU7vn9RISyq/BvlXsqrV+zA\nvRgaEB4OSpuCq1+f1mZAhgxIU/Saihv5eMsxhE6kHo0qBQuOqekCVLt2u5LC\n95IFv6NaQiqnNO2tiKifq6kNpI0ejQHXdbhOmUz0NIFzpvugUdhTGYNhXecL\nwVDzyc+9s/R/f2k5UnBoG2j8z32HyV3ZBfRwLaexKzUCKl0nkbEadQlLo8gp\nUbxRiizP4pWYggB2J/TQhJKijortOxGn//zou/49C3VTpQEVyk9bvMclze9d\ngHH7cCfUBlQhWHd3QRS2d6yi8X20noKL9s3AnV6vwSdVXxjmXR4SELfVPGQ9\nvYT3d+WHJms/iktEcn+mb72oCG68KMActTDBjWjh60ESRR2/eid5Eg4qRBCd\nKkFo\r\n=/Dpm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDHWQzI7HOJix9ymlz5CjuXOnM0D03QnmzyYyNO8I5HQgIgLyXHKJq5idythQxAZwXI6+lNiAqF9VcRnH2FhkQtjpE="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.1-beta_1570530111543_0.6820468352065023"},"_hasShrinkwrap":false},"1.1.1-beta2":{"name":"datahub-restful-core","version":"1.1.1-beta2","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"7d593751fb15eadba07579e6384cfc92c4b434cb","_id":"datahub-restful-core@1.1.1-beta2","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-mjtTtR94+GdGVXGPxnqpnU+jjiknWO3apoeyKjWPSe+a788xBz7tqmOgUCsi0W/jWmouQ/YFyUVM05XTsq/1Tg==","shasum":"ada27a77454113e00dbfb240ae2be0226603e45e","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.1-beta2.tgz","fileCount":40,"unpackedSize":539139,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnHFgCRA9TVsSAnZWagAAyosP/iYUpvDM1C/wfblTwfRO\nNkyU4pr3itNTPsz+4ptdWuv18L6d38igGEJxgj+oBgBV7pCCAfFvWxpcBTj3\nYPhlBibQEHSbumSRVAjhopVuc8BbVuJONm65IRnpA/MeSnneF086r28AZ0ok\nyul2vGo+eymfI3rePWj9kI1eM/fATKEv8GEyP6FnwDv3dFDLy55m3v0YLXYE\nLOEcEhF3UamFm1WAJAm4CeBGvehChFxJXKdU77rOO+lLQ9phkq1QJ4/buUKA\ntYk1cl2D9qohmVzfNdQG9+DERCyFSyxbmmE50/CnoyME0ZmEUSIY9We0znmL\nIrgNvoQxEC2Lvyi0Hp+49kNGpuOfwrBY4H/trQwYXPCjK2lwpl1E+Drwc/kD\n/zrMp1j6S7E5g0C5UCXmnq0YVJuW/AhLWxIfdrQc78PirhbOK4XxBLX18nRq\nMGXxdDnKb6Xs6N3Sn1URYOzspgJhNWoybPY1hlwgiI5JVMWzVP/Wy/dGcpOb\nRAMRojGCKR7J2svjCOTHcPOK4ldrapZZdxtSJxTnlLQi5HwRg0tsQIjcuaZJ\nGMQ2eOtHOos+GSq/ZTlLOPpaEaIUB/1b9/41vWjHQN+6t+W09Xk955j+R92Y\ndgimDil4jDwVtpdRUopuN6TbKr5D1RFMxcjGid0ctwwAPWSPW62TjvxOgoJF\niy/V\r\n=0grG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbYH2hgw724PrIiSiCj8jamgrAh4DOHbq/1JhEYd65PQIhAOPyZn/L2JsXxv9KQ81pZMF49cnKQ4vN2cPfXcPkzaHT"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.1-beta2_1570533727811_0.22467746436737435"},"_hasShrinkwrap":false},"1.1.1-beta3":{"name":"datahub-restful-core","version":"1.1.1-beta3","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"7d593751fb15eadba07579e6384cfc92c4b434cb","_id":"datahub-restful-core@1.1.1-beta3","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-oxZQVW7L1oZiGzsT6QdlWKqtJaONsz9mwoVtGbfg8KN3bXFcXI0Kx3I7dt+ghrQrOpSBPSDvpR/VxivToOl3Tg==","shasum":"1b9b0e04a3017ea4fe3e3a6cba6ddd0e744164fb","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.1-beta3.tgz","fileCount":40,"unpackedSize":539137,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnH6ZCRA9TVsSAnZWagAAugcP/iJ0x66SaUkfM+/xTg++\nBBnZ2SJGE58EkjerKKh64yMrkkpOA467KW9J7q+xEtce4wqZtnpCvnSBNdnQ\nfS3jCoz8qaTtiPyHGm4cbJe/KC12XcRqZgDAs/df1iDYN2VItTPVyIY/OB1K\nbcujTVp6YlIm/LF+nQC6q2Q6TKjbTBk1OKMvMGE/pQeerYUjWbH9t2gK9O9W\nzIX/UV9a/G6UdpKpo0s8hyfyByODeFFfdxw/C/SS6iKIFbqjVHEP1G96KUB4\n+kVDCwOzXFFBnB6WGOuid0uKACCgTljXkPW5JVe7JClNsaDP4RZjcev73u2/\nXlfe71D1oa4Op6fyzAcR8sSyC8OHMjF7LK417EWPyySl6haJzoEw6AvBQvHK\nu42NaqiHO5bsGyiyUFhVK/mb59kUY/tnTV55Gr4jzoYmQkG3oxiRhEODGsXP\n3uPYJ381WKe1rOwTGzn2zjz9rXQU76BK8QLlLl8mFSyhTjIpVwOcwx4kxu4E\nTNNq1IHiJ+DFqMniYJmClLnS2rhlHBgTCP92PQxNF4lfjEs+zwijJ0yLzT0W\ntcZwDQfSBwut2MceJzqV/8rxkEJ0n+AMwQiQ6frvHFCpeAnxQabHOiCjFg6G\ng+Yv7j8HYmwNlFSZVb3/E8cWS+6wve0QMt5XxnIviqofbrGHqczBD8HVQK23\nxbWW\r\n=xdRX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAOEEsASG9vFNA5PiTotqRpzJOLO9XOt5y/vyO5M9iRDAiBulT3rgGdd40iwIkovtaq3G8suI1mI43vzaBpH7YKbOA=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.1-beta3_1570537112320_0.6970721525315158"},"_hasShrinkwrap":false},"1.1.1-beta4":{"name":"datahub-restful-core","version":"1.1.1-beta4","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"7d593751fb15eadba07579e6384cfc92c4b434cb","_id":"datahub-restful-core@1.1.1-beta4","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-/NLuwv98t04pbc4NQD7NZbMyR1ofaa3FnJB1SdnzW79Cu4EaKAiZXTxslgCzXAZ71SttIyCbwbFXEovD+qKadA==","shasum":"55b00ff42081c45e8677dd2a5f6da9615f234828","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.1-beta4.tgz","fileCount":40,"unpackedSize":539214,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnX3ECRA9TVsSAnZWagAANggP/jLHYg1Gt3G6ty0BGKC2\n8yAs2VuvsHpI6i748RcZqA9wbzMYhM9Ri4CJvj29lDMQD116iA+nrLYlGNAe\nrGwn+Utp+yhZLWFYXR3iroyq4niEjAKOeByeNssyrSv+IOQsLcib1PAp8QDC\nrh+QofgumTyI7RkTMIUnFU2TjTquBMgben7S6VGCCEyafxmTAdAOyC90EMge\nqBRcW0wwXkIuMXIPVLRri802hBTJfhUkfKJ3EkZKoSnLDdc9dEFC3wYUxEQO\nwFTmVWwYQSRVX3bQEbpk6npS6Cc+9A0uMPB2BmaCV7cOmEPaWVSl94y7JJY5\nEpQ6vuE7kx+YrwtAeLFyBrkovcLUT1stXborhYiPXxNjmwDXJjIkkCAt5SaD\nePM0UKzpdt9h3vAntyNO729NNMMe9RD/34+KTHqI/MnMWML6Lpd0RtbzAtU7\naS66xIM198pSSLLmLJjxeZkaqVd6hMZhPyr7ALsYnabD6NxLCyJoKNTGvQH/\nHyhF5b/AZLOV6LM9rCRKRnhu+ARK+Vq7sNf3XqvlWuLb9tYg1mH/5iQbB/43\n6AxYjP4chG1g7wqbWQxrB9EgFDnBS2dhd9n5mPMGwsP0oXqvzOBB9ES66Yg5\nUF5cOEVf5mSDqbPRK74KDiioiHbpm/onR/y0HcbG4J5LgG7dzx+46Bw3lBIb\nkA5l\r\n=VuzL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYV6Drv5ltT9/eIZnZ5uZ7EdFqarNw6GGT+7JarhUIgAIhAJNIJwc6SLxZwP3kJepGRU2NCwyikKtyw4SihIXrV3ZZ"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.1-beta4_1570602436055_0.9756417103179869"},"_hasShrinkwrap":false},"1.1.1-beta5":{"name":"datahub-restful-core","version":"1.1.1-beta5","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"7d593751fb15eadba07579e6384cfc92c4b434cb","_id":"datahub-restful-core@1.1.1-beta5","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-SgkUmXLY8budjGahdXYUnHDB+gso0QBXoi10xxu0cf4MMl95VmfQxe5/+c+wDV0Qr832W1ukSnwGL0yLO2pncQ==","shasum":"d74bc7dd7ac499e9f07b8bf538085546204b30d5","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.1-beta5.tgz","fileCount":40,"unpackedSize":539394,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnZ/kCRA9TVsSAnZWagAAIQ8P/iX+ygeoqWjYYVTKP6QA\nL8O+e2Iq3CgMkJTviXRKoJrtgtByk6HklzBjUUxaggF1iQh9/Lfmu/gyCgwh\ncBK+0BG576hnL8NZtt0rAp0TzeZ5qZIRNYBkLyuKGZG1GJDw3mNiaZW0A6wv\ns5QSXonuqA3p5ZaZobTwzSGfdaCk3r1LWW5oHj5f4Td81TqgChJA8zmGx9t/\nKbO/7eFYhkaKm8ym5IGg2NXr9lX+pVPRq9bwHPePuJFZ93j/yKHiQHwEui3l\ncNFSuVW5uSh85WYaC2UgTrIT7T/Q9Mi5xNbj7kr8vLSC6YV9PJReiyZGoQ8/\ntbaLIJ0K1pCS+DjUzs9uUdXKOwNUEA47HOATI8SdsNpm0yfpZYgLaOUO604j\ngsVKfsSPOxnKqwYpvAbRnoWUzhwRI2m+j1yfa4Pm1brCE45qugOmjenyaYcR\nOCXqUoRxUfcRamWD20bdOwAHEXXZ9EQY96qcwVg137XcTBijkePB+qkR1FbO\n9MibyztQE4MLy9S6zO84jGx8jUg6iz32cVmy5mTjHbw5r8GUDTyLpv1MVJgr\nNaLU8Crmp4UKBjfRZ039JXmcnziv4IE0umkQZHZjwbJgNqWYQgNDQ+1wLDMc\nEcBTquPjbTvij3IexJei7iPVYWKjP1/7cUfum25jNAYsLp5pt6X7YD1KNQhz\nws6O\r\n=ulOx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGo41c24C52WwWpEN88V8p9MNCRF+c6jAIthtpYs/dAbAiBCjbLL7OtO8tlFF7oZVi+gh+cp8ifBDXrx4mcK12Fchw=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.1-beta5_1570611172093_0.054942277204238055"},"_hasShrinkwrap":false},"1.1.1":{"name":"datahub-restful-core","version":"1.1.1","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"f2a4d556e6cff30f38668c0001b504740faf5a73","_id":"datahub-restful-core@1.1.1","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-ez9NifMn/3K0s3C+ipo5977k11Qy+RHJMf4F/uAvpD7hZjpvP/LHN+dC34/l8WoOnd0uE0YvQweKLpGK47bbGA==","shasum":"9136ed95b564d130c132cb2cf6ec57474b4024a4","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.1.tgz","fileCount":40,"unpackedSize":539376,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnqgpCRA9TVsSAnZWagAAoM0QAIEW3jnDKQzI02O3Rv+K\n10gWX2eVGlod1Fkwm/Tth0BDY0QlA9qtZsfYwANrDI9Pc6Q9xmgomFELbwCN\nfMRmWHzLDTRmNng4U5Rn3u7vhhMAHY7wlj49K++/lw/G4wklgzURY0bsm/ck\nqEi90ZxT/fYz+2fLJY2Avu186qpvSY49d5TEMQqpVa9nyJaRSbb3axbJ5CNg\nf4mpJb/keFRathTeRlzcREpU892BKDV0BXCm7kUlckvq5/8n8Vqw/NHl4UXj\nhEtf2gPxb72/IFtAKzFHJihFvBgBYLh+OgeXYYQ69qhtc5wF2hYTR2rLTWdD\ngMTaSE7ueq7bokwe08CENo3r/1zLC0ZBkxwGsdCHsoic2QBnHCJl+DUzqkrx\nk+dR2jQ4eYtyrbQ4U4HBp3ntH/GJwizjmJEmd2THxoEj4FqMz7xuVMkIp61u\nLYqMD4ibdGHnM3zgcu1uVflt7cNwHYmL/lsmr0D/dmrMBSDPKEMYNPljccCv\nkxBsABLZNjSmUaDNrWSJ4sU/7wA+5AdwKijFApB1y27oR3lLDwqedFCdpEgy\nvlgdn4jCBryAyr7rHsheFI1mwyxlvLO60M31l4idl1L3cUgDaMsKuSEg7QA+\nSj71kkNKmWw1HZhrPH0rmi8T1LIk6uGNYCc4NFTy6Yv4bYGLkqNp17EVoTC8\nfnr4\r\n=YyJ1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC3o5jKNH9S0kT4LixhHfoqEl0i7cr2nj/3L60nod0ZqQIhAM6mV++lyRDRwwscRfu1mOJa2EezQozLkzfjrURK4fGm"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.1_1570678824704_0.5919054434407625"},"_hasShrinkwrap":false},"1.1.2":{"name":"datahub-restful-core","version":"1.1.2","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"f2a4d556e6cff30f38668c0001b504740faf5a73","_id":"datahub-restful-core@1.1.2","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-KDeTWj2g7NUAdaagQPs5uZl63UiKCg0pfKyW+z8fZIvt52+znrVCsqftLuqYj/3LosrEqqGpdsQujeXwAFa4BQ==","shasum":"325618013753b77a24ae3e12e2b4bd595a32495f","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.2.tgz","fileCount":40,"unpackedSize":539533,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdntyKCRA9TVsSAnZWagAAN/EP/0hKlm20t2qBvf+ORY2Z\n5ZnzoXMTUPZywBrgxBO/S33iA9L6bOWi6KSTZaumjx0WyqLVoeDMxD6uhZVt\nA50rnodAH7Bx6/EFk7NV7bFIgdyqCaJQ7tNzfwB8A06QUGwKv76D9/b7kr4G\nZeU/gj8K3Sbv04u/usFDmNXH8OYKLQ43aLzXDIrCAW6zJtiWZtjNcygnhz5b\nmM+8uNZTMMm0Kc2BK9vq231Ez7qK1QljYK9cu1xo8wnJ6XOao68wLuwxQLLY\n0EnDkEupUPYnwf32KlyaET/y8w9ePn0/n82sqQEWEmk3bGIY1SFE2QVQdPUU\nsYKtrcIcCLSaXV0JKFNQKmV2eJCoxwNRiTAvUdBYo+zjaV3iPk9U74PDDewQ\nhSIvmERVhPo7p9KFAHrNenaT/5BeoKqPmgO7vBbCtgpnoKODqsth37n96w7P\nUShrX1PFOLeRWNqx99YjqMmgiHaKCpAmagfr2PGJ6iMmeWJltlnCOEAGwqwk\n2/ZOqUns4pJQYYBmEjYsDb1g6SV3Wwubn6TZq+2SHmOIpB4PxsNDIU1DWBDm\nW0ExM+S4Ex/mDrnpeL1Ugb5JtJcGnTIq6/CiB8ag3EZueLgSDc2eV3DkH8cA\nPEg+VcjZU+Oj7fNUkWFidO2YerT4wAPDUQqW+OwptU3pcSKXcIzjOToX6A5I\nRppQ\r\n=IjwC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBkt3bpTlLgG5+ydiqrxWHsdP7BAxGa+EMxTIUFZPna7AiAVcABvuRhvUTKRJcoW2TkmCOag7W0HUaJX4agHkrT1OA=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.2_1570692233341_0.13050476822506263"},"_hasShrinkwrap":false},"1.1.3":{"name":"datahub-restful-core","version":"1.1.3","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"7fa0efa9bf0915606b508b8054c9e9742ec3d7cf","_id":"datahub-restful-core@1.1.3","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-UHAspV7gkGFElp9luB4bw+3brfJELGDyDchNBgXuBwnzmk7YMQtDc+ej0FDz7Qtv4vnBHL2gjbvfV1sToOWpDQ==","shasum":"e1562a616d1130a3c4842cd0253987523b71e8b4","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.3.tgz","fileCount":40,"unpackedSize":538761,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnyupCRA9TVsSAnZWagAAdowP/0plngSpUNai0G7mtlbi\np6j3vLRtUa05sIo/kK/7fLGZa4E4qgDmzfu+RbsjlPggZpUCeQBNcckwywVh\nAeCImT/BZjQhmvWD5Fp0+q6xK1iI87iXtVOBAT/8sRz71F8rJuBBVOY7oz75\ne3ds6aC3TIOSm0adX8P2edLLwZ15NcEvfH2GLe9c0NgcVV0Tu2g7U6NLQdmI\nWdIVkCXh/eKLQoisCTPqk+FX7fWoIIyAAbs0Wqg0cCeUEsEFHUTrYv5+hXv9\nu/tIw/8C161oyaTYwUb95Ttf76ki6cMYDI4MfZRdDLOBeNgJEdXzpQMfHEby\nzwOJl4kWo4QIQqGQE+xR/oW1ZypJkWItrXtoMdugoWg0GWb/SE8lo5LxmC5y\nqZcep1o8JVW4NQqBsQqFzhuVdzistOE8t0u3Nljlgz/3AeRiYTAiQNyzCvER\nHtb36HZw+JTz85jrHFF8i/klieHJmaRkMDyn+1v0PWvylibRoTAWI6DsIwQ6\nixOmfu1Y6WywqimsBqr6PvNs5G49GDCDF4HoJTSOU6Vo23BSkxmytkkQ01aQ\npIXE95v+2lBcJqg+BbakSUjTWlye0c4ix87zfGZEUeZwW+Ro+o7QyDMDp5Y2\nC58QaWgCsnJ7ZeEughIYZMSiLr2633V2X48SVC9o6zBZvys066eyvyuueNbL\nNRpt\r\n=t7Cn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpe/u/uyIoXHD9EvK4cu5pZjAW/0sNdCeMEX8WSd5NUwIhAJwA3t6I+2reunwWd5aiSOH/5ja9oinRbinK9UTsIgSc"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.3_1570712488446_0.9263393570925678"},"_hasShrinkwrap":false},"1.1.4":{"name":"datahub-restful-core","version":"1.1.4","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"16dac2bb8f807168bee08a96357c7338a737c04c","_id":"datahub-restful-core@1.1.4","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-c+LrreNkCgsX4AG/zoP1tteJNQFlxIE/Waok01E8b+BCaMTMuulS90ZrjakE9v4g921rZ+5N0xbvX5rXpPLJRQ==","shasum":"da4f0fa12eb98358e4323612be483af1aae165ab","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.4.tgz","fileCount":40,"unpackedSize":539169,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdpFSMCRA9TVsSAnZWagAARiEQAJfYngBEzbjL8jat8adk\nqJVhx7hyp/gU4DcY9VTCwXknjuicEYDgItGjwsUVEnXUeKpccbNlJCE+8HLi\n5zoFyOUg9WQ36OCFkSDMvn+Y62fS1uBYRh0xoG3M7Y0QqcZujoBZW2fRUyNf\nwVTtpV+n/0VWaHD9s2bsQRYqxnGIDqrr/DAX8fcC1lJpjnfslqoGTS5hC+yr\nnCT7LDCZmrWWmOs0b5g9t9ef0qylC/CybkzJueM5Dm4h16EaisXpRPlqIZ5J\nIdbZupe6QNDGidBvsORfqIlcxDELEb2EH2nOlCUetVHk9vPY9hQMCzz18gvS\nwg4V9/Wa+Ou3DVH3BVAk5O7km7mv1aPJNJahjf/aBLNu74tJ9ZcjRxawNfzA\n8RJLQO9EW1d7FVKSwgPfwOZySBCnv+9mqOLrVFfzbPNcFupAH7RdFatstatu\nHbB7UviQG26+89bdu9oFiZEexrZu8jdfseYYn66or3Zs2IagzTzLDlC2aVaX\n4rV/u2a4IqXHr6VhIIP6LhffVBxKXcGIfwNAPlE017QsF5oyi+9huWV/XYZz\nuOYO0Eg+5NTO9A3wDnWIE9iBhoG2KKsRIFXDxUIpk5TTacC3JkC3MaEZDL0j\nHaacFgu7IfxfiIbj4OBSi5DjIkZG2kiZfcYTx+5NuVdQCdNHHp4hQzAKLdkp\nD1Yr\r\n=iPoi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDni04+kVvx4F3VmY+TbJRtj0Acw3O8z5mb9UBK02N5vAIhAM0xLLwmIsegcZNpKRGaBu1m+hm+K4VHdhE3OeVqErBt"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.4_1571050635818_0.9528265386040704"},"_hasShrinkwrap":false},"1.1.5-beta":{"name":"datahub-restful-core","version":"1.1.5-beta","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"d10c16f210769585c78774a4eae9d33284d6a54b","_id":"datahub-restful-core@1.1.5-beta","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-XYJ3qJMI40EZ5ftblTNrigSl7Rmc0/HLqRrCTP2Ls/ZiBXOeWLK75ol4Jwlz1Ie2K/HaMUbuCbxmo33omdsNow==","shasum":"ed5e4bb0281636d26add99647dd0fc1c59e416de","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.5-beta.tgz","fileCount":40,"unpackedSize":540005,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdpUVbCRA9TVsSAnZWagAA5CgP/2FGKvcTar47oXxPrzlp\nwSPipbDuTouu/RfS0wEOd+YtiPmlRj8xvuNuo9yTURR8hPEf/oqnll0A+dcd\n90eWq4rPVRFTkCqmXze+fbicd69ngGSZ1CSaJSjNOAVFbD7VYl8uNkClwwJT\nimXeYDKCqRpBcT5DHY9VdoXsVfD9emqbuRH5fKBz0ZLLlP3jbgocYRVh74gY\nask7TODJ5ewT6pylkB65j2BgqdGEmg2V2Hkt1t9WiZfOoGQe9iYPVN3cci6+\nNdGtBIKXKJfp2556Y0weJLJu8Se/giFYacGBtU4UJtCBlTJJm4FrI4awCeDT\nvzzlyKDWc1AYF5RikKmeeNaWf3KqKi5LcU3BwIdHpwHhJIBOXTZIaHT3TYTA\newXmJpBcXaJ5JjXuLFGp62pSlaXML+604ajJ4gTc2OAU+WEq6BpOx0oc3cyZ\nOHeSK1wJxAwvJEuwc2H3NDfoL2iVRHV8RkVbWhzFrkoGoebXwRi4bEtE3/8w\nLZZaLN4siJMNhiZsu3PfRWxXcDoTDnAyJc/8NklZPgDToYvBRV6ANSkNTPLb\neZx5Cl0zmS3R7F5XI8DGCakNO1V9PXu7acKMm0CHs5kr4SufjFbs1a3O4ng0\nMM1I05X561VdaiWV1I0DGUyXL4NZAs8ANmByBecE5G/61RDwxee5eeTa6BmU\nmhSD\r\n=0+6k\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvtWq/WGULyfEFhcn7CdWauDZLjMa4vVzSOqV4rl5+OQIhALjsuwjsRko6lNS0PT4Gm0tSjG+kccKATg7mkIN8H+LT"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.5-beta_1571112282404_0.129551021115333"},"_hasShrinkwrap":false},"1.1.5-beta2":{"name":"datahub-restful-core","version":"1.1.5-beta2","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"d10c16f210769585c78774a4eae9d33284d6a54b","_id":"datahub-restful-core@1.1.5-beta2","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-BfrgpD9vjz9QCTNYBfGV8yJAS1HuyE6RGKCnWYR4bIG//DnWgBAtTdRct0n8aW2BFWyIVrg+5coMCrxXsLBgAQ==","shasum":"c99fcab2d84e98bc4731bb9cf4a665bcc1159146","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.5-beta2.tgz","fileCount":40,"unpackedSize":540555,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdpXjjCRA9TVsSAnZWagAAIOIP/iCQX0sknCSCrmCWMxPW\nKqqMpOG+Gnx2UudBOA1x0OP+AnNscR1GnjqAljucxw+wrdFGk9aRlOVH5vDC\nTjy4rbHZdpEzdxgs4CRQDsB/ndNU+kD7VluFEcjGSVppIPXSxz/MMPg/hl+9\nt1g3YLVnHSp7qeG/knOOEymjAbHpHnxoxSKXd9n422PsPqIc7YJSsqw0DXWq\njquZ1cSiJSp7xG4MTxuvHnxiz6eG0w8czxAfxIPUL/zIbbTU/3FCI7LZXW4m\nOTWjIVrsb6/3fbFS+LlTKO9dUCuiukWSy+/urigEkMoAO9yyghd2xBKWIjDw\nlsfElJfD1TYANRprnQeJiZuq6nVXr8ImaysbEDuaDjUGdOmWq4vBKTx5pYOd\nDwkFOxjjLDKpfDlAK79JmeyMaIHHtv4xtr+y3UBYcRTJ4XC3lhFq7S26LASi\nB7Kp8lfWYnFwCkfXb99NOQzBVgrDRJITGgax8wyUe6z/n5e8AcIgxSyDqeu4\nGA3UAzi8i8nrthHNJK2AxEpX+xOFuGASqruDDEWCRhX5+sRyH+PI6/w9Gf94\nADqZEFvqG/ftjfxU/lXXjFybOx1tfClM708NCj2Rr3bHtj0ndcN8CAj2QXep\nBh844hEA7Krra/omiuQ/HlEezgBBk97Ja8M87Ik/f6Krp6BkKy0nJFJRHEW/\n4Ccf\r\n=9cqy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBUqDdF/uvCRnPkGpYD9bNxe/diyInGRl9rKDJGsNTO/AiATLs4RzCMHZHrW5TH0D/v3feZkRHXuLrSD2Aa9I8/jHw=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.5-beta2_1571125474759_0.8152181102976537"},"_hasShrinkwrap":false},"1.1.5":{"name":"datahub-restful-core","version":"1.1.5","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"d10c16f210769585c78774a4eae9d33284d6a54b","_id":"datahub-restful-core@1.1.5","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-OtYOCpjUSZqWtSNnAb59VZmS7thYH9nWWkf7HkXCFATSWpQXbMxyCKThp4aK17CS1B4luBbaLTAOyTCUo12cug==","shasum":"946aa6d451867503dc61a3b0364af79932b25c00","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.5.tgz","fileCount":40,"unpackedSize":540550,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdpYAeCRA9TVsSAnZWagAAuNkP/0+wHzjXTmmF8MoPv+ub\nu+Jg4+ZNItwBuYs3JMy7wtr1S1mcX5zrY4R9kN/CAT5e9QKrj2JYzQTbUlBZ\n3RyMOGvc/qVJBopsr1fdouusapWc6vgdsSxa+aGRE7fzZIxvt+MeHwTds74S\nJURPbSkGxCF1am9CpGSFE0Ihjo1PqRKI7JoXIIMcUuUssrXsdWxn17LUIbtW\nbZhTeiqN1WaTgqdJ/SFBuu45ryzWg7LLCtd6KiQ0amo7/LizXZ8mXzjme3nO\nZ0QjFuDmrTYTGPtYiwcGoFSqYO0dfLtQZILk3/RHF0WUqPsaJ2KUWDqVM/uO\nqBZHRZdb4B1yg2eurCcOJFcqZ0qmt9uszRch2LaNVp7jIjMl3oMf4sky5klB\nLs4kXyWIQsfuqRTCfBLrBzQ5Xjv1ljhx6x5cxvEEZU8RVyximAGy95tfmgSY\nEH1omyrj2FHpV8tVcKQb7QbZo+1T9IeqCwWyf1vUH/OIZAiNraZy4WVmodgU\nadg+ogM9HjmnC7cm+R8a1p5hiFVGZHmOvJHx9uuOa7h3NbxnEhHAfXvEXbqy\naFMyM1IeKGGzQqZmkaZQNZyb+ccMZeKY2/IKRI2PM3kErSmz/uYxQRsX8qNQ\nGfbMopsTPiX0pnoOFWQHVeaidU8UtQmqceyeXdtuik+QfQzaIDOoY1PVxKhQ\nkgYt\r\n=dst0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCW6ITafzqpDm2aO/JF/WO6JtuYZKC0C11gfvdTceNzGgIhAPP57XibA6eKaXfulUBLZsH6wmpJ3wrmmu8cKJSTYZ0m"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.5_1571127326224_0.8365610015370575"},"_hasShrinkwrap":false},"1.1.6":{"name":"datahub-restful-core","version":"1.1.6","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"bf7bbf30f951ef52b0069d9f27cdf6203517b27a","_id":"datahub-restful-core@1.1.6","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-Ipo9qzmACG5YrO7h8NEkgEjYLBbqJGxaMTFrlqdlhlowXDZh2yMtS5SJyVQiqLVbdB3eyL//2Q4RiOQMF0kjbA==","shasum":"df19f4d6f2a87ce68ae693c3d208d6a29c3321b0","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.6.tgz","fileCount":40,"unpackedSize":540552,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdqS1+CRA9TVsSAnZWagAAGmkP/A/8mr2j0jJvwKmdn9O0\n09KHKxTU5CEFPMsH6hAzW5eUGslgQPH6Bto4fXrYwfG/WYRAanxzw+nAfAWM\nyTS47q2TPBa3nSJdsafQsYFQvdwSjC6ZO9rCio6V5bKbiVEutRkn7amYzn2B\nqfhI9H8jYGUczRcnFiZPj4/djB7frKf8DseHfCQwM0MwV0z9LfgVZpN6STmf\n1OsNJF8Dalrl2dsDCOZWzH9sZf7vWNzuhm6z+GNVnBak/3kF8WZ1txp4xUR4\n96Hfif3fCDMwuZY5SH4nCoRnSOojEf8f7GwNyYJLvvxIiU34aPlvpheRR4jn\npu9ujVPMF82p8zRrXZGJjiNLPotjfR1MbMhHT+J2lxph3CDVjkYM294oCGxs\npymR2ZLWCABMjtm9RVIKNQuU+Cxz+wfKuKCNrnBs2xaeGwgy6pkSZYNuWFeH\nbKY/rjeNS9ye+K81d8z1F1xApoNT5sXz0DUn9yQ73EOOTmHwp/11cDtQFjxE\nDtXflbiOt6OtLU7MciWHA25L3ct/1gUAQ17/+Wf60VienTq0nm6dHQYU21xN\n6hptsNEjsrZskVZn+rqHEkFDdx7o5EwA0ZsWcvhVL8Vqzmg8rtUBBmXqf0wh\nIfc7oGvljz1Y0baHtaZHHiCOksAx6uZfRkH0KEXpmNEFo1KSeIx6DLjuaSoa\nZrZF\r\n=Qo7X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF8rNP1SFXw7NDsPzW/GxPyqI+R9AF5mTjCwRNzG6wnEAiBYv1eqcxXhumreUtYSj9W/JrlU7VFhah4JC76bpcVR5Q=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.6_1571368317514_0.09547702986788487"},"_hasShrinkwrap":false},"1.1.7-privilege1":{"name":"datahub-restful-core","version":"1.1.7-privilege1","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"830c766ba0a5793fdf4e3bf82290db7ca07074e9","_id":"datahub-restful-core@1.1.7-privilege1","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-t/goYN7lyID/CaR762hdwWKAK/RiJ9VgVa8j3f5s3k15/DsGMyt6QzbwK5aI17EpteQI0YEzWdHV+UvjOUc/mQ==","shasum":"31909bda4e833649bea2e9a5bcd326f73d99f229","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.7-privilege1.tgz","fileCount":41,"unpackedSize":545894,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrSDGCRA9TVsSAnZWagAAPSUP+wf/ysrkRA/rg7pB7Zqq\no9hA2W2nXeQqnbW0zzSrvaUJ+hArI941tyCBERcAjud69fo8+8+LN0+Ioc6n\nkUFTTo7GtDnWyCYPrfjm1OCoOkLJ2169B5w9KPQKT0JRd9l6dkwMbupIckRt\n4DMPUR+GSuHG44VEOanh69mrc3PLmxahycwR51K6+GiBwIIOzhScuwpKwGjr\nVPIRgppvLzgOAIUtfP3DqtZg2s1STbNGb3ae5OW6HgXh4EmLftbnZNYfuNkb\n/DJwZw/IBSs8JoLqlH+Q6DZi7jIKWpB90W4dWrPb26rD8dnDUh+yR4DgzYSF\n0un4yYRhDOBr5MJc5hJeZhnIJrS43PjJdYZff2sUsZ5h9N4DN0+MppIv9LWX\nIfeX3UWcBm5iIdttWCv1ne4B3O6mTjMq0Z9i0aYMjTlBDBmhRQlhzqwrCzXD\nyKBljVF0TnBS75QgiUvq5pGf68K0jG0sW7zzniFNRWO4JTIuUoHYRibiGHJH\nOBdx2Efo3fX3bbxcrys7mCmcEkAeFBz0IjF5eU8xcBmlXk5mtKlM0Fuj8PDp\nm8c3YiIZ6qS7+1RItvh49JQZ5+b65eMRlwvXbma9dy8uQYBoVRhiEMQozfWS\ndfoFJEWXZ3jhRFgBKSEFAFW0gkl2dePqO0XS/sQHgM3gHgFJjJC2LUNNQJ1r\nuXL9\r\n=8PPb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1H0C5ORLJcdS+xYb52+cWetf19WpW7xHjXHwUGPcDdQIgQa/K5HveRwUold8586edo1VjXIVnmwneS4FiRCzhyfY="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.7-privilege1_1571627205950_0.2880667203409022"},"_hasShrinkwrap":false},"1.1.7-privilege2":{"name":"datahub-restful-core","version":"1.1.7-privilege2","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"830c766ba0a5793fdf4e3bf82290db7ca07074e9","_id":"datahub-restful-core@1.1.7-privilege2","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-+53g4LO1Li2Ut6zhl83ev6gD/juHvpzs7y7e42WVhZy7kve3JUFlQ5W0n38wa3vphxuBrGUclQ8wOxHC9cdONA==","shasum":"0894acb52ac5cf5bf37a6452d7ab27797937cb7f","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.7-privilege2.tgz","fileCount":41,"unpackedSize":545892,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrSa4CRA9TVsSAnZWagAAAZoP/0tVj5BxhbE5Emz0/SO5\nBcvS0AtuI4c9y1csCINtpufG9qPMlNwGhW4cY9u0/eQlPIvYI1gWfqGA6Dav\nTkDuqTY4bcF/xbIZrxUiGci+JVYo69UAmE13bdRMyJQD/l8qhKq0S0E1B+aF\n1V3HkMH8oe5ap65LsAH1qPL8HLHV4l4h/zktL5xnm5aJWnO2kzSV7EStp7lL\nmcv1wQu4xb+B2Xo6kQekhpYnu16bj0gAcy8/t3Q61s81k8avoNu4lcHav7hm\nEX0Xo+GvLTtdSiZ9YPpweTo/H91wbCqu0/6cdouT0XZt++LdXRcLbDROTmpk\naKtxobwBu3FsPYF6id6ez3Au8eoeUoKOI8n1iELw7mpdNY8TBs19B852S9qz\nJFYeDTdICdI5GXVhOwDgrEI26gmuDgIBTQ2va/oNi3qxbxcBniSxERokMuYd\nt9ydHJZrj+GbYAYDSWhCslcArpCmZg3ScXn+URSWse4a5adp+J2h3XE16w7t\nGaDdFzGq10xGtAQh3GHEhkFoctAV7MkGKekqoy646lihf1A5DPlt7nCMCl6Q\n1hLosxzV+4e/G/vfRludIpeQ5MJOZYl61w/bd6ZaM7VN0lYBk6ob4bPsVhuh\nc5JJSotaqfF3T6oHoGnuT6sa0Ui5FNQIt+w6eyyFDeTjro2ttjq4Zx0jIliq\nWr8g\r\n=j1+/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBGWpbEie44JS80H3GAjeZn1clsY3CaMmrMwQoQQPcNKAiEAqWBFClNfEwkPGahdgUgKdzFIpDzH9wO83nHAacSxE6c="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.7-privilege2_1571628727997_0.2662203986412175"},"_hasShrinkwrap":false},"1.1.7-privilege3":{"name":"datahub-restful-core","version":"1.1.7-privilege3","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"830c766ba0a5793fdf4e3bf82290db7ca07074e9","_id":"datahub-restful-core@1.1.7-privilege3","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-ODnuuZdWTATkRcKMOFxbonWqStSkOrzS3tJxFvyoi98notqo8GCjy6ZqOoOG+Gv/SkIlgLeZud+pe9g4XirMUw==","shasum":"b811c166d9ecb341380c1eaea4964ec8b8d9112e","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.7-privilege3.tgz","fileCount":41,"unpackedSize":546265,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrVc7CRA9TVsSAnZWagAAJ04QAInBXZM98KXqeWhnFWur\ndhxLODVh+rs+MHECfXjEMxV1FYlxy1OnaqC+xx5MH0F5OYAxQ/e17pmZnn/Z\na3QOtF/v0T8faTnO01iHbbX3fUn/0OTzWK1fsZMEP+g5IXxF+uoJPRxSSK0I\nlDlshPL3Qi3nNBrxfsdvbhMkBxnQ0BewYCZZld655pxRiaqbN5Y9Zgz3R6vE\nwEPmhjcT8NdFQxSQhEUjCWPOID6L1ATAVkqejPtDDtpBFKzacnrRGBTUHsp9\n4H9SD8QBOKGiQPw6Nh9ijxvYh7ukbMlHfpTBLb6PbXmSoXNRPNBIEZ+pynGw\ni183sJvnkfHjK95xjFVOzbZc/HVDm0lAI7iERoYinIXSBRDEprXk/bBXODhZ\ngKu6Ow6UUuSMXIeB0DCm0uh6aRiOJwjtS8UNBJtCKuIijk1MsbgMy0JDq9w3\nI6bqNthn4xzG8ZX4aTxGhx4R1Wq4uA/xLbObw5feiYBfKkKnnrdSIYaLhbWQ\nGzPPUXrb5VVkpNsXVjJCTvPbA3z4Y8C4l0ptnj7L21F7PnbGpezQPkds94rH\nI4BajveuhsErVwCBhlDvkBX2S7quyeVNzP4/FYLueXd5Z0szakXjSa9BEmhQ\n9dM1b7RWq0OsA9YLiDoR9r5VRHrFHDq8Iqk3EZAcCj2lIYfsOil5HZXzNIct\n6sqH\r\n=0t3K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICrmGdTXCXCbROsC77UEeFL8LypFb45nN5k7Rv0EijzIAiBOyWtVAEkms+Huvllbke4sNz8j9sXBLDshGQiWwg+IKg=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.7-privilege3_1571641146546_0.8142092406280252"},"_hasShrinkwrap":false},"1.1.7-privilege4":{"name":"datahub-restful-core","version":"1.1.7-privilege4","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"830c766ba0a5793fdf4e3bf82290db7ca07074e9","_id":"datahub-restful-core@1.1.7-privilege4","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-wcw4z+mE8B+Tab0mxmUkSbM/dQGPL702mxnk0G1ulPgPAx/YReRVzRGz+We5ibcbiLPC22PszN2uiWfOJ6qYkA==","shasum":"935079a17bade274cb381078f1cdc54546f836a1","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.7-privilege4.tgz","fileCount":41,"unpackedSize":546302,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrWFpCRA9TVsSAnZWagAA7BQP+gPPi2m1PaXKZugv829H\nX3hzsF8TuF8soBGmML1hqdkIjCZfRjsftFeubeSpG8ZcTK4qOgnrdZZ5QJgD\njPhMVL1z0klHL+ra3Aohg3KmVKSOlrqzBNV8dVbFEOYksS9hAEVQmX412v01\nQAojcLedMmkvBgdluxlSKUwBOwsYJHf1eJDiuiYovy/vHdES4ND2NKvBLoHf\njeSW5eoPk2SQjFmuwFLrArqpEwY1LcnnWfCddlGDoOEBVxnsZMaErSh9Cfi1\nhU2SKb6x7aWJ56oFVex3UcU7PNwXe5fpcUqVAzFZlOHHT4Gs8/O2q+jvwXS2\n2W4l7kwH4NDz99tu+vX9EBbC57cIt2eA5hSqMVArG6T1wEdYimT5EXKx6fLG\nW/2bBCLWA/rh2+TfHF38piqHuDgKERAxYiCSgWqqrD5awzhwUPtl3jGMwJUE\nmCE0BbTHMz0I5buuiJgVHou72ikyjN+ly7E60pSyN4xLVisTWg4glYPWWdzM\n+QcZa3wjYbLpmF9emK7ammVLM+MvjHMphWw5r3z6NUGyIpTUrjbHhbTXhbPE\n5zPKkR3mP1en4pIGJlLPHChfc7wIi77fzZTAXSTJSxWqnL/UFhFGxy2t5W9w\ndl8oW8pvaoFUralC134GOZrdKlJNHW2YKWTEyXyU897pxMlRD5NwQUfDDXOL\npbov\r\n=75+k\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBrfTncyopo8m9lAFWCKvJXXu7PLuTFS3rQAZwX2aQN9AiEAt1hhWbvWPQdOngkgNufVmlljNce2v+JTOZRo7YBo3r0="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.7-privilege4_1571643752387_0.6626954535287108"},"_hasShrinkwrap":false},"1.1.7-privilege5":{"name":"datahub-restful-core","version":"1.1.7-privilege5","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"830c766ba0a5793fdf4e3bf82290db7ca07074e9","_id":"datahub-restful-core@1.1.7-privilege5","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-NzCGHBCACcpe8AeySrlIj0M6ru10R8+5Vp246eFB48SbFt8KRbVkQUnZYwSadRCTrpoH4qGK3229uVDTE/jmxA==","shasum":"adce34805f39577315ce45c5c4f40f8d568a52c3","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.7-privilege5.tgz","fileCount":41,"unpackedSize":546305,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrWaKCRA9TVsSAnZWagAAvc0P/izSh1sasIrzX7TFQD1G\nDXTUuFBPdaPvYvcbS83h1ISYuGjjgvvXymCodQeuLLjybb41EAMzhEb88YTP\njbm8ZqCTCLnK25g610wFzWw0Glsurz8qXVWmwnNFbwgoDDVvvRuQD4/NG+8r\nlLlcVax+qHzCcgF4awNRDe95/VmqycOB2yt/gHBwtNULamuFXjfq8BZPUBNh\nYCkiCkgYY/uloteCQUe3MKeefMMYYCAAvFxXN8yxKm+EDIMFzlI9eOLWe8RI\nRpDtULQQ9R4NXT5xRJb8F2de+apWdXxDmhMB1Fvf1uGFd2Wk4FT3sUioBXmS\ns6ffAeyZ79eQxpv9/F+CK/x/r5RvUCfjlY6s5gm9S2gkKyXSywDzaJ3BB8F6\nay3n45ZrRMchB+PpAQqeV+0BwmOrwaRcPKGbaJ5mSw558D9u8tZKXOk16ROa\nHIus9RcflNHEWgB0ArToxUP/qIy58HReh3izPkHOOlU/0A+QCnIGcHsDt+7k\nKpfmVGVf9btjvT3LS3QAbVHvFwmccg1YSx6RzQ0Xo9pv1wVWIiHfMYKn9A2F\n+KzLCaNeeCNaNXX/Ld9t20fCQgkKYrnhycRW86GPyMLTvflnmXwYaAA4vSs3\n+84Yb9PP9rKpV1ORTx9ffBE8MQyAYMgB4XcFf4B9wUE3KQDKH0K3IHFBMJW9\nAl8I\r\n=kIjK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDKQANWM4F25RqsxHr3cA1BcdmbLb8+TSas73bDnLuDVAiBvn7NRc8u/xSUfBPSO5rFij7OXMva1hI+O+Tent0BepQ=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.7-privilege5_1571645065855_0.4368032389480314"},"_hasShrinkwrap":false},"1.1.7-privilege6":{"name":"datahub-restful-core","version":"1.1.7-privilege6","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"830c766ba0a5793fdf4e3bf82290db7ca07074e9","_id":"datahub-restful-core@1.1.7-privilege6","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-Z2lX9n3u7//xInMgSADtdVJgAmqIoxuEewrNYxgkB0VrlnG99UY7VlPa7NmMdqPsA6kXruKrejKCvLpUeHZApA==","shasum":"199582b1f2d28240ad09cc610920a9616aa9fb03","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.7-privilege6.tgz","fileCount":41,"unpackedSize":546332,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrXQGCRA9TVsSAnZWagAAvt0P/j60SP3SBbVOZDAG264g\nPu5TEKDuGYghZAHkD/AOgAgPHeM1CGgpa8gkiVErro4B2dDbYGM8tDy7EcgM\nSLdAJldHkj/Edse4xvqn3NMh0SIawxhqfFdAFb5KRMPOItta6p8+YsxSt9PU\ndtXC8sxYqhyr0+FYaXSABtHwzOhT4nBjFrbnowZYOazK4LqDSv+QbB2kTJfI\n9njZSrjkhsU1pxW0kHQ4FmZC9juFJCHXMNehR9i9sCReYKxhlLK4eJkrwpsC\nF8nfimHsJ1EfFT+XOpLPCEvYxUWOxCKHNBOP6021UfSxzejAJ7nd0v4OOpIo\n71ukPVT+nFAPGbe2+sykgRXXFpNIwE/AHhogft/gHpFzESbuIxePa51Md+I/\nanTIvyAC7xehoYrAJegZOAo8uhSf6FnXJvKRvHkbFA2yITFxHPGjr2ej9c6F\n4ND/Eo62ZhtE9Cr32ZEX3JiF8GETgFMVisBlrOai1HRXMoZ51quEmYS1Qmuy\n4tQBA6Jis9dKuh3ra+/sy5BGOvKZdQK78xmHHmJA2qLMjozzUp6lnMmAWvYN\nS/ccWyK9W4L22DislpK2dnVBanyWrdIzYNYgn6xL/odv4diVd+us7jhiaUCy\nUIyszRn7MwBs+kIdc/s0aoDGb/tsa3WB/ApiU5XesvUjdF4k1+3aYynXBp6T\ng10p\r\n=ma0T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEHWZKqT+PmKDYiX8PW8gNWTRD4lwqDZNr9eDQriOO7KAiEAsntK1Hgp4tacBNRoplGMzw2c+a1+DVU9QeEUJee5oEg="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.7-privilege6_1571648517807_0.7285272520329098"},"_hasShrinkwrap":false},"1.1.7-beta1":{"name":"datahub-restful-core","version":"1.1.7-beta1","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"f0ab297c316c3c819fe0cf639770d8e95247836c","_id":"datahub-restful-core@1.1.7-beta1","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-9b6g94dw4zNSumFEBW0uTBRRUtQ36kI3S4YzDsOuhqvnjcmDwY/XB8NZa/XI96ZY35wgtTkJmTiowSl4S6VNHA==","shasum":"a12f5d96460f0cea39cc5ad868aab7253f4b2062","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.7-beta1.tgz","fileCount":40,"unpackedSize":540931,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrbNSCRA9TVsSAnZWagAABysP/ji6+FtcAzu0rRAA9bKo\n+1pWUglWXaRXLpb6QB7ZnsVJAv14pALk/JLYpWaT4QU0hZ7mljC3JWTo2cGp\n79TOR+3ktHWa2+LxibA4l5+HC9Z99edbVvRUH/Uqbr+BtMgFQe99/mlZGghK\nEf2Hr9qjzOF8oXrAfkif3/VFyCqX99gU4U73xBOyiTzC7QhzXkThIy9mmNUB\nitroVmJJyF/qzRQx4Ztbc/lJwqpmA255oBzY4O4Goo38QcZ4M7ALU4OvjeHo\n5bwjWJDN+gWMqBCyzDsM2UMUDby7oTJwjPGU2qck2EDYLkqW9weBodTJS7F/\nI0veZ+iPAI9tcoz7jH+x2q6HhHVhpNZwaNll/r9alRkHOw9cXNWtGlNr68u+\nqPXoK1F/R0jRimAi2zkVNThhmNUN8YKdDJuGnuSrv0MMe2A5u68MlyBAzMQ/\nXgdwbFsqqWKB1GNk8iOdRAYPtbqLqflwlxDchsN4vfJjlZd6/JWrZOX2j/w+\nAo9WWCP5AKePwpNQcIsafCUVOnM14YIAQ2VBJcsc1FZFuapZ6B38goIolIvX\nDAkW6Y11HtMqL6T1vl3sYAyOyGQ/BuWoo0OjuroQN6e1oYI13Yt/Tp4iBGCL\nxMIMDGY/RPy7ZODnTSxUyAHbSqb9i/4AbM4s00QA6J4+f8K4i3FrSc/7RVp6\n5AJ0\r\n=7inG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDcxpEgRlSQn+hm+K43Ds12r7s6XVuu8qCzHajSjBxLWQIhAMzHaoUkCbMQr77myOv3YFl1xUkOeNvBsXVv34hHQcfe"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.7-beta1_1571664721650_0.789949484207829"},"_hasShrinkwrap":false},"1.1.8-beta1":{"name":"datahub-restful-core","version":"1.1.8-beta1","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"f0ab297c316c3c819fe0cf639770d8e95247836c","_id":"datahub-restful-core@1.1.8-beta1","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-bBuZV4FV7VizQunLatK4jOtcfIQifF33PaeXSKHW/d8QVMwWIYaBH9ebI0CiErlXLWntPPUcwiZxVTsebdE8Tg==","shasum":"49b82f0d2cef2b49d8d9c436928930ac287fde35","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.8-beta1.tgz","fileCount":40,"unpackedSize":540931,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrbbpCRA9TVsSAnZWagAA0GkP/2pQIjTRa0/QWIINVf3x\nefqgODADYr1FOCm8NNsx2wrIjTOR5vSFMWuNBX2RMMpyfTHfrvyWD2jleeUS\nrqW5U1WlJPv2/RAGzbGEtbF4DB+pIOjtd8cz12BN2ATRD4sqy1lW8thSpDFX\n7YiwWmwQ8lCOj450gWryeIAQDXNFsNMyzCwWnsIr5yxMs1JSorApMufcTKpG\n2ctphLQ1WOK1erLFr97QNovuD8tUEZg4GOKGmGfSGUrgbDwDrFhaLMsrZGLu\nfRH7rP71yS8sk68kFH3mFUS4NaLwnZ+6quFf++ccvRR/npCSfOzcQK8/2mxv\nVM9zNZ2bt3FvQ7+c3IpwbkXHUsOxJmrNrm+KNIJRrKyYxK+dVb30iCv2PEPy\nCQstEmrw+QAS9WqhSeGnozbena2yXgtoqXonW+p9Pwd+Dja+Y0DpM8TMhQVz\nGop9rktIhf/WjnWyHnS+mFbMM2C5ukRFD2qrnjyeVDFR/S6Y008TsHyqZo4G\npAoaa9FB0KAePnyGaUBIuf8OzHKKH1jt/BA9hL7vt5waFmdf+Z5e5F/Q2kKa\n6Sg5JVeUFv7YVJ2xZiXYbQxgz1G134LOl49F6nAmlLI5cMNnvkkkamMabpAi\n8JRFn/kmTShQhAn94tv+vU/eUHKcT9sJHXz387BtQD3vfodsq/jIHmfqbWKZ\nSwLv\r\n=HX5Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDL40vNvlY+M+L0MZ6yDHOTMw2rfE8CnHGccNgkqvoIcwIhAN2KulGLJ+ks3uakt3RNwAfv+QYKEsdz1ElPe5/DC7i9"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.8-beta1_1571665641378_0.9025399953095332"},"_hasShrinkwrap":false},"1.1.8":{"name":"datahub-restful-core","version":"1.1.8","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"f0ab297c316c3c819fe0cf639770d8e95247836c","_id":"datahub-restful-core@1.1.8","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-zDvaR9Zn8q3k3dsttQaiYmwEaLLDme9qKW75bexQdhf2H61380/S3VCjs598aIIV6kk9Zd8siaRadnChk7DLGA==","shasum":"5a47f8419cb3e4ac7dc43b1acd26addd36276c94","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.8.tgz","fileCount":40,"unpackedSize":540749,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrb/OCRA9TVsSAnZWagAAZq4P/3n8fs3Ya0emIFQgBij8\n5W8aSJyqIC6WXS6KVpjyk3xowLVYQIeCkYIMnejZdytHP801+vxU2gsUCTUy\nCe0N+R1HbSyVKKxKZFb6ln6Aj2jlCK/1PBhP30PY/xGMELjQpkkmT5WTtsUk\nrn+UYGndLNqHVP0ECPL0RvwxUUmzibGNAtIZd4wWy0OeqTYPv722oTJN6aWz\nnhL/EQexSFazfdjw+Pe/Drn9FfJ9a+oin0bH+U17Ds+1cXIVylHWOuiD+3dg\n8jq3X7TMA0NYbINI+19d73KZVg4FRPS099luo70+7Rkka2KniCnwE73YRnUg\nyWT4miWxZeFQg8vroKC1KOndfDK5BkiDfrcBssxwuNtxfRrBS7GW4+8HxM07\n3qYQ4Q24/BUF+bKVe8QV1r3SYVd7V+9ZI/EPVOk0aOaiaC5cbptW/zzaY/hX\nlgJ6AiRRmq6tNetTcbrLWVzSvmj6kViiUdEKzenLqFnRbLOClQYTlUOFiR6g\nQwhDpreBzJRF6ZpbztygzhexvpA0FBwk+mESGB+qPTVFNZRsd5OtRRpvETfx\nTpbp+zrJYtkqyy+5JCqaL41FowvaWbkr+LQ1C3yUwT/G4KtyMOImetvPh2xW\nG9j0TIX8/m7XNhu6nyjGucKM59+mVX+GDaCJeSF/TbK6pKZ2UbUdakjJFM90\n1Nwj\r\n=Z4xz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCsAZTIcSfM3lCa7FImPICfQ3RwC4X4PC+wMn9gAO0giwIhAJi//AGd0ZF2VGq8Qkm8eKpwHzUZIbpJIp2icv4tejmH"}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.8_1571667917963_0.7553571103700518"},"_hasShrinkwrap":false},"1.1.7-privilege7":{"name":"datahub-restful-core","version":"1.1.7-privilege7","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.19.3","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\r\n\r\n## export mysql as restful service on koa v1\r\n\r\n[中文版](./README_ZH.md)\r\n\r\n# Usage\r\n```javascript\r\n\r\nconst koa = require('koa');\r\n\r\nconst {DatahubRestfulCore} = require('../index');\r\nlet port = process.env.PORT || 3003;\r\nlet host = process.env.IP || '127.0.0.1';\r\n\r\nconst core = new DatahubRestfulCore({\r\n    port, host,\r\n    name: 'demo',\r\n    endpoint: \"/\",\r\n    options:\r\n        {\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '127.0.0.1',\r\n                user: 'root',\r\n                password: '',\r\n                database: 'datahub',\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true,\r\n                multipleStatements: true\r\n            },\r\n            acquireConnectionTimeout: 60000,\r\n            pool: {min: 0, max: 2}\r\n        }\r\n});\r\n\r\napp = core.mount(koa());\r\n\r\napp.listen(port, host, function () {\r\n    console.log('Datahub started http://%s:%s', host, port);\r\n});\r\n\r\n//curl -v http://127.0.0.1:3003/demo/\r\n\r\n```\r\n\r\n# features:-)\r\n\r\n- router rules\r\n- restful interfaces \r\n- POST/GET/PUT/DELETE\r\n- pagination\r\n- order by\r\n- composite primary keys\r\n- custom SQL\r\n- search\r\n- or condition\r\n- hooks\r\n- not \r\n- in,not in \r\n- between,not between \r\n- null，empty string\r\n- charset\r\n  \r\n# misc\r\n\r\n- execute vm\r\n- export to xls file\r\n- import\r\n\r\n\r\n# URL schema\r\n\r\n## API\r\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\r\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\r\n - declare charset: ?_charset=utf8\r\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\r\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n RESTFUL support on above url\r\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\r\n    - support operators\r\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\r\n    - contains : like %keyword% contains keyword\r\n    - startswith: like keyword% starts with keyword\r\n    - endswith : like %keyword endswithkeyword \r\n    - gt or >:  greater than\r\n    - lt or < :  less than \r\n    - gte :  greater than or equals\r\n    - lte :less than or equals\r\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\r\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\r\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\r\n    - not: \r\n    - isnull:  IS NULL\r\n    - isnotnull: IS NOT NULL\r\n    - isempty: empty string\r\n    - isnotempty: not empoty string\r\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\r\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\r\n    - nested or more complex query，use the `complex query`\r\n    - return result example\r\n    ```json\r\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\r\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\r\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\r\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\r\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\r\n    ```\r\n - complex query：\r\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\r\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\r\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\r\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\r\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\r\n  - hooks\r\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\r\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\r\n           \r\n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\r\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\r\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \r\n         \r\n# KnexHelper object\r\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\r\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\r\n    - getDatabaseConnection(cdbId) get datbase raw connection object\r\n\r\n# Test\r\n\r\n```javascript\r\ntnpm i -g mocha\r\ntnpm run test\r\n```\r\n\r\nconst knex1 = require('knex')({\r\n            client: 'mysql',\r\n            connection: {\r\n                host: '172.21.16.20',\r\n                user: 'writeuser',\r\n                password: 's$%dSDdfdf3DYU23',\r\n                port: 23306,\r\n                insecureAuth: true,\r\n                supportBigNumbers: true,\r\n                bigNumberStrings: true\r\n            },\r\n            acquireConnectionTimeout: 60000\r\n        });\r\n        knex1.raw('show databases').then(console.log)\r\n","readmeFilename":"README.md","gitHead":"e5cf1f7c3e82ba7c1d7c879d2931efd00b14fd10","_id":"datahub-restful-core@1.1.7-privilege7","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-OJGu30JHP9dMegtlgdK2RjHx6ePIHWE+TlyUiUlZKr4z9i6CRgTh8tZdk6WvzOxPlPufvj+Z0AyPncHXIo0ZgA==","shasum":"06e98c1efa75e509fc107efb9e3a94752c46edf4","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.7-privilege7.tgz","fileCount":41,"unpackedSize":546529,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrntgCRA9TVsSAnZWagAAeKoP/3tJ0yH8A7vhu8niI3Lk\nYFbtAI78xJNH1ZRRIwbfSykMdCi3TB5E+3xGr6fj+Obtw9Wq1o3FiEIisddM\nzQOhPzTMOBafGDNLpsshJXDSFC7pLQaIiT+4V8F/LUKUBLIMd+nNBsUOQX24\njhM+Kjcb8dMAc2tzWHv0niZ+BOcL7eW/J9s9Zemz0dtQnPifFtuGbmlt0GaN\nVIoiVirMxnkilnVYPhwGVOf+dtKvgC42YEtQuX1HKAmSP5eCB7W7Fou2pZRx\nbeiS6xrnUdPup1c2DM2oK0BHPXT4k7XTT3E7Zyu6VxkQmIDB5vMYSmfRQzl6\ncJuq8CI+kZ/4vmQxBx19n0hpFIv/0OjzRa7XcZo3fMjtSa7fqlDsjYXfqTvB\ngq13vkXV1zRkoCusLYjphZUKQM5toZrUQmn7UVurkUMcuPQiYyG7y9vQK6ps\nZ4AOen32Dhbpif55ZfEvCeaRAEfT9wyECI4c+CurGg2cIFc3Upuf6uAaJk01\noUbuDA3eOo0qkcoWYoZzeT7wEedGWi41MqV6ZBWXwTdMgPWWToNBe9RkHNgl\ncNgWJaGQb/CQvp2BTalRKUVIZN9PwxXYHV4ZEcPbt1MHs/Uk7njfiyGRCveB\n0qtoiCV9FZkFddQO/aXBH2ODB+SlCE88lauH/NJSrGLVTToaOah7su2F3+sm\npahk\r\n=MOi2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEKyg/1zuI+UOkkvfwNm8cMoPkNalA2L3C/Q5ytptgP3AiEA85VwvtZ6jDgo/FIcg+q+in0RT03j/kBn80BfxmAHdXU="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.7-privilege7_1571715935688_0.1800858792839699"},"_hasShrinkwrap":false},"1.1.9":{"name":"datahub-restful-core","version":"1.1.9","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"f8a8d224567aef42be791e32e62f8e67d916c947","_id":"datahub-restful-core@1.1.9","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-ClGb4/VtPo9tlLgZ/cELLu4T/aQG0jXvuy2VmIkdAgdhvwqiiUsJob0r1VXT5i4VGRYc3WPXxExzEShUI8pzBw==","shasum":"a455ff85bf2b78ca94599c0842091047a26b520d","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.1.9.tgz","fileCount":40,"unpackedSize":540749,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd1gXGCRA9TVsSAnZWagAAl6oP/RRH/MFmE/yceyYSSURX\nFWpeZybeGUsur9+sx3Lz6HSxSEupJ63lTF8CPYOvHlHCHaKsilcOMksCExpv\nGE/nivnLMYr8sxa012NFmquotwCLzf5JSOqIwMbS6Qkt7FddfhE/U/rfeOjw\nqcq2/wGE3d2sJBFBfsZgheaOoTGxOKbZQc726ot/JCuNKmNtcLBStFW80ql4\n422GMujiixCYiGSk0NkXct3mwJrTtlr3mU/cEERHuHHLQB5Ve+Uzk6Nawu++\nb+903rnwYi9uX2b5ahG7N1eHois8rtlGvS1cBwwx64ViCnQ99/M8lw+wSrH1\nBm1mLD+F2sjnFly6oMe6AYNmDLGKEPUhIGbfEdW/c2is6DPB7J9VHHRHqset\n3O0l5FhlSBkuyM6XZXSy//2LasWdrEdTYIxNMwhMnMGaoJ7rxevI9umsVlhL\nwkCx12I1WTFCdFopf4OT3ZJeib0SC1L5aJNpu/9dQKaea4b4BJxzthAyucgF\nXNxEuM4M7rWO4mt4AORtcWSzpUGEiXoQW8hDiV9LB2UWUc5V5xUwGFD8GbMk\nzvjmBELosqk0rfVa/0bcTWsz1TUUeyoQE3rd4xjtIk9pM0CUGgNufATzmgOZ\n4udLU95Klu7Ew1RJYs+gJdku7zgXPHmQ7vxHsIw/CKyuLJT1PXs2bwcPVQ0G\nWyU2\r\n=lWJz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHG8gyo2OrqSOqgCVbw2laRVnVYPAnKjWi1iXhRJUi9KAiAOb9mdsEPIo3aU8awVvS/I9bKIf3fs8bE478P947MEEA=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.1.9_1574307269740_0.8170046594391958"},"_hasShrinkwrap":false},"1.2.0":{"name":"datahub-restful-core","version":"1.2.0","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"80224d591f56460f4aba2ed79508c083080bca6b","_id":"datahub-restful-core@1.2.0","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-LG+UXzV7Y7YrpJgWl5sLBankes8o3ARUA5BER0rut1lFuIpih14AJKCrYE4Sie8wiFuBnci639QsBadPA4g6zw==","shasum":"97f146e1aeb8fcba56a0028f1a3d2bc95828dbda","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.2.0.tgz","fileCount":40,"unpackedSize":541486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd16oFCRA9TVsSAnZWagAAsyUP/0Cl4nyrYQ2hzxX/1UgN\nT+ylDaiUaEz/cKHfqIjCAjHqMhZRUj9aPEZL69EBoWOUJtsFBTefQ8Jfvpr4\nu+frw5UchpSC8OE0uAiaN95ekU+9YgrLGHk19F58kNfA/fY+FquokPaMu96A\nrWsP+O0QffhQOlp+jEKtDgPaC24eOGnXh6kq1uuS8u4YyJj6S5R/vNcUcGRf\niIAVfn3btCsuU7Zn/+lzJ5lqKny9AiBPcHKmtYAK1jMU5RO9T65XckoJ0hl5\ni7/2H+P9BWP8/jm5iZk2jqrfa6Fo3Ei2JqxTHQw6mkpKAVtxKR+WtCZ491aL\nnzwkc9/qqoN/cMJMUBEHuB3CkRQL2tXRSX9ODIksdSTSwNLxs4tfWPhzYn1p\nGez7JfiHskaDM/WiDA33f9I/0rurj8QGqPXF7B+r24iyPNQa9BZ+1/Ux1P7W\nKag4P47S070jFnkye2h8AmAtl423wm0CepyD4xc6eetSV4thTWYgVA4Nhg9m\ncBb4IF8xzV1Do5uMz+YrUoVF5ygWW9DlOOqALOLEf16jb+m+7J1Tev+1zlkd\nMyCLlIJ70MTIu+VxCh8IlKg/2Z3bVZP2vBQ3ZbxRu4ny8yIPSjCHwD7noNmv\nKn9tXHTjnTUzMeapqTFW1HlGF9h35OGmOCd+t44g/7z0n529P2VK3+ZMhZAw\nbNGu\r\n=rtZy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGwUMLHQUOtiLqyiEdEQUxjy6qNvkEXnxHqq6xVz5h1PAiEAvexIbCTvM6RuNW7zJ1yiBeLnrk/alSV7QxX3Rr7eeP4="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.2.0_1574414852730_0.36598092054090325"},"_hasShrinkwrap":false},"1.2.1":{"name":"datahub-restful-core","version":"1.2.1","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"250a5cb78cbaa8de121eb15629e902e821f57eb7","_id":"datahub-restful-core@1.2.1","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-MkLEFUZagjJx69qAs/2leCsQFAsXENNhBzulD7RaYQeZdPofNmnME7ci/jy9ey9ydEZCjX21M6vJTMeqrGUjdQ==","shasum":"5d8b75aca23cf1b3828f5f12714a110e42b2c178","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.2.1.tgz","fileCount":40,"unpackedSize":541559,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd8Q9ACRA9TVsSAnZWagAABd8P/3U3f1SZVt+oBEW+jWxA\nOJL/TTypIVGg+eNvsmf4BUT/WFSeuV8mOCrh3z7GmzfSdWbBo/MI4gILrbDT\nS6DVMpSERWrIJLlkZXl+77KE9Sfyi6rsYrdyO9/9Jr8KeULK5u5PxZlAu0Er\nc/jubZrZVUDDZ39GEad5NXuR8ZJC6Tsj0ETwNWa4czfqFifHQZCXptReTJXw\nvDM3jA9WqxE8n6eJHm5/qIuTj/6fSe77kF7IFqaDW1wYj1cZ5qRWA2Qpsb5a\nKdrnaZTXqIw77fGogRAQJ9au7LD2+NfBxyIEWSNHrnq0s/YBOMptFWdfdeg7\n1w01JxrcHJfXxg+F1EnkqsAc5ctJyy/i5UUmwVSf4TgdZPxoW+8O5mw4JwX9\njvrvtLwkxuDSmbByyEBcYQp992iVZn2oovCGLXhXbw6MpwXa+HRbzO+Pt0Fn\n1F72FpNU6GxXJT1JSN61JSliGGbXSm8OlxVw6/caVjmFwSx+oRiNXL+6ng8i\n9X1dYg3AHQpfBUhk35Yvdi0iQWB7TMFvJhpD9/kL/0ceoKvr0S+V43O65vFx\nLFTDeL8cB0SLjal2J14d1s5R/4syVegooBVJg5qdVfpQH7OkqSTt2Kpfboum\n8GwVIRysam9V0h3Ve38N25EYPO8cVE1CaIzNV/uRYMTz4rp2SyXOk+5uBKDq\nbwa1\r\n=M+Nx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMWwsTkwsglDnfYxWHYpQy4TQ8BSfKcuaiJB/6LBD8bwIgIVF+ac7+SlSo3AuySiinieBZdzzUewB0utx8URitRiM="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.2.1_1576079167922_0.43436397164001317"},"_hasShrinkwrap":false},"1.3.1":{"name":"datahub-restful-core","version":"1.3.1","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"5773eea9433c112e878aa13cf6dc3f9ca583ae28","_id":"datahub-restful-core@1.3.1","_nodeVersion":"8.9.1","_npmVersion":"6.11.3","dist":{"integrity":"sha512-xdHhqGZLYhf3anWjE4so7Am3hgzptejSKwpnLk+Cy82fdMd5Q65QCswiYmK3X8czgo53f7vU36kPmdZLsq1Z9g==","shasum":"332c9ee7a62b9187830cbd74821aa1138498a764","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.3.1.tgz","fileCount":41,"unpackedSize":547325,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeIAVlCRA9TVsSAnZWagAAUOAQAJbzXk7ETv9vMASUvo/x\nSQ2pf88OSe9OdpvGVebKAdQJkojHiFwagpwIyBKXBR+RVTUkF8U1NBAGDNVI\n3GEr7Rac8yTLaRlMgC9bh6ZUWTldHz/TulsJCixBnz0JXNJsXedlt/y7OuwH\nPnB4966YF6NYWbarUO4O4alyiVg6x/QLvVaL4RxFp827feiI7XCqzcSvtTJf\n1gx8KRdEuJnASXX/2D6owtAf+S1bDFUKIdE8Ob5odyRBHmYYx4SaZGs0etO5\nVX9GFAsYjVeZLq7+dGCxWuc7hKHcPQzLh/WKhNwN7xmMSQonlukfj5iOwVEx\nutffxoUTnrOQorxsiqEwrDRgPBbnsgkwHK8lYQr/Z2tvCFj0FYNWW8N9V1QS\nhM59PLMokxuR3KtdziqJ6b7GPTJbQ7AkOuulJfOvK3eGPLrspaMZnI24RX7t\npV/4w9ObSfJw8J9orv9PbB1Y9IMwXViKPNSthaboeKLsUtxu0RTybXbZgGFn\n4gnErFY/7yhBEJa53AU+TUU78siqcl6ZDEbX5oZ9TXlrKT+OwzH4cZ5exGNN\nxbbFh7ZPaLD/AIGCTMJ/ou1cgsIdUUs45/W3eEsyWIFWHmY9Whmbs5LiPTdN\nxwjUe8Rk3bDpB6LZmf3Dwi/CRjEa8m0LFOUSMNxNEHRBqDt4jXRWtotMKjKa\nuTim\r\n=7A2z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAPo502JpnPHgS9yIyrAdj4FV46Xz6MCecPdz+rALR+TAiAbFq1lbPv2PYqsB30MSeC/EStiFo9F8oaCgRfjo2jvmQ=="}]},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"}],"_npmUser":{"name":"wyao","email":"wyaocn@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.3.1_1579156837262_0.5577940874747083"},"_hasShrinkwrap":false},"1.2.2":{"name":"datahub-restful-core","version":"1.2.2","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","test:sqlparser":"mocha test/sqlParserTest.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"bc53f67c334e4e7d8f71545901186ab58f300337","_id":"datahub-restful-core@1.2.2","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-3wtWpwurVyuyikiCEInVY9xFe5f2Qiz3Nx32JuTCqXWm6dqVI4tIVp5GjGWgBXky0vYv3fHMlXny4jeU3pXneQ==","shasum":"87023e2f65370043e5f5ce52e904ba28d25a0d2d","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.2.2.tgz","fileCount":40,"unpackedSize":531868,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemFycCRA9TVsSAnZWagAAZEMQAI8uuTVHqnivYtlZBWg5\nl4Kt1CAYVXpac0tkutx7rzlk5VcFfXMmEhD8Tn9+jBrquNmSOzCNT27/vKaW\nrjzh+tpaSwJCjuEXf96gE/hOSOg2yR4dB506WNE5bEs6YLPYYUMoTqXKZ3Nd\n07DfwPKX8N87n7JkKvqT2JGUr+Pn3hMd8iUNYb5hvG0oBrkx3XK3t3TgU5uf\nkoZwFr9MLkgudbihAESaV/7PBOrcM1bVn4+J32areEcYhguH24LtdJGrC1du\n5bhAvclzTdLji6EQPYdyYNpzGynA/1AESj8gokTMXIwIWqZ82KlGhNWz7yW8\nArWf1Z8D4g/ylLUVZJfx/yAyioy2aFMF5g1ODvB9TVSJiOWcs0m03b+c2B9U\nXPrBSe5vrKdi8npt06Pl2mqD+dxjXWr7oYdFSXmqHc6WU84gfmbk0N8KG6rB\ngAZRNnCjf4lPJmod2YAiD6nqr0XW4Ycy9TxDkXyZPGC3N7QMp4UrlXU1oZei\ndv+VnrYDsi/LpsdH/7ZPfsN8ic+IpMyEhLyF4nmDW9JqK2BfSTYsJlXYN7Kg\nsNQxcOSBaYmHgnNMUk9H+xCm8yWZT26QMTpirvMiEzSFpANnNke7mozKxD1u\nOAq4dninpyynus9LuCrptSgX2Jc+WRpl+x5hbSvdGXTqcBtBqRtppXUeIyMc\nllHy\r\n=lvSz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCb+f0WOqD6CLvoseqsDf41Y4gdo4aCY7C/mycL0ZunjwIgIQLGdmYcSa4+AvIw8TZkNfwtDKRakjypyka5+7fiqi0="}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.2.2_1587043484171_0.11521070568044611"},"_hasShrinkwrap":false},"1.2.3":{"name":"datahub-restful-core","version":"1.2.3","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","test:sqlparser":"mocha test/sqlParserTest.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"bc53f67c334e4e7d8f71545901186ab58f300337","_id":"datahub-restful-core@1.2.3","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-9Mx6E1zWJqgH1Fveom1wYvc8Dpn3LTfza/fesEIMSh+rzCiA0ljKgDaFSo1HYRKIKo9O6uJ2UxtXfcnzhsvbmQ==","shasum":"73cf96f1c721624140fa9a5f24cffe7b45db2f0e","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.2.3.tgz","fileCount":40,"unpackedSize":531873,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemRWjCRA9TVsSAnZWagAAkl4QAIkHdMeEETRzofB2vNz+\n38nQozVi6DcobBzwOGhXa5wQQO6QlS7vqp4tAfyEPSGZXu/QyW0nLEKssfYJ\nptVraNuzrOQOgdwBBvNFv4mVdTGlRYQQTUPirj8qMPey3Umq3F898ITUe7UQ\nSB5yHd9rKWg7Dc4D7hCRpaBblCwl6Xv2RSWET1Q9ZvRsoBvHnb8AIw4TYVYm\nCwUabLUgMcll37AWIczSIJXhQ6Ya3ufsUkMRmi1ijf9teI1oLfMI3rN0i5qp\n0qL3m61PqibKE33DLd9TqDm57MBUnwhSPQlmzBEqYQortvwkEKmP9FztkJuh\n2uDERxGzzZDLDtIwNXh+xCCRclQ6G5g3EBSPyecAXBfy9ePiS9h/4dlbgYx5\n1KTQyMaX2d2E0vdiUMzZgc+UV9daFlUWKnOf4PRmgQt/ohq4XniKEziYjT1S\nDoUJNcWD2FUqFTM4nYWOheuQhaoj7MGxYxTuYNsKQzTuAghjLuownpKgJQ1t\n44FxkcWfe9uOobeTN2f7HvfPfWy7nNq0zqKTkUuAg2VBBWfCJO9oK1vAIm+M\ntGL+4dug1YT83VNodl5aCpJvYAKLNLmyOpNOmE8PLDsmrr4VXEwht8naxh0a\nEDcZ1DsRpD+Of6cKpirepOXebbPBn3d7AKtFzWWgOWzrwMWYTrpHpre9ReQk\niypP\r\n=ZkQa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZzSrTmdiZOXj/or1nHkV+4tBVq9Zr+U4MRXwL1hLKBAIhAI9KIDjj0Uzj8S49JF76PrqGgjtk+ysDTUybz54Vi0WZ"}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.2.3_1587090849459_0.7393977436689185"},"_hasShrinkwrap":false},"2.0.0-test.1":{"name":"datahub-restful-core","version":"2.0.0-test.1","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\n\n## export mysql as restful service on koa v1\n\n[中文版](./README_ZH.md)\n\n# Usage\n```javascript\n\nconst koa = require('koa');\n\nconst {DatahubRestfulCore} = require('../index');\nlet port = process.env.PORT || 3003;\nlet host = process.env.IP || '127.0.0.1';\n\nconst core = new DatahubRestfulCore({\n    port, host,\n    name: 'demo',\n    endpoint: \"/\",\n    options:\n        {\n            client: 'mysql',\n            connection: {\n                host: '127.0.0.1',\n                user: 'root',\n                password: '',\n                database: 'datahub',\n                supportBigNumbers: true,\n                bigNumberStrings: true,\n                multipleStatements: true\n            },\n            acquireConnectionTimeout: 60000,\n            pool: {min: 0, max: 2}\n        }\n});\n\napp = core.mount(koa());\n\napp.listen(port, host, function () {\n    console.log('Datahub started http://%s:%s', host, port);\n});\n\n//curl -v http://127.0.0.1:3003/demo/\n\n```\n\n# features:-)\n\n- router rules\n- restful interfaces \n- POST/GET/PUT/DELETE\n- pagination\n- order by\n- composite primary keys\n- custom SQL\n- search\n- or condition\n- hooks\n- not \n- in,not in \n- between,not between \n- null，empty string\n- charset\n  \n# misc\n\n- execute vm\n- export to xls file\n- import\n\n\n# URL schema\n\n## API\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\n - declare charset: ?_charset=utf8\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\n RESTFUL support on above url\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\n    - support operators\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\n    - contains : like %keyword% contains keyword\n    - startswith: like keyword% starts with keyword\n    - endswith : like %keyword endswithkeyword \n    - gt or >:  greater than\n    - lt or < :  less than \n    - gte :  greater than or equals\n    - lte :less than or equals\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\n    - not: \n    - isnull:  IS NULL\n    - isnotnull: IS NOT NULL\n    - isempty: empty string\n    - isnotempty: not empoty string\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\n    - nested or more complex query，use the `complex query`\n    - return result example\n    ```json\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\n    ```\n - complex query：\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\n  - hooks\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\n           \n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \n         \n# KnexHelper object\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\n    - getDatabaseConnection(cdbId) get datbase raw connection object\n\n# Test\n\n```javascript\ntnpm i -g mocha\ntnpm run test\n```\n\nconst knex1 = require('knex')({\n            client: 'mysql',\n            connection: {\n                host: '172.21.16.20',\n                user: 'writeuser',\n                password: 's$%dSDdfdf3DYU23',\n                port: 23306,\n                insecureAuth: true,\n                supportBigNumbers: true,\n                bigNumberStrings: true\n            },\n            acquireConnectionTimeout: 60000\n        });\n        knex1.raw('show databases').then(console.log)\n","readmeFilename":"README.md","gitHead":"5773eea9433c112e878aa13cf6dc3f9ca583ae28","_id":"datahub-restful-core@2.0.0-test.1","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-nDeBInOvn9qUSV/5YITDC2775Y74owLrjxRBS9qoeoMgm4Q77m5EAUlTdVA59VX7aYeu8wjH5Df0svTsSPSDUA==","shasum":"8863824cc4b7e25dc41e438c4d8a564c98172ed6","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.0.0-test.1.tgz","fileCount":41,"unpackedSize":533598,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemXgUCRA9TVsSAnZWagAA+JUP/jQ61fI4oL4sddd84w6l\n2mp9cUgrOjfpjj3hG3O4CiEwouRr1mZDBmdNmQ+IqozzcvXirHfdzbKbzpWP\nXV2UzAtBhNqp4r0a8y5EeuU2g0gsZvbGCCQ/O0/g/5Nui5ZAKsEC4EfnIWrE\nKPKRs9z2VStfx/RE6XY4qEia1gflygtB8+BgORVVlM3H3rkn+LgJsMcG3Lp5\nAmTmO3ZMeppmk2+9vhqDFQXzHsz/PrdZMq7avVKW6ZE0ZQdgYv2XvA+6ol6f\nNBTLE/13WbOJgvqaEdRiUIhqN3Am9NJnstTZMS8Tf1w0TWfAuhbLJaaJANv2\n0p7nZ5vqL/pJbToK+tMURimG8QLJivQHZSkJFQseCtFHLzGnPBnfQDPNH1JA\ne7cipdZN3dm2SdHZtbiV0ud5DzSLtB9CKu8GMvRRyOYLOSK/QommAgySP0v9\nzUsRE3vFIsYmhHSW914VtsYYDUCoHxX4wRhzUWid55A6gnTnXImkjRDcqmmp\naart4ntBSUNXYHqCTHlgr/SECaqJpNRftKsp7Kxev2dYG2xveoaykxfE42dK\np2xvlD9bHuP7EFy8t/4KrZa7TKCJhRD/Ll9BpIlbFTmhQ2GHv1qiAOWZdN2Q\nA/h5Ei9Aq4CRCb30z/CZoFxG+Op3V5A8H4GhuePhoFWHlJ/C7MALNbAjVZkU\nvi9O\r\n=FaOG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFD3PYrbN9/4Kx8wvwBkO8TOIEp21Xseu7zSyjWK1m3yAiEAh6EczseA6TvxRQ0HKeJfWF08s1u2Vr7z2gCJolUg2+U="}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.0.0-test.1_1587116051544_0.9134288818059058"},"_hasShrinkwrap":false},"1.2.4":{"name":"datahub-restful-core","version":"1.2.4","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","test:sqlparser":"mocha test/sqlParserTest.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"30f2dc202e17a31e1827d9aec1819f8123a4cc51","_id":"datahub-restful-core@1.2.4","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-0em8q3JqMuzLa6hbEm4G2sC09eWsMoImb/War3/fJsmZ8/m9CllIoAmTAmKiY9bMVixLl1/gcJSxy2+o0JA3ow==","shasum":"a61eb9d269dd0fbdc9bd631387b1a144747ddf20","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-1.2.4.tgz","fileCount":40,"unpackedSize":532067,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenRVqCRA9TVsSAnZWagAAYDcP+gNSF5Z/KjsCU+2Ro36Z\nvzWgGivI2D4VwpGsujgkyyQ3J4DzIhb/Xla0eLN5K36pzHyHcRb5O8CTf1dY\numpPp9UnfibZyuux2mwaSHW8MTiILQrnMwkGduUmCMV0usgxceHcRNbTQs6N\nIgIgrUCi5s3dTvTW88oo1ALe2w4fGcKWVpz9EnCNykTLW3vJttfFVKS5kP+k\n4bvgV2tw6FVL7RvqyZiYgJDOGPn9Tnx2MfLTQ91DUXQ+ZkBNtkm1Dmnw438T\n+C9Pdk7/cbBrzx/YkJ+l8NjaQIy42tEf952KAsrxvfE2/cwMACGRTCVxAbnf\n9O+IwrEJ3fHF4paalA/IExvdC0iN2ESfLfbmsULqAp4EgwqTxlBQHhTdUQkI\nQhxzeYWQHWPdEdUy9VFXTZWLyowSfa1konOqPjM+ghCulOYSLRb3HgRrrBdk\nwjdxvbNfm4oOk85mBnJ9ULC/7GRald6BB89mKdZCxTYKDEsJCccI30i48LBw\ntwJDqhyHxe1+5zMstpfiYJ+3hMMAtRC0yaZfMTJX2BSkTY6tRBE7rdkDjRqX\nz4K6c6c+6ow9KkN7K6IPoTbTgq9YQrxlL2EGgpgB1RDrYuXjwWjCtzw/ZZBt\nIZs6f92RyyEXyMndUf6drAe+o8AA90j2WsrIKSfGb6eUtC/Jt2FsT0Ow+b9d\nT0Bx\r\n=gsTV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9md44PBr71Gl4NmOBp0Y44Js9GKpC2JjQzmF4w5jgsAIgKNQFLXt2LBcgLpS01SjoIqSJInV3+1LzxNnYlpQc7co="}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_1.2.4_1587352937910_0.25489320859712405"},"_hasShrinkwrap":false},"2.0.0-test.2":{"name":"datahub-restful-core","version":"2.0.0-test.2","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"5773eea9433c112e878aa13cf6dc3f9ca583ae28","_id":"datahub-restful-core@2.0.0-test.2","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-LG8TZloiHn6PHLTR/EtOTCA3Nd0ePp2Bf80ko7O6sgcJ2GD0JopkmoxY0p3mdbSk1Qv0pCj7PYvccCaiaOtmKA==","shasum":"16a469dd5e303c751ff7a606535a4d881be7a974","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.0.0-test.2.tgz","fileCount":41,"unpackedSize":533634,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenT9QCRA9TVsSAnZWagAA0kcP/0pRCLwX3F48oUe0dpz8\nHtA2/GjPgA7J+gLeuJlSv6sxq0qX/ICUgwVR7nlXWjgkpDpOXs28eWo92P/S\nqtGXjd/dX7/v5Bv6X61c+zT99z8cnK6iIKtwu+Wg5TdxwWDztR5JIYaWb3Yn\n49leU2fKc7GIJ+bNo/CF0Q+r4UTD4+SU6c/cmEol5DRhqJIKElELZ62wol2s\nhaiKnpNN0C0kcGWtVqvFCgpT94K+pSeTX0UWzdh+NkGufdFmB89KjTdTd4M4\nRrsJ273ryN2dD/hUlPtFSzQzHUuSKBzFg6a0UqrQjLrZMA+r2jSmyqa/Q15b\nwpwnTTmKc6aFC+wdG+KOe/FKUxDJnG/h7XWJ3JMh4rOyXFBIOcfqqmhYJqSq\nKAEr8KRj4ClZ54BWKZJ0UWK/Mkrl7q7E4MBGsqeRTPZ1nJSPzXHezHUN1ZSb\nXMb6not8N/mu9ZyhM2spwwK8qn5ZDDdeUqhvpbA9P8cevb2mP+1wvtY72eJm\n51e1sbjfQQnOgd53pgSd4IFdTHW1s3V6+5fTWBgkUBUW6og83dMn/5zgvFO0\nDjCAl5Gcs3m2dS56CjjXY8SpiMuDDpNquG32+CtmBNz1nfaXNwiP22M3SvJr\n1yji351il6daqwklT4Q2Vxm1FaSkwINQnZT+pPTFVaIqLcT12xv8WphMj4uf\niEMY\r\n=sYcR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDppPHUeCr2irnc4sCUxqO/WakQjAwQI0EcgHA5cMABQgIhAMZkrhdXQCGk+3ffEuj7lnZVZmvjsvSEIr3nJ13LDQsx"}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.0.0-test.2_1587363664117_0.17132886213248577"},"_hasShrinkwrap":false},"2.0.0-test.3":{"name":"datahub-restful-core","version":"2.0.0-test.3","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\n\n## export mysql as restful service on koa v1\n\n[中文版](./README_ZH.md)\n\n# Usage\n```javascript\n\nconst koa = require('koa');\n\nconst {DatahubRestfulCore} = require('../index');\nlet port = process.env.PORT || 3003;\nlet host = process.env.IP || '127.0.0.1';\n\nconst core = new DatahubRestfulCore({\n    port, host,\n    name: 'demo',\n    endpoint: \"/\",\n    options:\n        {\n            client: 'mysql',\n            connection: {\n                host: '127.0.0.1',\n                user: 'root',\n                password: '',\n                database: 'datahub',\n                supportBigNumbers: true,\n                bigNumberStrings: true,\n                multipleStatements: true\n            },\n            acquireConnectionTimeout: 60000,\n            pool: {min: 0, max: 2}\n        }\n});\n\napp = core.mount(koa());\n\napp.listen(port, host, function () {\n    console.log('Datahub started http://%s:%s', host, port);\n});\n\n//curl -v http://127.0.0.1:3003/demo/\n\n```\n\n# features:-)\n\n- router rules\n- restful interfaces \n- POST/GET/PUT/DELETE\n- pagination\n- order by\n- composite primary keys\n- custom SQL\n- search\n- or condition\n- hooks\n- not \n- in,not in \n- between,not between \n- null，empty string\n- charset\n  \n# misc\n\n- execute vm\n- export to xls file\n- import\n\n\n# URL schema\n\n## API\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\n - declare charset: ?_charset=utf8\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\n RESTFUL support on above url\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\n    - support operators\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\n    - contains : like %keyword% contains keyword\n    - startswith: like keyword% starts with keyword\n    - endswith : like %keyword endswithkeyword \n    - gt or >:  greater than\n    - lt or < :  less than \n    - gte :  greater than or equals\n    - lte :less than or equals\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\n    - not: \n    - isnull:  IS NULL\n    - isnotnull: IS NOT NULL\n    - isempty: empty string\n    - isnotempty: not empoty string\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\n    - nested or more complex query，use the `complex query`\n    - return result example\n    ```json\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\n    ```\n - complex query：\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\n  - hooks\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\n           \n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \n         \n# KnexHelper object\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\n    - getDatabaseConnection(cdbId) get datbase raw connection object\n\n# Test\n\n```javascript\ntnpm i -g mocha\ntnpm run test\n```\n\nconst knex1 = require('knex')({\n            client: 'mysql',\n            connection: {\n                host: '172.21.16.20',\n                user: 'writeuser',\n                password: 's$%dSDdfdf3DYU23',\n                port: 23306,\n                insecureAuth: true,\n                supportBigNumbers: true,\n                bigNumberStrings: true\n            },\n            acquireConnectionTimeout: 60000\n        });\n        knex1.raw('show databases').then(console.log)\n","readmeFilename":"README.md","gitHead":"5773eea9433c112e878aa13cf6dc3f9ca583ae28","_id":"datahub-restful-core@2.0.0-test.3","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-ZQGAFbrrTHBxtel2gWbq0yqXvYXJ8iDH0zQCbFqZaATsVYgLBBepmsWRMONdO3hcuB/GFWlnUTYkhDz/R30NXQ==","shasum":"7be7de2c41f64756eb5503d14ed6f9174f015b22","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.0.0-test.3.tgz","fileCount":41,"unpackedSize":534012,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJepGLHCRA9TVsSAnZWagAAm/YP+QDSdJUDNzOUqrrJbZmT\nADkGOiOhViWxboSgjmjFsaZ5CchsWrJ2KCpQov+C166L0Qoo9mGOSZWgqHni\nBFfa6wpRovmpsN6sR6It4VqRwik+LuuWC/znZatPvZHtWUOOmV4xNoCo8OVV\nnpeBbHcyZbmJXt/S6lnSutEo9a/MPggLrpeHaHcADjJ2yRagGtv+kXGxRwcZ\nNJjXpRx3zmbmBRWm7QVPIlmeOKh78c3q5/iqHwGjNPqqquzmO5NQC+om0nuY\ntLFaeR2NHj+gxGUTGwM0zye5DEUFlGrWkPjLFOfvNtb5otZRNOnQCzqDpT1V\nmgIl9WRtyOfOH/e6qEsUWJ43Gmhzh+vAWzjockLgiPjD31dNlmOH1wxmxyG4\nD8y8XuUWZCaEulB2lu5FCIHwNDsFeV2h/StLF4SzuhvJ5BcXjeRqDdmGfg19\nf5KBDDhloSyH1yOg4OLFFreQQoIPwoKKdYHY8SQwWLeuXzG9G8X82kChTP8I\nERl+PMpwgovNKZF6syVTi7O/v7ceAjdoVCUuJ1GsdLx962kxn64wYJ5yZknd\nyoNNhqNu7uqcyjchbcI89snLBVjzvmi8a7Kqtp6VJufFDGlehsGge45cosL5\nFWVVAZiyv8v6jrx92IL1lW+Uhi7VumFcQioC9uS0qFQEDNmzI6ZP1erXZS4r\nfkRp\r\n=WrnL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBAABZQ/lDfkDYQiEuSs8qFXPSkVQRk41NRK23gXqP9iAiEAurgGtBgQ990buUE7J8RvAKGD42xY1oZHKOf1HF6v9g8="}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.0.0-test.3_1587831495235_0.9924607237886813"},"_hasShrinkwrap":false},"2.0.0-test.4":{"name":"datahub-restful-core","version":"2.0.0-test.4","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\n\n## export mysql as restful service on koa v1\n\n[中文版](./README_ZH.md)\n\n# Usage\n```javascript\n\nconst koa = require('koa');\n\nconst {DatahubRestfulCore} = require('../index');\nlet port = process.env.PORT || 3003;\nlet host = process.env.IP || '127.0.0.1';\n\nconst core = new DatahubRestfulCore({\n    port, host,\n    name: 'demo',\n    endpoint: \"/\",\n    options:\n        {\n            client: 'mysql',\n            connection: {\n                host: '127.0.0.1',\n                user: 'root',\n                password: '',\n                database: 'datahub',\n                supportBigNumbers: true,\n                bigNumberStrings: true,\n                multipleStatements: true\n            },\n            acquireConnectionTimeout: 60000,\n            pool: {min: 0, max: 2}\n        }\n});\n\napp = core.mount(koa());\n\napp.listen(port, host, function () {\n    console.log('Datahub started http://%s:%s', host, port);\n});\n\n//curl -v http://127.0.0.1:3003/demo/\n\n```\n\n# features:-)\n\n- router rules\n- restful interfaces \n- POST/GET/PUT/DELETE\n- pagination\n- order by\n- composite primary keys\n- custom SQL\n- search\n- or condition\n- hooks\n- not \n- in,not in \n- between,not between \n- null，empty string\n- charset\n  \n# misc\n\n- execute vm\n- export to xls file\n- import\n\n\n# URL schema\n\n## API\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\n - declare charset: ?_charset=utf8\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\n RESTFUL support on above url\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\n    - support operators\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\n    - contains : like %keyword% contains keyword\n    - startswith: like keyword% starts with keyword\n    - endswith : like %keyword endswithkeyword \n    - gt or >:  greater than\n    - lt or < :  less than \n    - gte :  greater than or equals\n    - lte :less than or equals\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\n    - not: \n    - isnull:  IS NULL\n    - isnotnull: IS NOT NULL\n    - isempty: empty string\n    - isnotempty: not empoty string\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\n    - nested or more complex query，use the `complex query`\n    - return result example\n    ```json\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\n    ```\n - complex query：\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\n  - hooks\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\n           \n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \n         \n# KnexHelper object\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\n    - getDatabaseConnection(cdbId) get datbase raw connection object\n\n# Test\n\n```javascript\ntnpm i -g mocha\ntnpm run test\n```\n\nconst knex1 = require('knex')({\n            client: 'mysql',\n            connection: {\n                host: '172.21.16.20',\n                user: 'writeuser',\n                password: 's$%dSDdfdf3DYU23',\n                port: 23306,\n                insecureAuth: true,\n                supportBigNumbers: true,\n                bigNumberStrings: true\n            },\n            acquireConnectionTimeout: 60000\n        });\n        knex1.raw('show databases').then(console.log)\n","readmeFilename":"README.md","gitHead":"5773eea9433c112e878aa13cf6dc3f9ca583ae28","_id":"datahub-restful-core@2.0.0-test.4","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-kaA9HaTUqLHDxVYB0H0fL3kv7RA29oMnw7B4cs+t4aS0lcnxrqppppWU7vHE0okLJ0ZGKVVaWTfq8jeiFNlLEg==","shasum":"691e5d7879ca92ae2b680271976b33f6ab096dc8","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.0.0-test.4.tgz","fileCount":41,"unpackedSize":534170,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJepP1ACRA9TVsSAnZWagAAEzIP/0wsqiUhCiV9D1d4VSlp\nK6NaL0wQ0cjABmYXoxn5OinkFhiHsaZ5ZLR6V7CmZZMUtf/eDRrGuNIBuQ/r\nVZPHl8BTclyvZf0yL+I2DHBxH7x8id/+/xsGJseJe4UjP2CQ7Rxl/m6/HygP\n2uglmAi3F+gDer6sVJHB+U4fhCL5vD4qq5S3vgsCLSmRo6CFe10pycgRBCQT\njTLLmYnyPk0BaezZzzYh+SKW6DCU6OkzQcT3H7efX98Q3T1QV3UvDNoxrnDY\n37secbdG1TR0p0BzzQWkQms+z8YTTCSkrUkq4FDgNHr3T82vkTOBFr33I6jk\nbVZCjWQ0uqZXstSQZChA90aLhFEwQr9kiCM8fkDgAJwtphzarkCCEStoOXbN\ntLmP4pMx3RbFLN/WKjb+nxiWVp1sTqPljSM1qqz0gBS45/nEPFWx9AfGosV+\nHCZwyj/wohsSmLUwq6nDaw+Z+Sa8Xbi4fK7/3xm/Pt/XmqqJddhcPElf9ftv\nVRsD62DiBW1oIzbDWrJCABznMId02DSEyf+bp6cAD7IaNEZXil13N5bfLzCh\n+dZpXFjg6pnNIK13FEzAoRFyu6qthz1bmcYGXQvYRxaT2vKvUWa6oif5Y/z3\n3DgoFzzjW3LxK6cnktH6IpHUu7W1nZ7eF5cMGu8QIQNMKDKZ6hUVqwyMQ0uq\nh4dk\r\n=EwDV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2YfpjnVen9bdl1+zYUAQdlc2ECcX4ZNOCDHE1fZglmAIhAPsaeX6zGqmggf+4+M4M7auDZ7h/bYo8w+MWJlWXg++H"}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.0.0-test.4_1587871039664_0.5650393801884919"},"_hasShrinkwrap":false},"2.0.0":{"name":"datahub-restful-core","version":"2.0.0","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","test:sqlparser":"mocha test/sqlParserTest.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\n\n## export mysql as restful service on koa v1\n\n[中文版](./README_ZH.md)\n\n# Usage\n```javascript\n\nconst koa = require('koa');\n\nconst {DatahubRestfulCore} = require('../index');\nlet port = process.env.PORT || 3003;\nlet host = process.env.IP || '127.0.0.1';\n\nconst core = new DatahubRestfulCore({\n    port, host,\n    name: 'demo',\n    endpoint: \"/\",\n    options:\n        {\n            client: 'mysql',\n            connection: {\n                host: '127.0.0.1',\n                user: 'root',\n                password: '',\n                database: 'datahub',\n                supportBigNumbers: true,\n                bigNumberStrings: true,\n                multipleStatements: true\n            },\n            acquireConnectionTimeout: 60000,\n            pool: {min: 0, max: 2}\n        }\n});\n\napp = core.mount(koa());\n\napp.listen(port, host, function () {\n    console.log('Datahub started http://%s:%s', host, port);\n});\n\n//curl -v http://127.0.0.1:3003/demo/\n\n```\n\n# features:-)\n\n- router rules\n- restful interfaces \n- POST/GET/PUT/DELETE\n- pagination\n- order by\n- composite primary keys\n- custom SQL\n- search\n- or condition\n- hooks\n- not \n- in,not in \n- between,not between \n- null，empty string\n- charset\n  \n# misc\n\n- execute vm\n- export to xls file\n- import\n\n\n# URL schema\n\n## API\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\n - declare charset: ?_charset=utf8\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\n RESTFUL support on above url\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\n    - support operators\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\n    - contains : like %keyword% contains keyword\n    - startswith: like keyword% starts with keyword\n    - endswith : like %keyword endswithkeyword \n    - gt or >:  greater than\n    - lt or < :  less than \n    - gte :  greater than or equals\n    - lte :less than or equals\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\n    - not: \n    - isnull:  IS NULL\n    - isnotnull: IS NOT NULL\n    - isempty: empty string\n    - isnotempty: not empoty string\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\n    - nested or more complex query，use the `complex query`\n    - return result example\n    ```json\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\n    ```\n - complex query：\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\n  - hooks\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\n           \n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \n         \n# KnexHelper object\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\n    - getDatabaseConnection(cdbId) get datbase raw connection object\n\n# Test\n\n```javascript\ntnpm i -g mocha\ntnpm run test\n```\n\nconst knex1 = require('knex')({\n            client: 'mysql',\n            connection: {\n                host: '172.21.16.20',\n                user: 'writeuser',\n                password: 's$%dSDdfdf3DYU23',\n                port: 23306,\n                insecureAuth: true,\n                supportBigNumbers: true,\n                bigNumberStrings: true\n            },\n            acquireConnectionTimeout: 60000\n        });\n        knex1.raw('show databases').then(console.log)\n","readmeFilename":"README.md","gitHead":"332b3b39fd1af7f1bafa47ca8c2fbe49588dc8e6","_id":"datahub-restful-core@2.0.0","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-yCJjHnXsvT4IDFwiJaz6hMIh+IsBgOrRmhjcs76YaB8m0IX78czRZZuXxy2nP18ILYBgc0FWcZcDrfOeRfxFBg==","shasum":"a9df67532a8f80be6f2e6dd9657e9642c86af3e8","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.0.0.tgz","fileCount":41,"unpackedSize":542647,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJepXadCRA9TVsSAnZWagAA8UQP/3QefLLLZuR55hZXprd1\nlf7w8J5jlIqYE3DCfNThqs8g6exqCmCzdUlVxzczNIUdokqz6ZO4/AATiUjW\nRmm4IN3NRcLWMUtCIo61LMFJ7xnj9XAwgdRzjMPyagQ+XQy5DPqknFjU9/jF\nfav5YGQRLPUVDlQlGij/s+mgFU45XPPNgdzCwJLHkeUL0RMV0AW7AbUQYDiB\ncUhwMUVkdtHhTn/X4gEEjVbcmEgD32lLqtKNxpo7rV3a5CjfPTfaSRHXd1sl\nBWxgQL+XEXFhdP2jsDOG5oNkX01HIHsPAxc3a6y5EJPIRlyqEnaRaYOlaLpo\nk5uL/xnREuFbsMcOnPOx89BTieJSgvcCb3A1PzJRPpDNWp0obEU6xwgrF8fi\nSxN6kY4HJJRr0JjVg5aEs3dX8lBEfgRBFt9r4XTn1fE5PVYjK3My3LuXHLwf\nV+Sam0ROkW77pyzSAcGqwBemEs2XkoMhR75YGOLzZVzC/tGDH3rrI0sDiFtr\nNlWHDiylvh28kgCjEGsvT/lQZJ4pkNaV97OAZ0nKHWMQuvKFucv/hx9En0w3\n8s6H8NDk1GikE2MlitstVCdZWL1B2fG0DlRNil8LG190lgTaq1m7A+XceP6o\nOR4Bk6yeKODBN377HudhQEJ2wmJgIs3P0cQHQ42SRGp46B3s1a271ZCj4j1k\nAtCS\r\n=Neqt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCCIfryIFphx62zSgCCHQYleX2fHWIOXAs3UIqKP2SS/QIhAJlY8ba13VX47RCPKmJv3lwS7EZuj9tpRfPPVw6gUB5P"}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.0.0_1587902108663_0.3696040964068923"},"_hasShrinkwrap":false},"2.0.1":{"name":"datahub-restful-core","version":"2.0.1","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","test:sqlparser":"mocha test/sqlParserTest.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"b6038b071aeab5459d7a4769f02db7decccb5d02","_id":"datahub-restful-core@2.0.1","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-j6HJg3+txyn9xEyeSsQUW+SDy3t2KuJQrGybzU2R+nSs7m1OireaVD7NXwMlKi6WrBZpTjK6royQKwby9vp1ZQ==","shasum":"f9e87df77f149703733f24440186fbb1afb8c8fc","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.0.1.tgz","fileCount":41,"unpackedSize":542548,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeplIcCRA9TVsSAnZWagAAp7QP/3k0uSGn6UsuMpgWXpoT\nr0/RypWTtrQBjqK6fL+vPpaISLIH4zrb2TCHMIvX9kch51tWYH15L6zDFmyp\nYShNvjDXLMtPYXaX3fcSKyVbt5fP89fvkTQRM7gAiHnhWS7dtoW+xlc/VMqu\ns/ByCmkz62/bUuabxEXWMzFDPeBLNSKjlbG1p26uf+NpI+gCgxlIfnTFkArG\nRGHvXlaLJg5Z5ZQktRwc32ki4zDuy23RG3eOZe4t2tzJIjhTgIAK3ATja6tt\nhcgl6+vr7Hmg19GbkJkmDKOgzRx0nzpMk+8AGvp9YqLWN8CdUBIfjbZEFTZv\n0vFGmBREe3UvXoA04Qd0oS5w5uSrXOq5jfkrz0lIt5TMhnLh8fROw1rKgNzp\nZrGIB7ldeETzzdIgLyqGJQaNBvvbfPH8RLEKwz6EuHYRtWs+igJ6U9uMVmuF\n65K4la/S81pG96V+6hcvZRvJOUJTHMVleZ1nTeS0ImbDQGPVGc3N60AFDUCF\ngWAzgpm98iXS3iLNGIwDCcOEA3aFWUonpnwNOOybQaMMSHn+mmEY4r9KgHbF\nLzGE4UuOOvzkv5BTgDuSEKLRtgxVhblDqlaYrpa1A/qloHC1P0vBu8CGyvgO\nQa14zAf/Davk73LXa8lbAmXJYtlRSYbeC09HqE/pV7uXvaQ9+UUqWGf/adYP\nX7ot\r\n=gCMe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC6DnaovQcanqqiF3CE2LiEHhujeku1sZL//zcIrCN5SgIhAJ3iuNT2MnRNgFaXz/lzzmzLPQOWJ2rL4W/VMQHXBbtY"}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.0.1_1587958300377_0.16387670421003842"},"_hasShrinkwrap":false},"2.0.2":{"name":"datahub-restful-core","version":"2.0.2","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","test:sqlparser":"mocha test/sqlParserTest.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"b6038b071aeab5459d7a4769f02db7decccb5d02","_id":"datahub-restful-core@2.0.2","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-U3Wj4js1Ah98/ahYHaaceE7TKxyH+39bi3GSC7L2MaMKmX0n7nlUY2In3AZDaXDlPeAZyxhntXrAlH7O82/4pQ==","shasum":"29f0b9b92e0646ca764e90b3c58f5d294928a9bf","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.0.2.tgz","fileCount":41,"unpackedSize":542571,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJepljyCRA9TVsSAnZWagAA9v8P/j0zZ3SslsAM5lcH81el\niuij/2MwcsRATz1nYy9HodivhVNJNfNRji30eNz17UZY9kd3R/XEUC9oGGMS\nVjIBt4aO1O7057mVFbDwxK+G6El9pGlBUS2Qa7+4GRUc6Nnyvt6vnrB1huxD\nWK8uX1ycxjkeiu5knbcOx8DMQZHX97cS/mHLdyDAbzpj1SZjY9CcooEpQZun\nVb7TrrPfCKmoA15ljIIYZJh7pPXpLySmMJPM6sKJghzPmCBQ+QmSVWXBWdjg\npSYV+5QkoVmTmZPHvW9JPIa+7A1hWWN2zn/W/73FkIqIiH+5jTv21vBLnRAk\nMaJfqEowvBo/Z8w/ytDGUMzuyaVuLvnahdX/r5fXa2VemxM9eS3zaQfSecIK\nfMKpW6eXhhtCtF+Fg1z6RWLAgOnIeB4i+6diNs+N7uHI2B8Qlqfl0y76qwA6\nvN2QyrE5BUuVQMeMroxPsEK7dtrk4Tsny1drep67Ioqwkhrj1cAQj8/Hi05G\nahsZrqyBn2GKnQJgcwm+Y6DlKHQOlGsO83vUd6cn6B9YMHi+U3g4J4jDzG7S\nea9pk2FMxPSBfDQAvnBrvk5/D+Ph+ChYpbtNijHyG4PsAfD8tSir5aYGxGKL\nqaarz1x7/1q42rxt0F7QvP4kyng+mpOkk2G40oeFXy93mZem5DmmekibHoLB\nGrKP\r\n=Sf70\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFzHLIk1WJ2Fyj3PwLqxht3btZKT2B7y9XTcWFeRkwljAiB1/lBlj0uf5IVUHsWwEVuaxouN0khC5wNkZJSz8OQ/zA=="}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.0.2_1587960049857_0.15196430417567885"},"_hasShrinkwrap":false},"2.0.3":{"name":"datahub-restful-core","version":"2.0.3","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","test:sqlparser":"mocha test/sqlParserTest.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"c1f96a023ca360019dcacaf8ea9c020a9f733f46","_id":"datahub-restful-core@2.0.3","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-10EEeGya50dbyW1CD/dNPGw2ja4Q2cOkbGrBMh38Amoqu5cfwr24vb0SjF4hkUJCNThi7xLYfRdTJJ3+2UdU6Q==","shasum":"f2241260a519c079b3da106b40d4dadd20dffcf1","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.0.3.tgz","fileCount":41,"unpackedSize":544986,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqPT6CRA9TVsSAnZWagAAAOsQAI87nVDPDYOJ1lLUm9Ys\nyupLCP3q5jdzdtKBko+WF7OtIVNlJTT7ER6rM6FEIKhepep4m94HvUaypxvc\nE86eGaXbKEJl8goEEMA5iOY73/jkKvC5PcEUm2N5YWaWxA8ZDUbxeXqXGZr4\ncx98ylbTGuD6Os4eLKTR5+Zu0zYVutRr286j9R8KhypsfMmMEUOuLutACdCZ\n3d80696WxGRJKAHLgv7DJZUZWY9n3L9x1wY4NVL3vnirPaJIGXVlD7TwItGN\nhWn8AWaBD0PRZVvV9mbFKMN+ZfbhthJu5AQuqrCNbCrC3dsOfAXCgScZSHrh\ngW225TzALbpWxtfaSC6z3z0nSa64apyLilgdIVfCt0GESdOfZZqkgP/ebuKf\nGnxMEz7Ks3XeR5+k0ylFLmRWkuBSc/x+6sgNO1ka1rAENB/QrNj1SYOoIusP\n24tZprAjzfiALjW4GjFyGufPqIA8tHoCDqFCMs1cvzISTEWO3e6z0VZgEHxF\n5ptMMy6o41Y7raxjXXU0dqXXCQRZk486QiuygkHH6fjmz55VeUWLhY1yowHm\nRsiW8Y7ruoeMJpQoA5o9Ho3YHCFgf+nPGmOsMGN+ZZhfTSHmhrmda+JWJE9M\n/os1/YEqIX6h2t56mWHb7jxilZcq4tEkMZdu36/dQizWq66bTX6WtoIhRFlB\nwLvZ\r\n=0TME\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID67NE3hTdJm8syx1TA8YzeeUdvc+Q/j5Wy75IIg3KvgAiEAq2ONgACRq5FRE1Eoq4Hv3Q5p4AcM5lEcHnBSbQIIx6s="}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.0.3_1588131065681_0.17510365039248077"},"_hasShrinkwrap":false},"2.1.0":{"name":"datahub-restful-core","version":"2.1.0","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","test:sqlparser":"mocha test/sqlParserTest.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"aaf65810db43dab15176e8b916ace5d3e8df7e4e","_id":"datahub-restful-core@2.1.0","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-2dHWhugpj43kitq7Jw9a+O6jeAtFD3ht2gvjUkH/fWdin/VfUkdBD+aHxQg+56ukT3YyVmZfvDOS4xIFcF+jAQ==","shasum":"0ad1c85393c003e5bd78a58574ef3c0376ca3e8f","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.1.0.tgz","fileCount":41,"unpackedSize":546099,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4v4eCRA9TVsSAnZWagAAl6oP+wYV27H9RHEFQjQdkpsr\nDFOURii0fEVVAaVt3kL/2SVFfS9SQZ4XUMo6iZ+zp99VNamh1r2n/xhKJ1I1\nX8NngK7QHBCkB4zYuufrkri7ULKCsqay/Nc3bSIIZcxWzcjZ1+d6Hb/wkNu/\nAElTZwKcWdEuD1G9eLV4YsDZaanODnvpvphFYCwzYDFANuaLCbL3g0qp86hK\nP7KHwAX6V/+P8KqN+/9y+q5b9Ys7oJqjvhXMT6eFOhsDgZVKCO4cxRT5sbtB\nFdrs4ZHvARAnpNJBIOXkoQDMhyoJUwLu3Il5jEvQZK+YyTvl6se06bICJJaJ\nOQkfzmY81b5R+TZmZ19L4J/GOUzNwBLkoMTb9fKpLsHI3fuhH/XWQMtjy9wq\nwJ/fvkMNXEFNc6y5YCvpWG3/RiITL6OTBQvIz12ZpYhj1OsyEWSbWKjPvpNo\njD6R1lAJK1MYmyXNxabCKvLImeekLgF7Vk1M0ui1j3jrywkK0JwpgLBb/Ph8\n/JM5bN7JPus20kEGPpVWr1TdbRk58rTLtF0IWJQ544/TkjvUq0FTCtQOX3Y7\nmvtUJJ8iUKLt0SWyvu/ndEBNIaY+tRcYaqgh2Np95puro/WJ0zaaf/b3yraa\nhe99URVWxNAoKeX4HLrxhmULgpQuGVSEBnBz/qiHBD22PWpXhonHXh5IOt5D\nHv/U\r\n=YFFU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDFxna6fQN5qQqfVuRN49R/YvMl52J+Vf3gyqKx2A2bmgIgTp2r6HY3jxXAcQ42am/XsqJ13aLH0JoS99MM172tH4E="}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.1.0_1591934493901_0.3595354786683116"},"_hasShrinkwrap":false},"2.1.1":{"name":"datahub-restful-core","version":"2.1.1","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","test:sqlparser":"mocha test/sqlParserTest.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/register":"^7.4.4","babel-plugin-istanbul":"^5.1.4","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.0.0","should":"^9.0.2"},"dependencies":{"koa":"1.x","bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.15.2","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-body":"^1.4.0","koa-static":"^2.0.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","request":"^2.74.0","request-promise":"^4.1.1","objstream":"^1.0.1","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"3a288630f0d3cf11bab69d41d6c7b66e59c462d3","_id":"datahub-restful-core@2.1.1","_nodeVersion":"12.16.2","_npmVersion":"6.14.4","dist":{"integrity":"sha512-oLwjIrw+EMKUeCzn7IktpjkDz3Bwar6jkLv1tntH3hTPNQ94cWEuTAwQnwJOzTYrCL6Hd9OQ22LhYWJq7McqYg==","shasum":"cedfc9d160aa0eb3afe4ac4d6153957e473241f0","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.1.1.tgz","fileCount":41,"unpackedSize":545965,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe5xiFCRA9TVsSAnZWagAA3XIP/iB3x/zzoFrvfSetY/XZ\niIk2yeuFC7aVudG7bS0ErV/XsmePaFpBs587S/n2aDLE7UEe+l2PTYR/YOC3\nknGhvcFyOroK7HvUTADQVXiq4teIH4ubdlOYZwjMfzcBmfxEW1evNohmzP/x\naocypAsM2aXCJeA5AyfIxbYYXwJDa5ECkX/MZfxdyCsmX1Dtz4gN7anW7R6L\nvetNXECgm1plTg5p/9TxWAUu5mPuXQY2CHo9W/yuBkgIH24miEnVlD8E9T9b\npK9yr8xoNzCVNUs9/Qx7PelPuSMe4Mb1M88ymjPd6soJmvJWNb2F4sZkhJek\niGIrPqLteoCqo5Dm2rQrwapvbZM72rYRTMENaOHgv86cm4rYl7iaX+rG4IaV\nX9mQEM++GGb86vwWQeGtuGfPrCIty3kQ5JeRLWIGLM+J+tgx/ZrvX5aPo804\nv0AwEYZnre9DMCPHU8QAf6TlwXtaLx5BOV2TzYyc6BPLB5XPzMZa38y6Wx7t\nYrG49T1sYUCgQu0HWogsilNyua/a+0arYWSN41vi4Linj48vxLT0q0ycGiba\nmUHMUtE7I7xJNVKzcb3pnffd/drYZvi1edcLKqvoxoC9SxuJU7uuLxbrdH0f\n3X1CLMu+tX1oWf4raecvriFtKYwnhtl+XXVunRSiIecdQXrVKNmlpv4ApEz+\nCG08\r\n=hftR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC//A2FyupwvVjeWE00gVGJXMG3tlPQwTENsNxJZpp30AIgE7xdB3wpP2CU8/me7G6e76lXtvcLNDSljWxSeG51LT4="}]},"maintainers":[{"email":"eggcanfly@qq.com","name":"eggcanfly"},{"email":"jifengwang@tencent.com","name":"jifengwang"}],"_npmUser":{"name":"jifengwang","email":"jifengwang@tencent.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.1.1_1592203397394_0.8138295306435066"},"_hasShrinkwrap":false},"2.1.2":{"name":"datahub-restful-core","version":"2.1.2","description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"main":"index.js","scripts":{"test":"mocha test/**/*.js","test:sqlparser":"mocha test/sqlParserTest.js","coverage":"cross-env NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/mocha test/**/*.js","gen":"pegjs ./core/sql/pegjs/sql.pegjs ./core/sql/pegjs/pegjs-parser.js"},"author":"","license":"ISC","devDependencies":{"@babel/core":"^7.12.3","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/polyfill":"^7.4.4","@babel/preset-env":"^7.12.1","@babel/register":"^7.12.1","babel-plugin-istanbul":"^6.0.0","cross-env":"^5.2.0","mocha":"^3.2.0","node-dev":"^3.1.0","nyc":"^14.1.1","should":"^9.0.2"},"dependencies":{"bluebird":"^3.5.3","co":"^4.6.0","crc":"*","debug":"^2.6.9","flora-sql-parser":"^0.6.0","fs-extra":"^0.30.0","knex":"^0.21.12","koa":"1.x","koa-body":"^1.7.0","koa-generic-session":"^1.11.1","koa-router":"^5.4.2","koa-static":"^2.1.0","micromatch":"^2.3.11","moment":"^2.15.1","mysql":"^2.16.0","node-xlsx":"^0.7.2","objstream":"^1.0.1","request":"^2.88.2","request-promise":"^4.2.6","xlsx":"^0.8.0"},"nyc":{"sourceMap":false,"instrument":false,"require":["@babel/register","@babel/polyfill"]},"gitHead":"2dc3b7590b4fef4e734b753542ff22857f11f86f","_id":"datahub-restful-core@2.1.2","_nodeVersion":"12.16.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-eevNH5T00O4HilZT44hj6Vgpg4V69j3q52LTp4iQrYPQPy7A4Se2Iw30Ddsp2WqfKk+fb0Cu+CUvvQFJEHwh0g==","shasum":"4d677b6901e88b8bffa8f2d2e56a391455574a21","tarball":"https://registry.npmjs.org/datahub-restful-core/-/datahub-restful-core-2.1.2.tgz","fileCount":39,"unpackedSize":526674,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1uGFCRA9TVsSAnZWagAAYooQAJxgv0bw3p0joaDkdOpU\nnYAs8xopF9/bgbZdEqt3Rlk7mM1XDv5JZc4EI97lCohFHZNQSjwVAupec/dl\n9gByo42wvNdkD9OVkO4nA7sEnbK3kuRhkFFIHQTtH2hLBenBpq8QA/BTngWn\n+OcRuX79m9vW0lAiNZ8MokhGMByT+SsW1yQuPNKW2f3w+pp+W5mqJ1XpLCRN\n564kaiaADb5KbyYou0DaLgCTsO6UsVfK4gmqBWNHu3MrFANzbsA7yXsbvUf0\nquXXDvoRSoe3nv18IWDiH6YjgZSu7foioqQBE57DmvU8rHhAWs7N1S8vGdKY\n9aLm8wXfI+QqPllmjf24li+CDdg9Fqqhp1z9cFis63fkEy9UmrpOm+Vzh0xM\n3gjEIymn60Hf+vT5BB2CKr70NxAV/qylpa0F5b5k+4jH6EvQQRgJ093EViiS\nRmuf/Phb5ySjmDmAmw4gu4X2cLzy5Nsw3ArWirkwjzkBdP6/PRj7D6GI7DZf\nCz7FCFKgdwvfC7BC+iNCvLsgxbuMTaP8JNaR9pG1uvp31Suti7ypy8XKm1G+\nu3P94PsG2ctEFZDtbvpfD7yZrU48ESSS1FQ9hURuJBobvN8mArjOwg4yZ+wL\nfIDr/ZLMxaEuwPDTsoi/b3Ofc9/16k/9QN5ofyjUHNpn2/bOpZgMTa6r8slK\nC1QU\r\n=Ynwo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDf0c4t42iF1HR5YWASmgO7h64+wCelw7SSzmkPi/tTiQIgMNueQPA9PciW0Qonrg31r+UnYUWuXblWQNQJy60MgjQ="}]},"_npmUser":{"name":"eggcanfly","email":"eggcanfly@qq.com"},"directories":{},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"},{"name":"jifengwang","email":"jifengwang@tencent.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/datahub-restful-core_2.1.2_1607917957056_0.013866937336899365"},"_hasShrinkwrap":false}},"time":{"created":"2019-04-25T11:53:13.014Z","1.0.0":"2019-04-25T11:53:13.205Z","modified":"2022-04-28T05:12:25.335Z","1.0.1":"2019-05-08T04:57:03.643Z","1.0.2":"2019-05-08T05:41:43.436Z","1.0.3":"2019-05-28T05:43:46.249Z","1.0.4":"2019-05-29T09:21:56.631Z","1.0.5":"2019-05-29T11:41:53.842Z","1.0.6":"2019-06-12T04:46:17.781Z","1.0.7":"2019-06-12T07:05:26.086Z","1.0.8":"2019-08-20T03:51:30.189Z","1.0.9":"2019-09-05T06:35:52.705Z","1.1.0":"2019-09-06T03:52:23.646Z","1.1.1-beta":"2019-10-08T10:21:51.662Z","1.1.1-beta2":"2019-10-08T11:22:07.956Z","1.1.1-beta3":"2019-10-08T12:18:32.504Z","1.1.1-beta4":"2019-10-09T06:27:16.208Z","1.1.1-beta5":"2019-10-09T08:52:52.258Z","1.1.1":"2019-10-10T03:40:24.797Z","1.1.2":"2019-10-10T07:23:53.453Z","1.1.3":"2019-10-10T13:01:28.581Z","1.1.4":"2019-10-14T10:57:15.921Z","1.1.5-beta":"2019-10-15T04:04:42.514Z","1.1.5-beta2":"2019-10-15T07:44:34.918Z","1.1.5":"2019-10-15T08:15:26.351Z","1.1.6":"2019-10-18T03:11:57.620Z","1.1.7-privilege1":"2019-10-21T03:06:46.149Z","1.1.7-privilege2":"2019-10-21T03:32:08.155Z","1.1.7-privilege3":"2019-10-21T06:59:06.694Z","1.1.7-privilege4":"2019-10-21T07:42:32.580Z","1.1.7-privilege5":"2019-10-21T08:04:26.032Z","1.1.7-privilege6":"2019-10-21T09:01:57.904Z","1.1.7-beta1":"2019-10-21T13:32:01.783Z","1.1.8-beta1":"2019-10-21T13:47:21.534Z","1.1.8":"2019-10-21T14:25:18.094Z","1.1.7-privilege7":"2019-10-22T03:45:35.878Z","1.1.9":"2019-11-21T03:34:29.866Z","1.2.0":"2019-11-22T09:27:32.877Z","1.2.1":"2019-12-11T15:46:08.052Z","1.3.1":"2020-01-16T06:40:37.423Z","1.2.2":"2020-04-16T13:24:44.334Z","1.2.3":"2020-04-17T02:34:09.627Z","2.0.0-test.1":"2020-04-17T09:34:11.758Z","1.2.4":"2020-04-20T03:22:18.081Z","2.0.0-test.2":"2020-04-20T06:21:04.309Z","2.0.0-test.3":"2020-04-25T16:18:15.398Z","2.0.0-test.4":"2020-04-26T03:17:19.888Z","2.0.0":"2020-04-26T11:55:08.851Z","2.0.1":"2020-04-27T03:31:40.543Z","2.0.2":"2020-04-27T04:00:50.085Z","2.0.3":"2020-04-29T03:31:05.879Z","2.1.0":"2020-06-12T04:01:34.117Z","2.1.1":"2020-06-15T06:43:17.561Z","2.1.2":"2020-12-14T03:52:37.292Z"},"maintainers":[{"name":"eggcanfly","email":"eggcanfly@qq.com"},{"name":"jifengwang","email":"jifengwang@tencent.com"}],"description":"export mysql restful interface for koa v1","keywords":["mysql","restful","koa","koa1"],"license":"ISC","readme":"# datahub-restful-core [![NPM version](https://img.shields.io/npm/v/datahub-restful-core.svg?style=flat)](https://www.npmjs.com/package/datahub-restful-core) [![NPM monthly downloads](https://img.shields.io/dm/npm/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![NPM total downloads](https://img.shields.io/npm/dt/datahub-restful-core.svg?style=flat)](https://npmjs.org/package/datahub-restful-core) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/datahub-restful-core.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/datahub-restful-core) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/datahub-restful-core.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/datahub-restful-core)\n\n## export mysql as restful service on koa v1\n\n[中文版](./README_ZH.md)\n\n# Usage\n```javascript\n\nconst koa = require('koa');\n\nconst {DatahubRestfulCore} = require('../index');\nlet port = process.env.PORT || 3003;\nlet host = process.env.IP || '127.0.0.1';\n\nconst core = new DatahubRestfulCore({\n    port, host,\n    name: 'demo',\n    endpoint: \"/\",\n    options:\n        {\n            client: 'mysql',\n            connection: {\n                host: '127.0.0.1',\n                user: 'root',\n                password: '',\n                database: 'datahub',\n                supportBigNumbers: true,\n                bigNumberStrings: true,\n                multipleStatements: true\n            },\n            acquireConnectionTimeout: 60000,\n            pool: {min: 0, max: 2}\n        }\n});\n\napp = core.mount(koa());\n\napp.listen(port, host, function () {\n    console.log('Datahub started http://%s:%s', host, port);\n});\n\n//curl -v http://127.0.0.1:3003/demo/\n\n```\n\n# features:-)\n\n- router rules\n- restful interfaces \n- POST/GET/PUT/DELETE\n- pagination\n- order by\n- composite primary keys\n- custom SQL\n- search\n- or condition\n- hooks\n- not \n- in,not in \n- between,not between \n- null，empty string\n- charset\n  \n# misc\n\n- execute vm\n- export to xls file\n- import\n\n\n# URL schema\n\n## API\n - all databases: [your ip:port/api/v1/databases](your ip:port/api/v1/databases)\n - all schemas of some database: [your ip:port/api/v1/{database}](your ip:port/api/v1/{db})\n - declare charset: ?_charset=utf8\n - all tables of some schema  : [your ip:port/api/v1/{db}/{schema}](your ip:port/api/v1/{db}/{schema})\n - table of schema : [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\n RESTFUL support on above url\n - query: GET to [your ip:port/api/v1/{db}/{schema}/{table}?{k}={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}={v})\n    - support operators\n    e.g. contains: [your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}](your ip:port/api/v1/{db}/{schema}/{table}?{k}:contains={v}),list all records contains keyword v\n    - contains : like %keyword% contains keyword\n    - startswith: like keyword% starts with keyword\n    - endswith : like %keyword endswithkeyword \n    - gt or >:  greater than\n    - lt or < :  less than \n    - gte :  greater than or equals\n    - lte :less than or equals\n    - pagination: page=0 （0 represents first page）pageSize=3（records per page）\n    - order by: _sort=-policy_name,id order by policy_name desc and order by id asc,\n    - Or: [your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2}](your ip:port/api/v1/{db}/{schema}/{table}?k=v&{or:k2}={v2})\n    - not: \n    - isnull:  IS NULL\n    - isnotnull: IS NOT NULL\n    - isempty: empty string\n    - isnotempty: not empoty string\n    - in / notin: parameters are array `somecolumn:in=a,b,c` or`somecolumn:in=a&somecolumn:in=b&somecolumn:in=c`\n    - between / notbetween: parameters are array `somecolumn:between=1,100`\n    - nested or more complex query，use the `complex query`\n    - return result example\n    ```json\n    {\"content\":[{\"id\":83,\"wifi_id\":85,\"policy_name\":\"wifi83_-78486031\",\"status\":-1,\n    \"create_time\":\"2016-05-12T12:43:19.000Z\"},{\"id\":70,\"wifi_id\":82,\"policy_name\":\"wifi\",\n    \"status\":-1,\"create_time\":\"2016-05-11T02:57:22.000Z\"},\n    {\"id\":75,\"wifi_id\":82,\"policy_name\":\"wifi\",\n    \"status\":1,\"create_time\":\"2016-05-11T03:56:19.000Z\"}],\n    \"page\":{\"size\":30,\"totalElements\":3,\"totalPages\":1,\"number\":0}}\n    ```\n - complex query：\n - get: GET [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - get(composite primary keys): GET [your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b}](your ip:port/api/v1/{db}/{schema}/{table}/{key1}={a};{key2}={b})\n - create: JSON POST to [your ip:port/api/v1/{db}/{schema}/{table}](your ip:port/api/v1/{db}/{schema}/{table})\n - update: JSON PUT to [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - delete: DELETE [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - patch(Partial update):  PATCH [your ip:port/api/v1/{db}/{schema}/{table}/{id}](your ip:port/api/v1/{db}/{schema}/{table}/{id})\n - custom SQL: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}](your ip:port/api/v1/{db}/{schema}/_q/{key})\n - custom SQL with pagination: GET [your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination](your ip:port/api/v1/{db}/{schema}/_q/{key}/pagination)\n  - hooks\n    - pre hook * [your ip:port/api/v1/*?_hook:before=someHook1](your ip:port/api/v1/*?_hook:before=someHook1)\n    - post hook * [your ip:port/api/v1/*?_hook:after=someHook1](your ip:port/api/v1/*?_hook:after=someHook1)\n           \n - execute SQL: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor](your ip:port/api/v1/{db}/sqlExecutor)\n - execute SQL with pagination: GET/POST sql to [your ip:port/api/v1/{db}/sqlExecutor/pagination](your ip:port/api/v1/{db}/sqlExecutor/pagination)\n  - support queryString as ?sql=`select * from t_x_table where f_some_field = :value`&value=value \n         \n# KnexHelper object\n    - getInternalApiUrl() get internal api url`http://${host}:${port}${endpoint}`\n    - * findConnectionByDbkey(dbkey) get the db id as `cdb_x`\n    - getDatabaseConnection(cdbId) get datbase raw connection object\n\n# Test\n\n```javascript\ntnpm i -g mocha\ntnpm run test\n```\n","readmeFilename":"README.md"}