| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 'use strict'
- const fs = require('fs')
- const path = require('path')
- const sql = require('./tedious')
- const exit = process.exit
- const write = text => process.stdout.write(text)
- Buffer.prototype.toJSON = () => {
- return `0x${this.toString('hex')}`
- }
- // Resolve config path
- let cfgPath = path.resolve(process.argv[2] || process.cwd())
- if (fs.lstatSync(cfgPath).isDirectory()) {
- cfgPath = path.resolve(cfgPath, './.mssql.json')
- }
- if (!fs.existsSync(cfgPath)) {
- console.error('Config file not found.')
- exit(1)
- }
- // Config checks & parse
- let config
- try {
- config = fs.readFileSync(cfgPath)
- } catch (err) {
- console.error(`Failed to load config file. ${err.message}`)
- exit(1)
- }
- try {
- config = JSON.parse(config)
- } catch (err) {
- console.error(`Failed to parse config file. ${err.message}`)
- exit(1)
- }
- // Read stdin
- const buffer = []
- process.stdin.setEncoding('utf8')
- process.stdin.on('readable', () => buffer.push(process.stdin.read()))
- process.stdin.on('end', () => {
- const statement = buffer.join('')
- let rst = 0
- let index = 0
- if (!statement.length) {
- console.error('Statement is empty.')
- exit(1)
- }
- sql.connect(config, err => {
- if (err) {
- console.error(err.message)
- exit(1)
- }
- write('[')
- const request = new sql.Request()
- request.stream = true
- request.on('recordset', () => {
- index = 0
- if (rst++ > 0) {
- write('],')
- }
- return write('[')
- })
- request.on('error', err => {
- console.error(err.message)
- sql.close()
- return exit(1)
- })
- request.on('row', row => {
- if (index++ > 0) {
- write(',')
- }
- return write(JSON.stringify(row))
- })
- request.on('done', () => {
- if (rst > 0) {
- write(']')
- }
- write(']\n')
- sql.close()
- return exit(0)
- })
- request.query(statement)
- })
- })
- process.on('uncaughtException', err => {
- if (err.code === 'EPIPE') {
- console.error('Failed to pipe output stream.')
- } else {
- console.error(err.message)
- }
- exit(1)
- })
|