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:
Nikita Lutsenko
2016-02-29 23:52:49 -08:00
3 changed files with 51 additions and 26 deletions

View File

@@ -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();
}); });
} }

View File

@@ -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
}; };

View File

@@ -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);