A Twitch.tv viewer reward and games system.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.6 KiB

12 years ago
  1. var Types = require('../constants/types');
  2. var Charsets = require('../constants/charsets');
  3. var Field = require('./Field');
  4. module.exports = RowDataPacket;
  5. function RowDataPacket() {
  6. }
  7. RowDataPacket.prototype.parse = function(parser, fieldPackets, typeCast, nestTables, connection) {
  8. var self = this;
  9. var next = function () {
  10. return self._typeCast(fieldPacket, parser, connection.config.timezone);
  11. };
  12. for (var i = 0; i < fieldPackets.length; i++) {
  13. var fieldPacket = fieldPackets[i];
  14. var value;
  15. if (typeof typeCast == "function") {
  16. value = typeCast.apply(connection, [ new Field({ packet: fieldPacket, parser: parser }), next ]);
  17. } else {
  18. value = (typeCast)
  19. ? this._typeCast(fieldPacket, parser, connection.config.timezone)
  20. : ( (fieldPacket.charsetNr === Charsets.BINARY)
  21. ? parser.parseLengthCodedBuffer()
  22. : parser.parseLengthCodedString() );
  23. }
  24. if (typeof nestTables == "string" && nestTables.length) {
  25. this[fieldPacket.table + nestTables + fieldPacket.name] = value;
  26. } else if (nestTables) {
  27. this[fieldPacket.table] = this[fieldPacket.table] || {};
  28. this[fieldPacket.table][fieldPacket.name] = value;
  29. } else {
  30. this[fieldPacket.name] = value;
  31. }
  32. }
  33. };
  34. RowDataPacket.prototype._typeCast = function(field, parser, timeZone) {
  35. switch (field.type) {
  36. case Types.TIMESTAMP:
  37. case Types.DATE:
  38. case Types.DATETIME:
  39. case Types.NEWDATE:
  40. var dateString = parser.parseLengthCodedString();
  41. if (dateString === null) {
  42. return null;
  43. }
  44. if (timeZone != 'local') {
  45. if (field.type === Types.DATE) {
  46. dateString += ' 00:00:00 ' + timeZone;
  47. } else {
  48. dateString += timeZone;
  49. }
  50. }
  51. return new Date(dateString);
  52. case Types.TINY:
  53. case Types.SHORT:
  54. case Types.LONG:
  55. case Types.INT24:
  56. case Types.YEAR:
  57. case Types.FLOAT:
  58. case Types.DOUBLE:
  59. case Types.LONGLONG:
  60. case Types.NEWDECIMAL:
  61. var numberString = parser.parseLengthCodedString();
  62. return (numberString === null || (field.zeroFill && numberString[0] == "0"))
  63. ? numberString
  64. : Number(numberString);
  65. case Types.BIT:
  66. return parser.parseLengthCodedBuffer();
  67. case Types.STRING:
  68. case Types.VAR_STRING:
  69. case Types.TINY_BLOB:
  70. case Types.MEDIUM_BLOB:
  71. case Types.LONG_BLOB:
  72. case Types.BLOB:
  73. return (field.charsetNr === Charsets.BINARY)
  74. ? parser.parseLengthCodedBuffer()
  75. : parser.parseLengthCodedString();
  76. case Types.GEOMETRY:
  77. return parser.parseGeometryValue();
  78. default:
  79. return parser.parseLengthCodedString();
  80. }
  81. };