From 63a534f31d365c537ac0067606a0e580cb38ba86 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Mon, 29 Feb 2016 21:00:04 -0800 Subject: [PATCH] Make GridStoreAdapter persist it's own connection and don't talk to config.database. --- src/Adapters/Files/GridStoreAdapter.js | 60 +++++++++++++++++--------- src/DatabaseAdapter.js | 11 +++-- src/index.js | 6 ++- 3 files changed, 51 insertions(+), 26 deletions(-) diff --git a/src/Adapters/Files/GridStoreAdapter.js b/src/Adapters/Files/GridStoreAdapter.js index 00fd37bcc0..b95f5563a0 100644 --- a/src/Adapters/Files/GridStoreAdapter.js +++ b/src/Adapters/Files/GridStoreAdapter.js @@ -1,28 +1,47 @@ -// GridStoreAdapter -// -// Stores files in Mongo using GridStore -// Requires the database adapter to be based on mongoclient +/** + GridStoreAdapter + Stores files in Mongo using GridStore + 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'; export class GridStoreAdapter extends FilesAdapter { + _databaseURI: string; + _connectionPromise: Promise; + + 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 // Returns a promise - createFile(config, filename, data) { - return config.database.connect().then(() => { - let gridStore = new GridStore(config.database.adapter.database, filename, 'w'); + createFile(config, filename: string, data) { + return this._connect().then(database => { + let gridStore = new GridStore(database, filename, 'w'); return gridStore.open(); - }).then((gridStore) => { + }).then(gridStore => { return gridStore.write(data); - }).then((gridStore) => { + }).then(gridStore => { return gridStore.close(); }); } - deleteFile(config, filename) { - return config.database.connect().then(() => { - let gridStore = new GridStore(config.database.adapter.database, filename, 'w'); + deleteFile(config, filename: string) { + return this._connect().then(database => { + let gridStore = new GridStore(database, filename, 'w'); return gridStore.open(); }).then((gridStore) => { return gridStore.unlink(); @@ -31,13 +50,14 @@ export class GridStoreAdapter extends FilesAdapter { }); } - getFileData(config, filename) { - return config.database.connect().then(() => { - return GridStore.exist(config.database.adapter.database, filename); - }).then(() => { - let gridStore = new GridStore(config.database.adapter.database, filename, 'r'); - return gridStore.open(); - }).then((gridStore) => { + getFileData(config, filename: string) { + return this._connect().then(database => { + return GridStore.exist(database, filename) + .then(() => { + let gridStore = new GridStore(database, filename, 'r'); + return gridStore.open(); + }); + }).then(gridStore => { return gridStore.read(); }); } diff --git a/src/DatabaseAdapter.js b/src/DatabaseAdapter.js index 47b4dbca22..6663f36bfc 100644 --- a/src/DatabaseAdapter.js +++ b/src/DatabaseAdapter.js @@ -18,10 +18,12 @@ import DatabaseController from './Controllers/DatabaseController'; import MongoStorageAdapter from './Adapters/Storage/Mongo/MongoStorageAdapter'; +const DefaultDatabaseURI = 'mongodb://localhost:27017/parse'; + let adapter = MongoStorageAdapter; -var dbConnections = {}; -var databaseURI = 'mongodb://localhost:27017/parse'; -var appDatabaseURIs = {}; +let dbConnections = {}; +let databaseURI = DefaultDatabaseURI; +let appDatabaseURIs = {}; function setAdapter(databaseAdapter) { adapter = databaseAdapter; @@ -61,5 +63,6 @@ module.exports = { setAdapter: setAdapter, setDatabaseURI: setDatabaseURI, setAppDatabaseURI: setAppDatabaseURI, - clearDatabaseURIs: clearDatabaseURIs + clearDatabaseURIs: clearDatabaseURIs, + defaultDatabaseURI: databaseURI }; diff --git a/src/index.js b/src/index.js index 4ee5d14074..13af8463fe 100644 --- a/src/index.js +++ b/src/index.js @@ -81,7 +81,7 @@ function ParseServer({ filesAdapter, push, loggerAdapter, - databaseURI, + databaseURI = DatabaseAdapter.defaultDatabaseURI, cloud, collectionPrefix = '', 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 loggerControllerAdapter = loadAdapter(loggerAdapter, FileLoggerAdapter); const emailControllerAdapter = loadAdapter(emailAdapter);