column_definition.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. var Packet = require('../packets/packet');
  2. // creating JS string is relatively expencive (compared to
  3. // reading few bytes from buffer) because all string properties
  4. // except for name are unlikely to be used we postpone
  5. // string conversion until property access
  6. //
  7. // TODO: watch for integration benchmarks (one with real network buffer)
  8. // there could be bad side effect as keeping reference to a buffer makes it
  9. // sit in the memory longer (usually until final .query() callback)
  10. // Latest v8 perform much better in regard to bufferer -> string convertion,
  11. // at some point of time this optimisation might become unnecessary
  12. // see https://github.com/sidorares/node-mysql2/pull/137
  13. //
  14. function ColumnDefinition(packet)
  15. {
  16. this._buf = packet.buffer;
  17. this._catalogLength = packet.readLengthCodedNumber();
  18. this._catalogStart = packet.offset;
  19. packet.offset += this._catalogLength;
  20. this._schemaLength = packet.readLengthCodedNumber();
  21. this._schemaStart = packet.offset;
  22. packet.offset += this._schemaLength;
  23. this._tableLength = packet.readLengthCodedNumber();
  24. this._tableStart = packet.offset;
  25. packet.offset += this._tableLength;
  26. this._orgTableLength = packet.readLengthCodedNumber();
  27. this._orgTableStart = packet.offset;
  28. packet.offset += this._orgTableLength;
  29. // name is always used, don't make it lazy
  30. this.name = packet.readLengthCodedString();
  31. this._orgNameLength = packet.readLengthCodedNumber();
  32. this._orgNameStart = packet.offset;
  33. packet.offset += this._orgNameLength;
  34. packet.skip(1); // length of the following fields (always 0x0c)
  35. this.characterSet = packet.readInt16();
  36. this.columnLength = packet.readInt32();
  37. this.columnType = packet.readInt8();
  38. this.flags = packet.readInt16();
  39. this.decimals = packet.readInt8();
  40. }
  41. var addString = function(name) {
  42. Object.defineProperty(ColumnDefinition.prototype, name, { get: function() {
  43. var start = this['_' + name + 'Start'];
  44. var end = start + this['_' + name + 'Length'];
  45. return this._buf.utf8Slice(start, end);
  46. }});
  47. };
  48. addString('catalog');
  49. addString('schema');
  50. addString('table');
  51. addString('orgTable');
  52. addString('orgName');
  53. ColumnDefinition.prototype.inspect = function() {
  54. return {
  55. catalog : this.catalog,
  56. schema : this.schema,
  57. name : this.name,
  58. orgName : this.orgName,
  59. table : this.table,
  60. orgTable : this.orgTable,
  61. characterSet: this.characterSet,
  62. columnLength: this.columnLength,
  63. columnType : this.columnType,
  64. flags : this.flags,
  65. decimals : this.decimals
  66. };
  67. };
  68. ColumnDefinition.toPacket = function(column, sequenceId)
  69. {
  70. var length = 0;
  71. var fields = 'catalog schema table orgTable name orgName'.split(' ');
  72. function addFieldLength(name) {
  73. var str = column[name];
  74. length +=Packet.lengthCodedNumberLength(str);
  75. length += str.length;
  76. }
  77. fields.forEach(addFieldLength);
  78. length += 13;
  79. var buffer = new Buffer(length);
  80. for (var i=0; i < length; ++i)
  81. buffer[i] = 0;
  82. function writeField(name) {
  83. packet.writeLengthCodedString(column[name]);
  84. }
  85. var packet = new Packet(sequenceId, buffer, 0, length);
  86. packet.offset = 4;
  87. fields.forEach(writeField);
  88. packet.writeInt8 (0x0c);
  89. packet.writeInt16(column.characterSet);
  90. packet.writeInt32(column.columnLength);
  91. packet.writeInt8 (column.columnType);
  92. packet.writeInt16(column.flags);
  93. packet.writeInt8 (column.decimals);
  94. return packet;
  95. };
  96. module.exports = ColumnDefinition;