Created
January 14, 2011 21:09
-
-
Save zippy1981/780246 to your computer and use it in GitHub Desktop.
Javascript object class for dealing with ObjectIds as JSON serialized by WCF
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* | |
* Copyright (c) 2011 Justin Dearing ([email protected]) | |
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) | |
* and GPL (http://www.opensource.org/licenses/gpl-license.php) version 2 licenses. | |
* This software is not distributed under version 3 or later of the GPL. | |
* | |
* Version 1.0.0-RC1 | |
* | |
*/ | |
/** | |
* Javascript representation of how WCF serializes a object of type MongoDB.Bson.ObjectId | |
* and the standard 24 character representation. | |
*/ | |
var ObjectId = (function () { | |
var increment = 0; | |
var pid = Math.floor(Math.random() * (32767)); | |
var machine = Math.floor(Math.random() * (16777216)); | |
if (typeof (localStorage) != 'undefined') { | |
var mongoMachineId = parseInt(localStorage['mongoMachineId']); | |
if (mongoMachineId >= 0 && mongoMachineId <= 16777215) { | |
machine = Math.floor(localStorage['mongoMachineId']); | |
} | |
// Just always stick the value in. | |
localStorage['mongoMachineId'] = machine; | |
document.cookie = 'mongoMachineId=' + machine + ';expires=Tue, 19 Jan 2038 05:00:00 GMT' | |
} | |
else { | |
var cookieList = document.cookie.split('; '); | |
for (var i in cookieList) { | |
var cookie = cookieList[i].split('='); | |
if (cookie[0] == 'mongoMachineId' && cookie[1] >= 0 && cookie[1] <= 16777215) { | |
machine = cookie[1]; | |
break; | |
} | |
} | |
document.cookie = 'mongoMachineId=' + machine + ';expires=Tue, 19 Jan 2038 05:00:00 GMT'; | |
} | |
return function () { | |
if (!(this instanceof ObjectId)) { | |
return new ObjectId(arguments[0], arguments[1], arguments[2], arguments[3]).toString(); | |
} | |
if (typeof (arguments[0]) == 'object') { | |
this.timestamp = arguments[0].timestamp; | |
this.machine = arguments[0].machine; | |
this.pid = arguments[0].pid; | |
this.increment = arguments[0].increment; | |
} | |
else if (typeof (arguments[0]) == 'string' && arguments[0].length == 24) { | |
this.timestamp = Number('0x' + arguments[0].substr(0, 8)), | |
this.machine = Number('0x' + arguments[0].substr(8, 6)), | |
this.pid = Number('0x' + arguments[0].substr(14, 4)), | |
this.increment = Number('0x' + arguments[0].substr(18, 6)) | |
} | |
else if (arguments.length == 4 && arguments[0] != null) { | |
this.timestamp = arguments[0]; | |
this.machine = arguments[1]; | |
this.pid = arguments[2]; | |
this.increment = arguments[3]; | |
} | |
else { | |
this.timestamp = Math.floor(new Date().valueOf() / 1000); | |
this.machine = machine; | |
this.pid = pid; | |
if (increment > 0xffffff) { | |
increment = 0; | |
} | |
this.increment = increment++; | |
} | |
}; | |
})(); | |
ObjectId.prototype.getDate = function () { | |
return new Date(this.timestamp * 1000); | |
} | |
/** | |
* Turns a WCF representation of a BSON ObjectId into a 24 character string representation. | |
*/ | |
ObjectId.prototype.toString = function () { | |
var timestamp = this.timestamp.toString(16); | |
var machine = this.machine.toString(16); | |
var pid = this.pid.toString(16); | |
var increment = this.increment.toString(16); | |
return '00000000'.substr(0, 6 - timestamp.length) + timestamp + | |
'000000'.substr(0, 6 - machine.length) + machine + | |
'0000'.substr(0, 4 - pid.length) + pid + | |
'000000'.substr(0, 6 - increment.length) + increment; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment