333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"use strict";
 
// s2.2.7.5/6/7
const STATUS = {
  MORE: 0x0001,
  ERROR: 0x0002,
  // This bit is not yet in use by SQL Server, so is not exposed in the returned token
  INXACT: 0x0004,
  COUNT: 0x0010,
  ATTN: 0x0020,
  SRVERROR: 0x0100
};
 
function parseToken(parser, options, callback) {
  parser.readUInt16LE(status => {
    const more = !!(status & STATUS.MORE);
    const sqlError = !!(status & STATUS.ERROR);
    const rowCountValid = !!(status & STATUS.COUNT);
    const attention = !!(status & STATUS.ATTN);
    const serverError = !!(status & STATUS.SRVERROR);
    parser.readUInt16LE(curCmd => {
      (options.tdsVersion < '7_2' ? parser.readUInt32LE : parser.readUInt64LE).call(parser, rowCount => {
        callback({
          name: 'DONE',
          event: 'done',
          more: more,
          sqlError: sqlError,
          attention: attention,
          serverError: serverError,
          rowCount: rowCountValid ? rowCount : undefined,
          curCmd: curCmd
        });
      });
    });
  });
}
 
module.exports.doneParser = doneParser;
 
function doneParser(parser, colMetadata, options, callback) {
  parseToken(parser, options, token => {
    token.name = 'DONE';
    token.event = 'done';
    callback(token);
  });
}
 
module.exports.doneInProcParser = doneInProcParser;
 
function doneInProcParser(parser, colMetadata, options, callback) {
  parseToken(parser, options, token => {
    token.name = 'DONEINPROC';
    token.event = 'doneInProc';
    callback(token);
  });
}
 
module.exports.doneProcParser = doneProcParser;
 
function doneProcParser(parser, colMetadata, options, callback) {
  parseToken(parser, options, token => {
    token.name = 'DONEPROC';
    token.event = 'doneProc';
    callback(token);
  });
}