Merge pull request #733 from ParsePlatform/nlutsenko.decouple.files
Make GridStoreAdapter persist it's own connection and don't talk to config.database.
This commit is contained in:
@@ -1,28 +1,47 @@
|
|||||||
// GridStoreAdapter
|
/**
|
||||||
//
|
GridStoreAdapter
|
||||||
// Stores files in Mongo using GridStore
|
Stores files in Mongo using GridStore
|
||||||
// Requires the database adapter to be based on mongoclient
|
Requires the database adapter to be based on mongoclient
|
||||||
|
|
||||||
import { GridStore } from 'mongodb';
|
@flow weak
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { MongoClient, GridStore, Db} from 'mongodb';
|
||||||
import { FilesAdapter } from './FilesAdapter';
|
import { FilesAdapter } from './FilesAdapter';
|
||||||
|
|
||||||
export class GridStoreAdapter extends FilesAdapter {
|
export class GridStoreAdapter extends FilesAdapter {
|
||||||
|
_databaseURI: string;
|
||||||
|
_connectionPromise: Promise<Db>;
|
||||||
|
|
||||||
|
constructor(mongoDatabaseURI: string) {
|
||||||
|
super();
|
||||||
|
this._databaseURI = mongoDatabaseURI;
|
||||||
|
this._connect();
|
||||||
|
}
|
||||||
|
|
||||||
|
_connect() {
|
||||||
|
if (!this._connectionPromise) {
|
||||||
|
this._connectionPromise = MongoClient.connect(this._databaseURI);
|
||||||
|
}
|
||||||
|
return this._connectionPromise;
|
||||||
|
}
|
||||||
|
|
||||||
// For a given config object, filename, and data, store a file
|
// For a given config object, filename, and data, store a file
|
||||||
// Returns a promise
|
// Returns a promise
|
||||||
createFile(config, filename, data) {
|
createFile(config, filename: string, data) {
|
||||||
return config.database.connect().then(() => {
|
return this._connect().then(database => {
|
||||||
let gridStore = new GridStore(config.database.adapter.database, filename, 'w');
|
let gridStore = new GridStore(database, filename, 'w');
|
||||||
return gridStore.open();
|
return gridStore.open();
|
||||||
}).then((gridStore) => {
|
}).then(gridStore => {
|
||||||
return gridStore.write(data);
|
return gridStore.write(data);
|
||||||
}).then((gridStore) => {
|
}).then(gridStore => {
|
||||||
return gridStore.close();
|
return gridStore.close();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteFile(config, filename) {
|
deleteFile(config, filename: string) {
|
||||||
return config.database.connect().then(() => {
|
return this._connect().then(database => {
|
||||||
let gridStore = new GridStore(config.database.adapter.database, filename, 'w');
|
let gridStore = new GridStore(database, filename, 'w');
|
||||||
return gridStore.open();
|
return gridStore.open();
|
||||||
}).then((gridStore) => {
|
}).then((gridStore) => {
|
||||||
return gridStore.unlink();
|
return gridStore.unlink();
|
||||||
@@ -31,13 +50,14 @@ export class GridStoreAdapter extends FilesAdapter {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getFileData(config, filename) {
|
getFileData(config, filename: string) {
|
||||||
return config.database.connect().then(() => {
|
return this._connect().then(database => {
|
||||||
return GridStore.exist(config.database.adapter.database, filename);
|
return GridStore.exist(database, filename)
|
||||||
}).then(() => {
|
.then(() => {
|
||||||
let gridStore = new GridStore(config.database.adapter.database, filename, 'r');
|
let gridStore = new GridStore(database, filename, 'r');
|
||||||
return gridStore.open();
|
return gridStore.open();
|
||||||
}).then((gridStore) => {
|
});
|
||||||
|
}).then(gridStore => {
|
||||||
return gridStore.read();
|
return gridStore.read();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,10 +18,12 @@
|
|||||||
import DatabaseController from './Controllers/DatabaseController';
|
import DatabaseController from './Controllers/DatabaseController';
|
||||||
import MongoStorageAdapter from './Adapters/Storage/Mongo/MongoStorageAdapter';
|
import MongoStorageAdapter from './Adapters/Storage/Mongo/MongoStorageAdapter';
|
||||||
|
|
||||||
|
const DefaultDatabaseURI = 'mongodb://localhost:27017/parse';
|
||||||
|
|
||||||
let adapter = MongoStorageAdapter;
|
let adapter = MongoStorageAdapter;
|
||||||
var dbConnections = {};
|
let dbConnections = {};
|
||||||
var databaseURI = 'mongodb://localhost:27017/parse';
|
let databaseURI = DefaultDatabaseURI;
|
||||||
var appDatabaseURIs = {};
|
let appDatabaseURIs = {};
|
||||||
|
|
||||||
function setAdapter(databaseAdapter) {
|
function setAdapter(databaseAdapter) {
|
||||||
adapter = databaseAdapter;
|
adapter = databaseAdapter;
|
||||||
@@ -61,5 +63,6 @@ module.exports = {
|
|||||||
setAdapter: setAdapter,
|
setAdapter: setAdapter,
|
||||||
setDatabaseURI: setDatabaseURI,
|
setDatabaseURI: setDatabaseURI,
|
||||||
setAppDatabaseURI: setAppDatabaseURI,
|
setAppDatabaseURI: setAppDatabaseURI,
|
||||||
clearDatabaseURIs: clearDatabaseURIs
|
clearDatabaseURIs: clearDatabaseURIs,
|
||||||
|
defaultDatabaseURI: databaseURI
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ function ParseServer({
|
|||||||
filesAdapter,
|
filesAdapter,
|
||||||
push,
|
push,
|
||||||
loggerAdapter,
|
loggerAdapter,
|
||||||
databaseURI,
|
databaseURI = DatabaseAdapter.defaultDatabaseURI,
|
||||||
cloud,
|
cloud,
|
||||||
collectionPrefix = '',
|
collectionPrefix = '',
|
||||||
clientKey,
|
clientKey,
|
||||||
@@ -129,7 +129,9 @@ function ParseServer({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const filesControllerAdapter = loadAdapter(filesAdapter, GridStoreAdapter);
|
const filesControllerAdapter = loadAdapter(filesAdapter, () => {
|
||||||
|
return new GridStoreAdapter(databaseURI);
|
||||||
|
});
|
||||||
const pushControllerAdapter = loadAdapter(push, ParsePushAdapter);
|
const pushControllerAdapter = loadAdapter(push, ParsePushAdapter);
|
||||||
const loggerControllerAdapter = loadAdapter(loggerAdapter, FileLoggerAdapter);
|
const loggerControllerAdapter = loadAdapter(loggerAdapter, FileLoggerAdapter);
|
||||||
const emailControllerAdapter = loadAdapter(emailAdapter);
|
const emailControllerAdapter = loadAdapter(emailAdapter);
|
||||||
|
|||||||
Reference in New Issue
Block a user