Jump To …

rowParser.js

Author: H.Ristau

methods for parsing rows (oxd1 token) from a result set.

requires:

public:

var typeParser = require(__dirname + '/typeParser.js');

var rowParser = {


top

function parseColMetaData

parsing the meta data from a column


  parseColMetaData: function (type, data, offset) {

    

used for tablename detection in colmetadata


    var flags = data.readUInt16LE(offset-2, false);

    

the types text, ntext and image comes with a tablename in the metadata


    if( ( (type == 0x22) || (type == 0x23) || (type == 0x63) ) && flags == 0x09 )
    {
      

reading the length oh the tablename


      offset += typeParser.tp[type].metaLen-1;
      var tableNameLength = data.readUInt16LE(offset, false)*2;
      offset+=2;

      

reading the tablename


      var tableName = data.toString('ucs2', offset, offset+tableNameLength);

      offset += tableNameLength;
    }
    else
    {
      

types without tablene in metadata


      offset += typeParser.tp[type].metaLen;
      offset++;
    }

    var precision = null;
    var scale = null;

    

reading precision and scale for numeric and decimal types


    if( (type == 0x6c) || (type == 0x6a) ) {
      precision = data.readUInt8(offset, false);
      offset++;
      scale = data.readUInt8(offset, false);
      offset++;
    }


    

reading the length of the column name


    var length = data.readUInt8(offset, false)*2;

    offset++;

    

reading the column name


    var val = data.toString('ucs2', offset, offset+length);
    offset += length;

    return ({ value:val,
              precision : precision,
              scale : scale,
              newOffset: offset } );
  },


  parseRowData: function (cols, data, offset) {

top

function parseRowData

parsing the data columns of a row


    var result = { rows: new Array(), offset: 0, error: {sqlErrNo: null, message: ''} };
    var colCount = Object.keys(cols).length;

    var r=0;

    

loop over all colummn of a row


    while ((data[offset] != 0xfd) && (data[offset] != 0xff))
    {
      if ((data[offset] == 0xd1)){
        offset++;
      }

      result.rows[r] = new Array();

      for (var i=0; i<colCount; i++)
      {
        

check error message instead of columnvalue
- only it is a type with variable length
and
- token is error/ info message (0xab)


        if ( (typeParser.tp[cols[i].type].vLen !== 0) &&
             (data[offset] == 0xab) || ((data[offset] == 0x00) && (data[offset+1] == 0xab)) 
           ) 
        {
          if ((data[offset] == 0x00) && (data[offset+1] == 0xab)){
            offset++;
          }
            parseResult = typeParser.parseType(data[offset], data, ++offset)
        }
        else {
          

read a value with typeParser


          parseResult = typeParser.parseType(cols[i].type, data, offset, cols[i].precision, cols[i].scale);
          result.rows[r][i] = parseResult.value;
        } 


        
        if (parseResult.error) {
          result.error = parseResult.error;
        }

        offset = parseResult.newOffset;
      }
      r++;
    }

    result.offset = offset;
    return result;
  }

}

module.exports = rowParser;