cli.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. 'use strict'
  2. const fs = require('fs')
  3. const path = require('path')
  4. const sql = require('./tedious')
  5. const exit = process.exit
  6. const write = text => process.stdout.write(text)
  7. Buffer.prototype.toJSON = () => {
  8. return `0x${this.toString('hex')}`
  9. }
  10. // Resolve config path
  11. let cfgPath = path.resolve(process.argv[2] || process.cwd())
  12. if (fs.lstatSync(cfgPath).isDirectory()) {
  13. cfgPath = path.resolve(cfgPath, './.mssql.json')
  14. }
  15. if (!fs.existsSync(cfgPath)) {
  16. console.error('Config file not found.')
  17. exit(1)
  18. }
  19. // Config checks & parse
  20. let config
  21. try {
  22. config = fs.readFileSync(cfgPath)
  23. } catch (err) {
  24. console.error(`Failed to load config file. ${err.message}`)
  25. exit(1)
  26. }
  27. try {
  28. config = JSON.parse(config)
  29. } catch (err) {
  30. console.error(`Failed to parse config file. ${err.message}`)
  31. exit(1)
  32. }
  33. // Read stdin
  34. const buffer = []
  35. process.stdin.setEncoding('utf8')
  36. process.stdin.on('readable', () => buffer.push(process.stdin.read()))
  37. process.stdin.on('end', () => {
  38. const statement = buffer.join('')
  39. let rst = 0
  40. let index = 0
  41. if (!statement.length) {
  42. console.error('Statement is empty.')
  43. exit(1)
  44. }
  45. sql.connect(config, err => {
  46. if (err) {
  47. console.error(err.message)
  48. exit(1)
  49. }
  50. write('[')
  51. const request = new sql.Request()
  52. request.stream = true
  53. request.on('recordset', () => {
  54. index = 0
  55. if (rst++ > 0) {
  56. write('],')
  57. }
  58. return write('[')
  59. })
  60. request.on('error', err => {
  61. console.error(err.message)
  62. sql.close()
  63. return exit(1)
  64. })
  65. request.on('row', row => {
  66. if (index++ > 0) {
  67. write(',')
  68. }
  69. return write(JSON.stringify(row))
  70. })
  71. request.on('done', () => {
  72. if (rst > 0) {
  73. write(']')
  74. }
  75. write(']\n')
  76. sql.close()
  77. return exit(0)
  78. })
  79. request.query(statement)
  80. })
  81. })
  82. process.on('uncaughtException', err => {
  83. if (err.code === 'EPIPE') {
  84. console.error('Failed to pipe output stream.')
  85. } else {
  86. console.error(err.message)
  87. }
  88. exit(1)
  89. })