Update to version 1.0.0 that has support for offers, removal of obolete properties

This commit is contained in:
Nomiero 2015-04-07 12:23:45 -07:00
Родитель 886b89e211
Коммит 25e28f15e4
11 изменённых файлов: 310 добавлений и 142 удалений

Просмотреть файл

@ -40,7 +40,7 @@ var AuthHandler = {
return resourceTokens[resourceId]; return resourceTokens[resourceId];
} else { } else {
var pathParts = path.split("/"); var pathParts = path.split("/");
var resourceTypes = ["dbs", "colls", "docs", "sprocs", "udfs", "triggers", "users", "permissions", "attachments", "media", "conflicts"]; var resourceTypes = ["dbs", "colls", "docs", "sprocs", "udfs", "triggers", "users", "permissions", "attachments", "media", "conflicts", "offers"];
for (var i = pathParts.length - 1; i >= 0;i--) { for (var i = pathParts.length - 1; i >= 0;i--) {
if (resourceTypes.indexOf(pathParts[i]) === -1) { if (resourceTypes.indexOf(pathParts[i]) === -1) {
if (resourceTokens[pathParts[i]]) { if (resourceTokens[pathParts[i]]) {

Просмотреть файл

@ -186,7 +186,10 @@ var Base = {
if (options.postTriggerInclude) { if (options.postTriggerInclude) {
headers[Constants.HttpHeaders.PostTriggerInclude] = options.postTriggerInclude.constructor === Array? options.postTriggerInclude.join(","): options.postTriggerInclude; headers[Constants.HttpHeaders.PostTriggerInclude] = options.postTriggerInclude.constructor === Array? options.postTriggerInclude.join(","): options.postTriggerInclude;
} }
if (options.offerType != null) {
headers[Constants.HttpHeaders.OfferType] = options.offerType;
}
if (options.maxItemCount) { if (options.maxItemCount) {
headers[Constants.HttpHeaders.PageSize] = options.maxItemCount; headers[Constants.HttpHeaders.PageSize] = options.maxItemCount;

Просмотреть файл

@ -111,21 +111,19 @@ var Constants = {
CollectionCurrentUsageInMb: "x-ms-collection-usage-mb", CollectionCurrentUsageInMb: "x-ms-collection-usage-mb",
MaxMediaStorageUsageInMB: "x-ms-max-media-storage-usage-mb", MaxMediaStorageUsageInMB: "x-ms-max-media-storage-usage-mb",
CurrentMediaStorageUsageInMB: "x-ms-media-storage-usage-mb", CurrentMediaStorageUsageInMB: "x-ms-media-storage-usage-mb",
DatabaseAccountCapacityUnitsConsumed: "x-ms-database-capacity-units-consumed", RequestCharge: "x-ms-request-charge",
DatabaseAccountCapacityUnitsProvisioned: "x-ms-database-capacity-units-provisioned",
DatabaseAccountConsumedDocumentStorageInMB: "x-ms-databaseaccount-consumed-mb", // Offer header
DatabaseAccountReservedDocumentStorageInMB: "x-ms-databaseaccount-reserved-mb", OfferType: "x-ms-offer-type"
DatabaseAccountProvisionedDocumentStorageInMB: "x-ms-databaseaccount-provisioned-mb",
RequestCharge: "x-ms-request-charge"
}, },
CurrentVersion: "2014-08-21", CurrentVersion: "2015-04-08",
UserAgent: "documentdb-nodejs-sdk-0.9.3" UserAgent: "documentdb-nodejs-sdk-1.0.0"
} }
//SCRIPT END //SCRIPT END
if (typeof exports !== "undefined") { if (typeof exports !== "undefined") {
module.exports = Constants; module.exports = Constants;
} }

Просмотреть файл

@ -537,7 +537,7 @@ var DocumentClient = Base.defineClass(
this.read(path, "conflicts", resourceInfo.objectBody.id, undefined, options, callback); this.read(path, "conflicts", resourceInfo.objectBody.id, undefined, options, callback);
}, },
/** lLsts all databases. /** Lists all databases.
* @memberof DocumentClient * @memberof DocumentClient
* @instance * @instance
* @param {FeedOptions} [options] - The feed options. * @param {FeedOptions} [options] - The feed options.
@ -1100,26 +1100,6 @@ var DocumentClient = Base.defineClass(
this.deleteResource(path, "conflicts", resourceInfo.objectBody.id, undefined, options, callback); this.deleteResource(path, "conflicts", resourceInfo.objectBody.id, undefined, options, callback);
}, },
/**
* Replace the database object.
* @memberof DocumentClient
* @instance
* @param {string} databaseLink - The self-link of the database.
* @param {object} db - Represent the new database body.
* @param {RequestOptions} [options] - The request options.
* @param {RequestCallback} callback - The callback for the request.
*/
replaceDatabase: function (databaseLink, db, options, callback) {
if (!callback) {
callback = options;
options = {};
}
var path = "/" + databaseLink;
var resourceInfo = Base.parsePath(databaseLink);
this.replace(db, path, "dbs", resourceInfo.objectBody.id, undefined, options, callback);
},
/** /**
* Replace the document object. * Replace the document object.
* @memberof DocumentClient * @memberof DocumentClient
@ -1366,7 +1346,66 @@ var DocumentClient = Base.defineClass(
this.post(urlConnection, path, params, headers, callback); this.post(urlConnection, path, params, headers, callback);
}, },
/**
* Replace the offer object.
* @memberof DocumentClient
* @instance
* @param {string} offerLink - The self-link of the offer.
* @param {object} offer - Represent the new offer body.
* @param {RequestCallback} callback - The callback for the request.
*/
replaceOffer: function (offerLink, offer, callback) {
var path = "/" + offerLink;
var resourceInfo = Base.parsePath(offerLink);
this.replace(offer, path, "offers", resourceInfo.objectBody.id, undefined, {}, callback);
},
/** Reads an offer.
* @memberof DocumentClient
* @instance
* @param {string} offerLink - The self-link of the offer.
* @param {RequestCallback} callback - The callback for the request.
*/
readOffer: function (offerLink, callback) {
var path = "/" + offerLink;
var resourceInfo = Base.parsePath(offerLink);
this.read(path, "offers", resourceInfo.objectBody.id, undefined, {}, callback);
},
/** Lists all offers.
* @memberof DocumentClient
* @instance
* @param {FeedOptions} [options] - The feed options.
* @returns {QueryIterator} - An instance of queryIterator to handle reading feed.
*/
readOffers: function (options) {
return this.queryOffers(undefined, options);
},
/** Lists all offers that satisfy a query.
* @memberof DocumentClient
* @instance
* @param {SqlQuerySpec | string} query - A SQL query.
* @param {FeedOptions} [options] - The feed options.
* @returns {QueryIterator} - An instance of QueryIterator to handle reading feed.
*/
queryOffers: function (query, options) {
var that = this;
return new QueryIterator(this, query, options, function (options, callback) {
that.queryFeed.call(that,
that,
"/offers",
"offers",
"",
function (result) { return result.Offers; },
function (parent, body) { return body; },
query,
options,
callback);
});
},
/** Gets the Database account information. /** Gets the Database account information.
* @memberof DocumentClient * @memberof DocumentClient
* @instance * @instance
@ -1382,11 +1421,6 @@ var DocumentClient = Base.defineClass(
databaseAccount.MediaLink = "/media/"; databaseAccount.MediaLink = "/media/";
databaseAccount.MaxMediaStorageUsageInMB = headers[Constants.HttpHeaders.MaxMediaStorageUsageInMB]; databaseAccount.MaxMediaStorageUsageInMB = headers[Constants.HttpHeaders.MaxMediaStorageUsageInMB];
databaseAccount.CurrentMediaStorageUsageInMB = headers[Constants.HttpHeaders.CurrentMediaStorageUsageInMB]; databaseAccount.CurrentMediaStorageUsageInMB = headers[Constants.HttpHeaders.CurrentMediaStorageUsageInMB];
databaseAccount.CapacityUnitsConsumed = headers[Constants.HttpHeaders.DatabaseAccountCapacityUnitsConsumed];
databaseAccount.CapacityUnitsProvisioned = headers[Constants.HttpHeaders.DatabaseAccountCapacityUnitsProvisioned];
databaseAccount.ConsumedDocumentStorageInMB = headers[Constants.HttpHeaders.DatabaseAccountConsumedDocumentStorageInMB];
databaseAccount.ReservedDocumentStorageInMB = headers[Constants.HttpHeaders.DatabaseAccountReservedDocumentStorageInMB];
databaseAccount.ProvisionedDocumentStorageInMB = headers[Constants.HttpHeaders.DatabaseAccountProvisionedDocumentStorageInMB];
databaseAccount.ConsistencyPolicy = result.userConsistencyPolicy; databaseAccount.ConsistencyPolicy = result.userConsistencyPolicy;
callback(undefined, databaseAccount, headers); callback(undefined, databaseAccount, headers);
@ -1519,6 +1553,7 @@ var DocumentClient = Base.defineClass(
* @property {string} [consistencyLevel] - Consistency level required by the client. * @property {string} [consistencyLevel] - Consistency level required by the client.
* @property {string} [sessionToken] - Token for use with Session consistency. * @property {string} [sessionToken] - Token for use with Session consistency.
* @property {number} [resourceTokenExpirySeconds]- Expiry time (in seconds) for resource token associated with permission (applicable only for requests on permissions). * @property {number} [resourceTokenExpirySeconds]- Expiry time (in seconds) for resource token associated with permission (applicable only for requests on permissions).
* @property {string} [offerType] - Offer type when creating document collections.
*/ */
/** /**

Просмотреть файл

@ -17,16 +17,6 @@ var AzureDocuments = Base.defineClass(null, null,
* @property {number} MaxMediaStorageUsageInMB - Attachment content (media) storage quota in MBs ( Retrieved from gateway ). * @property {number} MaxMediaStorageUsageInMB - Attachment content (media) storage quota in MBs ( Retrieved from gateway ).
* @property {number} CurrentMediaStorageUsageInMB - <p> Current attachment content (media) usage in MBs (Retrieved from gateway )<br> * @property {number} CurrentMediaStorageUsageInMB - <p> Current attachment content (media) usage in MBs (Retrieved from gateway )<br>
Value is returned from cached information updated periodically and is not guaranteed to be real time. </p> Value is returned from cached information updated periodically and is not guaranteed to be real time. </p>
* @property {number} CapacityUnitsConsumed - The number is capacity units database account is currently consuming. <br>
Value is returned from cached information updated periodically and is not guaranteed to be real time. </p>
* @property {number} CapacityUnitsProvisioned - <p> The number of provisioned capacity units for the database account. <br>
Value is returned from cached information updated periodically and is not guaranteed to be real time. </p>
* @property {number} ConsumedDocumentStorageInMB - <p> The cumulative sum of current sizes of created collection in MB. <br>
Value is returned from cached information updated periodically and is not guaranteed to be real time. </p>
* @property {number} ReservedDocumentStorageInMB - <p> The cumulative sum of maximum sizes of created collection in MB. <br>
Value is returned from cached information updated periodically and is not guaranteed to be real time. </p>
* @property {number} ProvisionedDocumentStorageInMB - <p> The provisioned documented storage capacity for the database account. <br>
Value is returned from cached information updated periodically and is not guaranteed to be real time. </p>
* @property {object} ConsistencyPolicy - Gets the UserConsistencyPolicy settings. * @property {object} ConsistencyPolicy - Gets the UserConsistencyPolicy settings.
* @property {string} ConsistencyPolicy.defaultConsistencyLevel - The default consistency level and it's of type {@link ConsistencyLevel}. * @property {string} ConsistencyPolicy.defaultConsistencyLevel - The default consistency level and it's of type {@link ConsistencyLevel}.
* @property {number} ConsistencyPolicy.maxStalenessPrefix - In bounded staleness consistency, the maximum allowed staleness in terms difference in sequence numbers (aka version). * @property {number} ConsistencyPolicy.maxStalenessPrefix - In bounded staleness consistency, the maximum allowed staleness in terms difference in sequence numbers (aka version).
@ -61,20 +51,6 @@ var AzureDocuments = Base.defineClass(null, null,
enumerable: true enumerable: true
}); });
Object.defineProperty(this, "CapacityUnitsConsumed", {
value: 0,
writable: true,
configurable: true,
enumerable: true
});
Object.defineProperty(this, "CapacityUnitsProvisioned", {
value: 0,
writable: true,
configurable: true,
enumerable: true
});
Object.defineProperty(this, "ConsumedDocumentStorageInMB", { Object.defineProperty(this, "ConsumedDocumentStorageInMB", {
value: 0, value: 0,
writable: true, writable: true,
@ -155,14 +131,8 @@ var AzureDocuments = Base.defineClass(null, null,
Range: "Range", Range: "Range",
}), }),
Protocol : Object.freeze({
Tcp: 1,
Https: 2,
}),
ConnectionMode : Object.freeze({ ConnectionMode : Object.freeze({
Direct: 0, Gateway: 0,
Gateway: 1,
}), }),
QueryCompatibilityMode: Object.freeze({ QueryCompatibilityMode: Object.freeze({
@ -250,20 +220,6 @@ var AzureDocuments = Base.defineClass(null, null,
* @property {number} RequestTimeout - Request timeout (time to wait for response from network peer). Represented in milliseconds. * @property {number} RequestTimeout - Request timeout (time to wait for response from network peer). Represented in milliseconds.
*/ */
ConnectionPolicy : Base.defineClass(function() { ConnectionPolicy : Base.defineClass(function() {
Object.defineProperty(this, "_defaultMaxConnections", {
value: 20,
writable: true,
configurable: true,
enumerable: false // this is the default value, so it could be excluded during JSON.stringify
});
Object.defineProperty(this, "_defaultMaxConcurrentCallsPerConnection", {
value: 50,
writable: true,
configurable: true,
enumerable: false // this is the default value, so it could be excluded during JSON.stringify
});
Object.defineProperty(this, "_defaultRequestTimeout", { Object.defineProperty(this, "_defaultRequestTimeout", {
value: 60000, value: 60000,
writable: true, writable: true,
@ -280,12 +236,9 @@ var AzureDocuments = Base.defineClass(null, null,
}); });
this.ConnectionMode = AzureDocuments.ConnectionMode.Gateway; this.ConnectionMode = AzureDocuments.ConnectionMode.Gateway;
this.ConnectionProtocol = AzureDocuments.Protocol.Https;
this.MediaReadMode = AzureDocuments.MediaReadMode.Buffered; this.MediaReadMode = AzureDocuments.MediaReadMode.Buffered;
this.MediaRequestTimeout = this._defaultMediaRequestTimeout; this.MediaRequestTimeout = this._defaultMediaRequestTimeout;
this.RequestTimeout = this._defaultRequestTimeout; this.RequestTimeout = this._defaultRequestTimeout;
this.MaxCallsPerConnections = this._defaultMaxConcurrentCallsPerConnection; // for direct connectivity
this.MaxConnections = this._defaultMaxConnections; // for direct connectivity
}) })
} }
); );

Просмотреть файл

@ -14,7 +14,8 @@ var Documents = require('./documents')
https.globalAgent.maxSockets = 10000; https.globalAgent.maxSockets = 10000;
// setting security protocol for the global agent. // setting security protocol for the global agent.
https.globalAgent.options.secureProtocol = "TLSv1_client_method"; https.globalAgent.options.secureProtocol = "TLSv1_client_method";
// Keeping the connection alive to reuse the sockets.
https.globalAgent.keepAlive = true;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Utility methods // Utility methods
// //
@ -123,7 +124,7 @@ var RequestHandler = {
requestOptions.method = method; requestOptions.method = method;
requestOptions.path = path; requestOptions.path = path;
requestOptions.headers = headers; requestOptions.headers = headers;
if(queryParams) { if(queryParams) {
requestOptions.path += "?" + querystring.stringify(queryParams); requestOptions.path += "?" + querystring.stringify(queryParams);
} }

Просмотреть файл

@ -9,7 +9,7 @@
"database", "database",
"cloud" "cloud"
], ],
"version": "0.9.3", "version": "1.0.0",
"author": "Microsoft Corporation", "author": "Microsoft Corporation",
"main": "./index.js", "main": "./index.js",
"engine": { "engine": {

Просмотреть файл

@ -4,7 +4,8 @@
'use strict'; 'use strict';
var DocumentDBClient = require("documentdb").DocumentClient var Base = require("documentdb").Base
, DocumentDBClient = require("documentdb").DocumentClient
, DocumentBase = require("documentdb").DocumentBase , DocumentBase = require("documentdb").DocumentBase
, assert = require("assert") , assert = require("assert")
, testConfig = require('./_testConfig') , testConfig = require('./_testConfig')
@ -76,28 +77,18 @@ describe("NodeJS CRUD Tests", function(){
] ]
}; };
client.queryDatabases(querySpec).toArray(function (err, results) { client.queryDatabases(querySpec).toArray(function (err, results) {
assert(results.length > 0, "number of results for the query should be > 0"); assert(results.length > 0, "number of results for the query should be > 0");
//replace database
db.id = "replaced db"; // delete database
client.replaceDatabase(db._self, db, function(error, replacedDb){ client.deleteDatabase(db._self, function(err, res){
assert.equal(replacedDb.id, "replaced db", "Db name should change"); // read database after deletion
assert.equal(db.id, replacedDb.id, "Db id should stay the same"); client.readDatabase(db._self, function(err, database) {
// read database var notFoundErrorCode = 404;
client.readDatabase(replacedDb._self, function(err, database) { assert.equal(err.code, notFoundErrorCode, "response should return error code 404");
assert.equal(err, undefined, "readDatabase should work successfully"); done();
assert.equal(replacedDb.id, database.id); });
// delete database });
client.deleteDatabase(replacedDb._self, function(err, res){ });
// read database after deletion
client.readDatabase(db._self, function(err, database) {
var notFoundErrorCode = 404;
assert.equal(err.code, notFoundErrorCode, "response should return error code 404");
done();
});
});
});
});
});
}); });
}); });
}); });
@ -1151,7 +1142,153 @@ describe("NodeJS CRUD Tests", function(){
}); });
}); });
}); });
describe("Validate Offer CRUD", function () {
var validateOfferResponseBody = function (offer, expectedCollLink, expectedOfferType) {
assert(offer.id, "Id cannot be null");
assert(offer._rid, "Resource Id (Rid) cannot be null");
assert(offer._self, "Self Link cannot be null");
assert(offer.resource, "Resource Link cannot be null");
assert(offer._self.indexOf(offer.id) != -1, "Offer id not contained in offer self link.");
assert.equal(expectedCollLink.replace(/^\/|\/$/g, ''), offer.resource.replace(/^\/|\/$/g, ''));
if (expectedOfferType) {
assert.equal(expectedOfferType, offer.offerType);
}
}
it("[nativeApi] Should do offer read and query operations successfully", function (done) {
var client = new DocumentDBClient(host, { masterKey: masterKey });
// create database
client.createDatabase({ id: "sample database" }, function (err, db) {
assert(err === undefined);
// create collection
client.createCollection(db._self, { id: "sample collection" }, function (err, collection) {
assert(err === undefined);
client.readOffers({}).toArray(function (err, offers) {
assert(err === undefined);
assert.equal(offers.length, 1);
var expectedOffer = offers[0];
validateOfferResponseBody(expectedOffer, collection._self, undefined);
// Read the offer
client.readOffer(expectedOffer._self, function (err, readOffer) {
assert(err === undefined);
validateOfferResponseBody(readOffer, collection._self, undefined);
// Check if the read offer is what we expected.
assert.equal(expectedOffer.id, readOffer.id);
assert.equal(expectedOffer._rid, readOffer._rid);
assert.equal(expectedOffer._self, readOffer._self);
assert.equal(expectedOffer.resource, readOffer.resource);
// Read offer with a bad offer link.
var badLink = expectedOffer._self.substring(0, expectedOffer._self.length - 1) + 'x/';
client.readOffer(badLink, function (err, _) {
var notFoundErrorCode = 400;
assert.equal(err.code, notFoundErrorCode, "response should return error code 404");
// Query for offer.
var querySpec = {
query: 'select * FROM root r WHERE r.id=@id',
parameters: [
{
name: '@id',
value: expectedOffer.id
}
]
};
client.queryOffers(querySpec).toArray(function (err, offers) {
assert(err === undefined);
assert.equal(offers.length, 1);
var oneOffer = offers[0];
validateOfferResponseBody(oneOffer, collection._self, undefined);
// Now delete the collection.
client.deleteCollection(collection._self, function (err, _) {
// read offer after deleting collection.
client.readOffer(expectedOffer._self, function (err, _) {
var notFoundErrorCode = 404;
assert.equal(err.code, notFoundErrorCode, "response should return error code 404");
done();
});
});
});
})
});
});
});
});
});
it("[nativeApi] Should do offer replace operations successfully", function (done) {
var client = new DocumentDBClient(host, { masterKey: masterKey });
// create database
client.createDatabase({ id: "sample database" }, function (err, db) {
assert(err === undefined);
// create collection
client.createCollection(db._self, { id: "sample collection" }, function (err, collection) {
assert(err === undefined);
client.readOffers().toArray(function (err, offers) {
assert(err === undefined);
assert.equal(offers.length, 1);
var expectedOffer = offers[0];
validateOfferResponseBody(expectedOffer, collection._self, undefined);
// Replace the offer.
var offerToReplace = Base.extend({}, expectedOffer);
offerToReplace.offerType = "S2";
client.replaceOffer(offerToReplace._self, offerToReplace, function (err, replacedOffer) {
assert(err === undefined);
validateOfferResponseBody(replacedOffer, collection._self, "S2");
// Check if the replaced offer is what we expect.
assert.equal(replacedOffer.id, offerToReplace.id);
assert.equal(replacedOffer._rid, offerToReplace._rid);
assert.equal(replacedOffer._self, offerToReplace._self);
assert.equal(replacedOffer.resource, offerToReplace.resource);
// Replace an offer with a bad id.
var offerBadId = Base.extend({}, offerToReplace);
offerBadId._rid = "NotAllowed";
client.replaceOffer(offerBadId._self, offerBadId, function (err, _) {
var badRequestErrorCode = 400;
assert.equal(err.code, badRequestErrorCode);
// Replace an offer with a bad rid.
var offerBadRid = Base.extend({}, offerToReplace);
offerBadRid._rid = "InvalidRid";
client.replaceOffer(offerBadRid._self, offerBadRid, function (err, _) {
var badRequestErrorCode = 400;
assert.equal(err.code, badRequestErrorCode);
// Replace an offer with null id and rid.
var offerNullId = Base.extend({}, offerToReplace);
offerNullId.id = undefined;
offerNullId._rid = undefined;
client.replaceOffer(offerNullId._self, offerNullId, function (err, _) {
var badRequestErrorCode = 400;
assert.equal(err.code, badRequestErrorCode);
done();
});
});
});
});
});
});
});
});
it("[nativeApi] Should create collection with specified offer type successfully", function (done) {
var client = new DocumentDBClient(host, { masterKey: masterKey });
// create database
client.createDatabase({ id: "sample database" }, function (err, db) {
assert(err === undefined);
// create collection
client.createCollection(db._self, { id: "sample collection" }, { offerType: "S2" }, function (err, collection) {
assert(err === undefined);
client.readOffers().toArray(function (err, offers) {
assert(err === undefined);
assert.equal(offers.length, 1);
var expectedOffer = offers[0];
assert.equal(expectedOffer.offerType, "S2");
done();
});
});
});
});
});
describe("validate database account functionality", function () { describe("validate database account functionality", function () {
it("[nativeApi] Should get database account successfully", function (done) { it("[nativeApi] Should get database account successfully", function (done) {
var client = new DocumentDBClient(host, { masterKey: masterKey }); var client = new DocumentDBClient(host, { masterKey: masterKey });
@ -1160,11 +1297,6 @@ describe("NodeJS CRUD Tests", function(){
assert.equal(databaseAccount.MediaLink , "/media/"); assert.equal(databaseAccount.MediaLink , "/media/");
assert.equal(databaseAccount.MaxMediaStorageUsageInMB, headers["x-ms-max-media-storage-usage-mb"]); assert.equal(databaseAccount.MaxMediaStorageUsageInMB, headers["x-ms-max-media-storage-usage-mb"]);
assert.equal(databaseAccount.CurrentMediaStorageUsageInMB, headers["x-ms-media-storage-usage-mb"]); assert.equal(databaseAccount.CurrentMediaStorageUsageInMB, headers["x-ms-media-storage-usage-mb"]);
assert.equal(databaseAccount.CapacityUnitsConsumed, headers["x-ms-database-capacity-units-consumed"]);
assert.equal(databaseAccount.CapacityUnitsProvisioned, headers["x-ms-database-capacity-units-provisioned"]);
assert.equal(databaseAccount.ConsumedDocumentStorageInMB, headers["x-ms-databaseaccount-consumed-mb"]);
assert.equal(databaseAccount.ReservedDocumentStorageInMB, headers["x-ms-databaseaccount-reserved-mb"]);
assert.equal(databaseAccount.ProvisionedDocumentStorageInMB, headers["x-ms-databaseaccount-provisioned-mb"]);
assert(databaseAccount.ConsistencyPolicy.defaultConsistencyLevel != undefined); assert(databaseAccount.ConsistencyPolicy.defaultConsistencyLevel != undefined);
done(); done();
}); });

Просмотреть файл

@ -43,27 +43,39 @@ function deleteOperationPromise(contextObject, functionName, resourceLink, optio
function replaceOperationPromise(contextObject, functionName, resourceLink, newResource, options){ function replaceOperationPromise(contextObject, functionName, resourceLink, newResource, options){
var deferred = Q.defer(); var deferred = Q.defer();
contextObject[functionName](resourceLink, newResource, options, function (error, resource, responseHeaders) { var callback = function (error, resource, responseHeaders) {
if (error) { if (error) {
deferred.reject(error); deferred.reject(error);
} else { } else {
deferred.resolve({resource: resource, headers: responseHeaders}); deferred.resolve({resource: resource, headers: responseHeaders});
} }
}); }
if (options === undefined) {
contextObject[functionName](resourceLink, newResource, callback);
} else {
contextObject[functionName](resourceLink, newResource, options, callback);
}
return deferred.promise; return deferred.promise;
} }
function readOperationPromise(contextObject, functionName, resourceLink, options){ function readOperationPromise(contextObject, functionName, resourceLink, options){
var deferred = Q.defer(); var deferred = Q.defer();
contextObject[functionName](resourceLink, options, function (error, resource, responseHeaders) { var callback = function (error, resource, responseHeaders) {
if (error) { if (error) {
deferred.reject(error); deferred.reject(error);
} else { } else {
deferred.resolve({resource: resource, headers: responseHeaders}); deferred.resolve({resource: resource, headers: responseHeaders});
} }
}); }
if (options === undefined) {
contextObject[functionName](resourceLink, callback);
} else {
contextObject[functionName](resourceLink, options, callback);
}
return deferred.promise; return deferred.promise;
} }
@ -272,20 +284,6 @@ var DocumentClientWrapper = Base.defineClass(
return new QueryIteratorWrapper(this._innerDocumentclient.queryUsers(databaseLink, query, options)); return new QueryIteratorWrapper(this._innerDocumentclient.queryUsers(databaseLink, query, options));
}, },
/**
* Replace the database object.
* @memberof DocumentClientWrapper
* @instance
* @param {string} databaseLink - The self-link of the database.
* @param {Database} db - Represent the new database body.
* @param {RequestOptions} [options] - The request options.
* @Returns {Object} <p>A promise object for the request completion. <br>
The onFulfilled callback takes a parameter of type {@link ResourceResponse} and the OnError callback takes a parameter of type {@link ResponseError}</p>
*/
replaceDatabaseAsync: function (databaseLink, db, options) {
return replaceOperationPromise(this._innerDocumentclient, "replaceDatabase", databaseLink, db, options);
},
/** /**
* Delete the database object. * Delete the database object.
* @memberof DocumentClientWrapper * @memberof DocumentClientWrapper
@ -963,7 +961,55 @@ var DocumentClientWrapper = Base.defineClass(
*/ */
deleteConflictAsync: function(conflictLink, options) { deleteConflictAsync: function(conflictLink, options) {
return deleteOperationPromise(this._innerDocumentclient, "deleteConflict", conflictLink, options); return deleteOperationPromise(this._innerDocumentclient, "deleteConflict", conflictLink, options);
} },
/**
* Replace the Offer object.
* @memberof DocumentClientWrapper
* @instance
* @param {string} offerLink - The self-link of the offer.
* @param {object} offer - Represent the new offer body.
* @Returns {Object} <p>A promise object for the request completion. <br>
The onFulfilled callback takes a parameter of type {@link ResourceResponse} and the OnError callback takes a parameter of type {@link ResponseError}</p>
*/
replaceOfferAsync: function(offerLink, offer) {
return replaceOperationPromise(this._innerDocumentclient, "replaceOffer", offerLink, offer, undefined);
},
/**
* Reads an offer object.
* @memberof DocumentClientWrapper
* @instance
* @param {string} offerLink - The self-link of the offer.
* @Returns {Object} <p>A promise object for the request completion. <br>
The onFulfilled callback takes a parameter of type {@link ResourceResponse} and the OnError callback takes a parameter of type {@link ResponseError}</p>
*/
readOfferAsync: function (offerLink) {
return readOperationPromise(this._innerDocumentclient, "readOffer", offerLink, undefined);
},
/**
* Get all offers for this database.
* @memberof DocumentClientWrapper
* @instance
* @param {FeedOptions} [options] - The feed options
* @returns {QueryIterator} - An instance of queryIterator to handle reading feed.
*/
readOffers: function (options) {
return new QueryIteratorWrapper(this._innerDocumentclient.readOffers(options));
},
/**
* Query offers for this database.
* @memberof DocumentClientWrapper
* @instance
* @param {SqlQuerySpec | string} query - A SQL query.
* @param {FeedOptions} [options] - Represents the feed options.
* @returns {QueryIterator} - An instance of queryIterator to handle reading feed.
*/
queryOffers: function (query, options) {
return new QueryIteratorWrapper(this._innerDocumentclient.queryOffers(query, options));
},
} }
); );

Просмотреть файл

@ -10,7 +10,7 @@
"cloud", "cloud",
"promises" "promises"
], ],
"version": "0.9.3", "version": "1.0.0",
"author": "Microsoft Corporation", "author": "Microsoft Corporation",
"main": "./documentclientwrapper.js", "main": "./documentclientwrapper.js",
"engine": { "engine": {

Просмотреть файл

@ -1,5 +1,5 @@
var host = "MyHost"; var masterKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==";
var key = "MyKey"; var host = "https://localhost:443";
exports.host = host; exports.host = host;
exports.masterKey = key; exports.masterKey = masterKey;