arnaucube
arnaucube/thoughtsPublic Self-hosted repository
thoughts/node_modules/mongoose/node_modules/bson/deserializer_bak.js
node_modules/mongoose/node_modules/bson/deserializer_bak.jsRaw
  1"use strict"
  2
  3var writeIEEE754 = require('../float_parser').writeIEEE754,
  4	readIEEE754 = require('../float_parser').readIEEE754,
  5	f = require('util').format,
  6	Long = require('../long').Long,
  7  Double = require('../double').Double,
  8  Timestamp = require('../timestamp').Timestamp,
  9  ObjectID = require('../objectid').ObjectID,
 10  Symbol = require('../symbol').Symbol,
 11  Code = require('../code').Code,
 12  MinKey = require('../min_key').MinKey,
 13  MaxKey = require('../max_key').MaxKey,
 14  DBRef = require('../db_ref').DBRef,
 15  BSONRegExp = require('../regexp').BSONRegExp,
 16  Binary = require('../binary').Binary;
 17
 18var BSON = {};
 19
 20/**
 21 * Contains the function cache if we have that enable to allow for avoiding the eval step on each deserialization, comparison is by md5
 22 *
 23 * @ignore
 24 * @api private
 25 */
 26var functionCache = BSON.functionCache = {};
 27
 28/**
 29 * Number BSON Type
 30 *
 31 * @classconstant BSON_DATA_NUMBER
 32 **/
 33BSON.BSON_DATA_NUMBER = 1;
 34/**
 35 * String BSON Type
 36 *
 37 * @classconstant BSON_DATA_STRING
 38 **/
 39BSON.BSON_DATA_STRING = 2;
 40/**
 41 * Object BSON Type
 42 *
 43 * @classconstant BSON_DATA_OBJECT
 44 **/
 45BSON.BSON_DATA_OBJECT = 3;
 46/**
 47 * Array BSON Type
 48 *
 49 * @classconstant BSON_DATA_ARRAY
 50 **/
 51BSON.BSON_DATA_ARRAY = 4;
 52/**
 53 * Binary BSON Type
 54 *
 55 * @classconstant BSON_DATA_BINARY
 56 **/
 57BSON.BSON_DATA_BINARY = 5;
 58/**
 59 * ObjectID BSON Type
 60 *
 61 * @classconstant BSON_DATA_OID
 62 **/
 63BSON.BSON_DATA_OID = 7;
 64/**
 65 * Boolean BSON Type
 66 *
 67 * @classconstant BSON_DATA_BOOLEAN
 68 **/
 69BSON.BSON_DATA_BOOLEAN = 8;
 70/**
 71 * Date BSON Type
 72 *
 73 * @classconstant BSON_DATA_DATE
 74 **/
 75BSON.BSON_DATA_DATE = 9;
 76/**
 77 * null BSON Type
 78 *
 79 * @classconstant BSON_DATA_NULL
 80 **/
 81BSON.BSON_DATA_NULL = 10;
 82/**
 83 * RegExp BSON Type
 84 *
 85 * @classconstant BSON_DATA_REGEXP
 86 **/
 87BSON.BSON_DATA_REGEXP = 11;
 88/**
 89 * Code BSON Type
 90 *
 91 * @classconstant BSON_DATA_CODE
 92 **/
 93BSON.BSON_DATA_CODE = 13;
 94/**
 95 * Symbol BSON Type
 96 *
 97 * @classconstant BSON_DATA_SYMBOL
 98 **/
 99BSON.BSON_DATA_SYMBOL = 14;
100/**
101 * Code with Scope BSON Type
102 *
103 * @classconstant BSON_DATA_CODE_W_SCOPE
104 **/
105BSON.BSON_DATA_CODE_W_SCOPE = 15;
106/**
107 * 32 bit Integer BSON Type
108 *
109 * @classconstant BSON_DATA_INT
110 **/
111BSON.BSON_DATA_INT = 16;
112/**
113 * Timestamp BSON Type
114 *
115 * @classconstant BSON_DATA_TIMESTAMP
116 **/
117BSON.BSON_DATA_TIMESTAMP = 17;
118/**
119 * Long BSON Type
120 *
121 * @classconstant BSON_DATA_LONG
122 **/
123BSON.BSON_DATA_LONG = 18;
124/**
125 * MinKey BSON Type
126 *
127 * @classconstant BSON_DATA_MIN_KEY
128 **/
129BSON.BSON_DATA_MIN_KEY = 0xff;
130/**
131 * MaxKey BSON Type
132 *
133 * @classconstant BSON_DATA_MAX_KEY
134 **/
135BSON.BSON_DATA_MAX_KEY = 0x7f;
136
137/**
138 * Binary Default Type
139 *
140 * @classconstant BSON_BINARY_SUBTYPE_DEFAULT
141 **/
142BSON.BSON_BINARY_SUBTYPE_DEFAULT = 0;
143/**
144 * Binary Function Type
145 *
146 * @classconstant BSON_BINARY_SUBTYPE_FUNCTION
147 **/
148BSON.BSON_BINARY_SUBTYPE_FUNCTION = 1;
149/**
150 * Binary Byte Array Type
151 *
152 * @classconstant BSON_BINARY_SUBTYPE_BYTE_ARRAY
153 **/
154BSON.BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2;
155/**
156 * Binary UUID Type
157 *
158 * @classconstant BSON_BINARY_SUBTYPE_UUID
159 **/
160BSON.BSON_BINARY_SUBTYPE_UUID = 3;
161/**
162 * Binary MD5 Type
163 *
164 * @classconstant BSON_BINARY_SUBTYPE_MD5
165 **/
166BSON.BSON_BINARY_SUBTYPE_MD5 = 4;
167/**
168 * Binary User Defined Type
169 *
170 * @classconstant BSON_BINARY_SUBTYPE_USER_DEFINED
171 **/
172BSON.BSON_BINARY_SUBTYPE_USER_DEFINED = 128;
173
174// BSON MAX VALUES
175BSON.BSON_INT32_MAX = 0x7FFFFFFF;
176BSON.BSON_INT32_MIN = -0x80000000;
177
178BSON.BSON_INT64_MAX = Math.pow(2, 63) - 1;
179BSON.BSON_INT64_MIN = -Math.pow(2, 63);
180
181// JS MAX PRECISE VALUES
182BSON.JS_INT_MAX = 0x20000000000000;  // Any integer up to 2^53 can be precisely represented by a double.
183BSON.JS_INT_MIN = -0x20000000000000;  // Any integer down to -2^53 can be precisely represented by a double.
184
185// Internal long versions
186var JS_INT_MAX_LONG = Long.fromNumber(0x20000000000000);  // Any integer up to 2^53 can be precisely represented by a double.
187var JS_INT_MIN_LONG = Long.fromNumber(-0x20000000000000);  // Any integer down to -2^53 can be precisely represented by a double.
188
189var deserialize = function(buffer, options, isArray) {
190	var index = 0;
191	// Read the document size
192  var size = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24;
193
194	// Ensure buffer is valid size
195  if(size < 5 || buffer.length < size) {
196		throw new Error("corrupt bson message");
197	}
198
199	// Illegal end value
200	if(buffer[size - 1] != 0) {
201		throw new Error("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");
202	}
203
204	// Start deserializtion
205	return deserializeObject(buffer, options, isArray);
206}
207
208// // Reads in a C style string
209// var readCStyleStringSpecial = function(buffer, index) {
210// 	// Get the start search index
211// 	var i = index;
212// 	// Locate the end of the c string
213// 	while(buffer[i] !== 0x00 && i < buffer.length) {
214// 		i++
215// 	}
216// 	// If are at the end of the buffer there is a problem with the document
217// 	if(i >= buffer.length) throw new Error("Bad BSON Document: illegal CString")
218// 	// Grab utf8 encoded string
219// 	var string = buffer.toString('utf8', index, i);
220// 	// Update index position
221// 	index = i + 1;
222// 	// Return string
223// 	return {s: string, i: index};
224// }
225
226// Reads in a C style string
227var readCStyleStringSpecial = function(buffer, index) {
228	// Get the start search index
229	var i = index;
230	// Locate the end of the c string
231	while(buffer[i] !== 0x00 && i < buffer.length) {
232		i++
233	}
234	// If are at the end of the buffer there is a problem with the document
235	if(i >= buffer.length) throw new Error("Bad BSON Document: illegal CString")
236	// Grab utf8 encoded string
237	return buffer.toString('utf8', index, i);
238}
239
240var DeserializationMethods = {}
241DeserializationMethods[BSON.BSON_DATA_OID] = function(name, object, buffer, index) {
242	var string = buffer.toString('binary', index, index + 12);
243	object[name] = new ObjectID(string);
244	return index + 12;
245}
246
247DeserializationMethods[BSON.BSON_DATA_NUMBER] = function(name, object, buffer, index) {
248	object[name] = buffer.readDoubleLE(index);
249  return index + 8;
250}
251
252DeserializationMethods[BSON.BSON_DATA_INT] = function(name, object, buffer, index) {
253	object[name] = buffer.readInt32LE(index);
254	return index + 4;
255}
256
257DeserializationMethods[BSON.BSON_DATA_TIMESTAMP] = function(name, object, buffer, index) {
258  var lowBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24;
259  var highBits = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24;
260  object[name] = new Timestamp(lowBits, highBits);
261	return index;
262}
263
264DeserializationMethods[BSON.BSON_DATA_STRING] = function(name, object, buffer, index) {
265  var stringSize = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24;
266	if(stringSize <= 0 || stringSize > (buffer.length - index) || buffer[index + stringSize - 1] != 0) throw new Error("bad string length in bson");
267  object[name] = buffer.toString('utf8', index, index + stringSize - 1);
268  return index + stringSize;
269}
270
271DeserializationMethods[BSON.BSON_DATA_BOOLEAN] = function(name, object, buffer, index) {
272  object[name] = buffer[index++] == 1;
273	return index;
274}
275
276var deserializeObject = function(buffer, options, isArray) {
277  // Options
278  options = options == null ? {} : options;
279  var evalFunctions = options['evalFunctions'] == null ? false : options['evalFunctions'];
280  var cacheFunctions = options['cacheFunctions'] == null ? false : options['cacheFunctions'];
281  var cacheFunctionsCrc32 = options['cacheFunctionsCrc32'] == null ? false : options['cacheFunctionsCrc32'];
282  var promoteLongs = options['promoteLongs'] == null ? true : options['promoteLongs'];
283	var fieldsAsRaw = options['fieldsAsRaw'] == null ? {} : options['fieldsAsRaw'];
284  // Return BSONRegExp objects instead of native regular expressions
285  var bsonRegExp = typeof options['bsonRegExp'] == 'boolean' ? options['bsonRegExp'] : false;
286  var promoteBuffers = options['promoteBuffers'] == null ? false : options['promoteBuffers'];
287
288  // Validate that we have at least 4 bytes of buffer
289  if(buffer.length < 5) throw new Error("corrupt bson message < 5 bytes long");
290
291  // Set up index
292  var index = typeof options['index'] == 'number' ? options['index'] : 0;
293
294	// Read the document size
295  var size = buffer[index++] | buffer[index++] << 8 | buffer[index++] << 16 | buffer[index++] << 24;
296
297	// Ensure buffer is valid size
298  if(size < 5 || size > buffer.length) throw new Error("corrupt bson message");
299
300  // Create holding object
301  var object = isArray ? [] : {};
302
303  // While we have more left data left keep parsing
304  while(true) {
305    // Read the type
306    var elementType = buffer[index++];
307    // If we get a zero it's the last byte, exit
308    if(elementType == 0) break;
309    var name = readCStyleStringSpecial(buffer, index);
310		index = index + name.length + 1;
311
312		// console.log("----------- 0 " + elementType + " :: " + name)
313		index = DeserializationMethods[elementType](name, object, buffer, index);
314		// console.log('--------------- 1')
315  }
316
317  // Check if we have a db ref object
318  if(object['$id'] != null) object = new DBRef(object['$ref'], object['$id'], object['$db']);
319
320  // Return the final objects
321  return object;
322}
323
324/**
325 * Ensure eval is isolated.
326 *
327 * @ignore
328 * @api private
329 */
330var isolateEvalWithHash = function(functionCache, hash, functionString, object) {
331  // Contains the value we are going to set
332  var value = null;
333
334  // Check for cache hit, eval if missing and return cached function
335  if(functionCache[hash] == null) {
336    eval("value = " + functionString);
337    functionCache[hash] = value;
338  }
339  // Set the object
340  return functionCache[hash].bind(object);
341}
342
343/**
344 * Ensure eval is isolated.
345 *
346 * @ignore
347 * @api private
348 */
349var isolateEval = function(functionString) {
350  // Contains the value we are going to set
351  var value = null;
352  // Eval the function
353  eval("value = " + functionString);
354  return value;
355}
356
357module.exports = deserialize