Compare commits
4 Commits
developmen
...
wip/mongod
Author | SHA1 | Date |
---|---|---|
Alexander Chan | 3610a6807d | |
Alexander Chan | 4cda6054a3 | |
Alexander Chan | 35711037d7 | |
Alexander Chan | 8fde2a7980 |
|
@ -356,6 +356,7 @@ class MultipleBackendGateway {
|
|||
getDiskUsage(config, reqUids, callback) {
|
||||
new DataFileBackend(config).getDiskUsage(config, reqUids, callback);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = MultipleBackendGateway;
|
||||
|
|
|
@ -356,6 +356,12 @@ class MetadataWrapper {
|
|||
notifyBucketChange(cb) {
|
||||
bucketNotificationHook = cb;
|
||||
}
|
||||
|
||||
close() {
|
||||
if (this.client.close === 'function') {
|
||||
this.client.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = MetadataWrapper;
|
||||
|
|
|
@ -14,6 +14,7 @@ const async = require('async');
|
|||
const { EventEmitter } = require('events');
|
||||
const constants = require('../../../constants');
|
||||
|
||||
const { reshapeExceptionError } = require('../../../errorUtils');
|
||||
const errors = require('../../../errors');
|
||||
const BucketInfo = require('../../../models/BucketInfo');
|
||||
|
||||
|
@ -62,6 +63,45 @@ function inc(str) {
|
|||
|
||||
const VID_SEPPLUS = inc(VID_SEP);
|
||||
|
||||
const MONGODB_QUERY_OPERATORS = [
|
||||
'$eq',
|
||||
'$gt',
|
||||
'$gte',
|
||||
'$in',
|
||||
'$lt',
|
||||
'$lte',
|
||||
'$ne',
|
||||
'$nin',
|
||||
'$and',
|
||||
'$not',
|
||||
'$nor',
|
||||
'$or',
|
||||
'$exists',
|
||||
'$type',
|
||||
'$expr',
|
||||
'$jsonSchema',
|
||||
'$mod',
|
||||
'$regex',
|
||||
'$text',
|
||||
'$where',
|
||||
'$geoIntersects',
|
||||
'$geoWithin',
|
||||
'$near',
|
||||
'$nearSphere',
|
||||
'$all',
|
||||
'$elemMatch',
|
||||
'$size',
|
||||
'$bitsAllClear',
|
||||
'$bitsAllSet',
|
||||
'$bitsAnyClear',
|
||||
'$bitsAnySet',
|
||||
'$comment',
|
||||
'$',
|
||||
'$elemMatch',
|
||||
'$meta',
|
||||
'$slice',
|
||||
];
|
||||
|
||||
function generatePHDVersion(versionId) {
|
||||
return {
|
||||
isPHD: true,
|
||||
|
@ -622,6 +662,10 @@ class MongoClientInterface {
|
|||
return this.putObjectVerCase4(c, bucketName, objName, objVal,
|
||||
params, log, cb);
|
||||
}
|
||||
if (params && params.query) {
|
||||
return this.putObjectNoVerConditional(
|
||||
c, bucketName, objName, objVal, params, log, cb);
|
||||
}
|
||||
return this.putObjectNoVer(c, bucketName, objName, objVal,
|
||||
params, log, cb);
|
||||
}
|
||||
|
@ -915,6 +959,10 @@ class MongoClientInterface {
|
|||
return this.deleteObjectVer(c, bucketName, objName,
|
||||
params, log, cb);
|
||||
}
|
||||
if (params && params.query) {
|
||||
return this.deleteObjectNoVerConditional(
|
||||
c, bucketName, objName, params, log, cb);
|
||||
}
|
||||
return this.deleteObjectNoVer(c, bucketName, objName,
|
||||
params, log, cb);
|
||||
}
|
||||
|
@ -1634,6 +1682,147 @@ class MongoClientInterface {
|
|||
return cb(null, doc.map(i => i.value));
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* converts regular js object into mongodb usable filters
|
||||
* Example: with starting prefix ""
|
||||
* {
|
||||
* hello: {
|
||||
* world: {
|
||||
* $eq: 42
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* is will be parsed as
|
||||
* {
|
||||
* "hello.world": { $eq: 42 }
|
||||
* }
|
||||
*
|
||||
*/
|
||||
_genMongoQuery(depth, prefix, object, query) {
|
||||
/* eslint-disable no-param-reassign */
|
||||
if (depth > 10) {
|
||||
throw errors.InternalError;
|
||||
}
|
||||
if (typeof query !== 'object' ||
|
||||
query === null ||
|
||||
query === undefined) {
|
||||
object[prefix] = query;
|
||||
return;
|
||||
}
|
||||
const fields = Object.keys(query);
|
||||
if (fields.some(f => MONGODB_QUERY_OPERATORS.includes(f))) {
|
||||
object[prefix] = query;
|
||||
} else {
|
||||
fields.forEach(f => this._genMongoQuery(depth + 1,
|
||||
`${prefix}.${f}`,
|
||||
object, query[f])
|
||||
);
|
||||
}
|
||||
return;
|
||||
/* eslint-enable no-param-reassign */
|
||||
}
|
||||
|
||||
_getFilter(objName, query) {
|
||||
const filter = { _id: objName };
|
||||
this._genMongoQuery(0, 'value', filter, query);
|
||||
return filter;
|
||||
}
|
||||
|
||||
/*
|
||||
* delete an object that matches a given query object
|
||||
*/
|
||||
deleteObjectNoVerConditional(c, bucketName, objName, params, log, cb) {
|
||||
const method = 'deleteObjectNoVerConditional';
|
||||
let filter;
|
||||
try {
|
||||
filter = this._getFilter(objName, params.query);
|
||||
} catch (err) {
|
||||
log.error('error creating mongodb filter', {
|
||||
error: reshapeExceptionError(err),
|
||||
});
|
||||
return cb(errors.InternalError);
|
||||
}
|
||||
return c.findOneAndDelete(filter, (err, res) => {
|
||||
if (err) {
|
||||
log.error('error occurred when attempting to delete object', {
|
||||
method,
|
||||
error: err.message,
|
||||
});
|
||||
return cb(errors.InternalError);
|
||||
}
|
||||
if (res.ok !== 1) {
|
||||
log.error('failed to delete object', {
|
||||
method,
|
||||
error: err.message,
|
||||
});
|
||||
return cb(errors.InternalError);
|
||||
}
|
||||
/*
|
||||
* unable to find an object that matches the query
|
||||
*/
|
||||
if (!res.value) {
|
||||
log.debug('unable to find target object to delete', {
|
||||
method,
|
||||
filter,
|
||||
});
|
||||
return cb(errors.NoSuchKey);
|
||||
}
|
||||
return cb();
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* update an object that matches a given query. If one cannot be found,
|
||||
* a new object will be inserted
|
||||
*/
|
||||
putObjectNoVerConditional(c, bucketName, objName, objVal, params, log, cb) {
|
||||
const method = 'putObjectNoVerConditional';
|
||||
let filter;
|
||||
try {
|
||||
filter = this._getFilter(objName, params.query);
|
||||
} catch (err) {
|
||||
log.error('error creating mongodb filter', {
|
||||
error: reshapeExceptionError(err),
|
||||
});
|
||||
return cb(errors.InternalError);
|
||||
}
|
||||
return c.findOneAndUpdate(filter, {
|
||||
$set: {
|
||||
_id: objName,
|
||||
value: objVal,
|
||||
},
|
||||
}, {
|
||||
upsert: true,
|
||||
}, (err, res) => {
|
||||
if (err) {
|
||||
log.error('error occurred when attempting update object', {
|
||||
method,
|
||||
error: err,
|
||||
});
|
||||
return cb(errors.InternalError);
|
||||
}
|
||||
if (res.ok !== 1) {
|
||||
log.error('failed to update object', {
|
||||
method,
|
||||
error: err.message,
|
||||
});
|
||||
return cb(errors.InternalError);
|
||||
}
|
||||
if (!res.value) {
|
||||
log.debug('object not found...inserting object', {
|
||||
method,
|
||||
filter,
|
||||
});
|
||||
return cb();
|
||||
}
|
||||
log.debug('Object found...updating object', {
|
||||
method,
|
||||
filter,
|
||||
});
|
||||
return cb();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = MongoClientInterface;
|
||||
|
|
Loading…
Reference in New Issue