File: b00_breeze.dataService.mongo.js
(function(factory) {
if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
// CommonJS or Node: hard-coded dependency on "breeze"
factory(require("breeze"));
} else if (typeof define === "function" && define["amd"] && !breeze) {
// AMD anonymous module with hard-coded dependency on "breeze"
define(["breeze"], factory);
} else {
// <script> tag: use the global `breeze` object
factory(breeze);
}
}(function(breeze) {
var core = breeze.core;
var MetadataStore = breeze.MetadataStore;
var JsonResultsAdapter = breeze.JsonResultsAdapter;
var AbstractDataServiceAdapter = breeze.AbstractDataServiceAdapter;
var ajaxImpl;
function fmtOData(val) {
return val == null ? null : "'" + val + "'" ;
}
function getNextObjectId() {
return new ObjectId().toString();
}
var ctor = function () {
this.name = "mongo";
breeze.DataType.MongoObjectId = breeze.DataType.addSymbol({
defaultValue: "",
fmtOData: fmtOData,
getNext: getNextObjectId
});
};
ctor.prototype = new AbstractDataServiceAdapter();
ctor.prototype._prepareSaveBundle = function(saveBundle, saveContext) {
var em = saveContext.entityManager;
var metadataStore = em.metadataStore;
var helper = em.helper;
var metadata = {};
saveBundle.entities = saveBundle.entities.map(function (e) {
var rawEntity = helper.unwrapInstance(e);
var entityTypeName = e.entityType.name;
var etInfo = metadata[entityTypeName];
if (!etInfo) {
etInfo = {};
var entityType = e.entityType;
etInfo.dataProperties = entityType.dataProperties.map(function(dp) {
var p = { name: dp.nameOnServer, dataType: dp.dataType.name };
if (dp.relatedNavigationProperty != null) {
p.isFk = true;
}
if (dp.concurrencyMode && dp.concurrencyMode === "Fixed") {
p.isConcurrencyProp = true;
}
return p;
});
if (entityType.autoGeneratedKeyType !== AutoGeneratedKeyType.None) {
etInfo.autoGeneratedKey = {
propertyName: entityType.keyProperties[0].nameOnServer,
autoGeneratedKeyType: entityType.autoGeneratedKeyType.name
};
}
metadata[entityTypeName] = etInfo;
}
var originalValuesOnServer = helper.unwrapOriginalValues(e, metadataStore);
var rawAspect = {
entityTypeName: e.entityType.name,
defaultResourceName: e.entityType.defaultResourceName,
entityState: e.entityAspect.entityState.name,
originalValuesMap: originalValuesOnServer
};
rawEntity.entityAspect = rawAspect;
return rawEntity;
});
saveBundle.metadata = metadata;
saveBundle.saveOptions = { tag: saveBundle.saveOptions.tag };
return saveBundle;
}
ctor.prototype._prepareSaveResult = function (saveContext, data) {
var em = saveContext.entityManager;
var keys = data.insertedKeys.concat(data.updatedKeys, data.deletedKeys);
var entities = keys.map(function (key) {
return em.getEntityByKey(key.entityTypeName, key._id);
});
return { entities: entities, keyMappings: data.keyMappings, XHR: data.XHR };
}
ctor.prototype.jsonResultsAdapter = new JsonResultsAdapter({
name: "mongo",
visitNode: function (node, mappingContext, nodeContext) {
if (node == null) return {};
var result = {};
// this will only be set on saveResults and projections.
if (node.$type) {
result.entityType = mappingContext.entityManager.metadataStore._getEntityType(node.$type, true);
}
return result;
}
});
/*
*
* Copyright (c) 2011 Justin Dearing (zippy1981@gmail.com)
* 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
*
*/
/**
* Javascript class that mimics how WCF serializes a object of type MongoDB.Bson.ObjectId
* and converts between that format 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;
}
breeze.config.registerAdapter("dataService", ctor);
}));