1
+ var mongodb = require ( "mongodb" ) ,
2
+ // Grab the database HOST, PORT, USER and PASSWORD from the environment
3
+ HOST = process . env [ "MONGODB_HOST" ] || "localhost" ,
4
+ PORT = + process . env [ "MONGODB_PORT" ] || 27017 ,
5
+ USER = process . env [ "MONGODB_USER" ] ,
6
+ PASSWORD = process . env [ "MONGODB_PASSWORD" ] ,
7
+ Db = mongodb . Db ,
8
+ Server = mongodb . Server ,
9
+ cachedResults ,
10
+ callbackQueue
11
+
12
+ var Collection = {
13
+ constructor : function ( collection ) {
14
+ this . collection = collection
15
+ return this
16
+ }
17
+ }
18
+
19
+ Object . keys ( mongodb . Collection . prototype ) . forEach ( addToCollection )
20
+
21
+ module . exports = collection
22
+
23
+ function mongo ( collectionName ) {
24
+ return getCollection
25
+
26
+ function getCollection ( callback ) {
27
+ openDatabase ( openCollection )
28
+
29
+ function openCollection ( err , db ) {
30
+ if ( err ) {
31
+ return callback ( err )
32
+ }
33
+ db . collection ( collectionName , callCallback )
34
+ }
35
+
36
+ function callCallback ( err , collection ) {
37
+ callback . call ( collection , err , collection )
38
+ }
39
+ }
40
+ }
41
+
42
+ function openDatabase ( callback ) {
43
+ if ( cachedResults ) {
44
+ return callback . apply ( cachedResults [ 1 ] , memo )
45
+ } else if ( callbackQueue ) {
46
+ return callbackQueue . push ( callback )
47
+ }
48
+
49
+ callbackQueue = [ callback ]
50
+
51
+ var db = new Db ( 'DATABASE' , new Server ( HOST , PORT , {
52
+ auto_reconnect : true ,
53
+ poolSize : 4
54
+ } ) , { } )
55
+ db . open ( authenticateDatabase )
56
+
57
+ function authenticateDatabase ( err , db ) {
58
+ if ( err ) {
59
+ return invokeCallbacks ( err )
60
+ }
61
+
62
+ if ( USER || PASSWORD ) {
63
+ db . authenticate ( USER , PASSWORD , saveDatabase )
64
+ } else {
65
+ invokeCallbacks ( err , db )
66
+ }
67
+
68
+ function saveDatabase ( err , success ) {
69
+ if ( success ) {
70
+ return invokeCallbacks ( err , db )
71
+ }
72
+ return invokeCallbacks ( new Error ( "auth failed" ) )
73
+ }
74
+ }
75
+
76
+ function invokeCallbacks ( err , data ) {
77
+ var callbackList = callbackQueue
78
+ cachedResults = arguments
79
+ callbackQueue = null
80
+ for ( var i = 0 , len = callbackList . length ; i < len ; i ++ ) {
81
+ callbackList [ i ] . apply ( arguments [ 1 ] , arguments )
82
+ }
83
+ }
84
+ }
85
+
86
+ function collection ( collectionName ) {
87
+ return Object . create ( Collection ) . constructor ( mongo ( collectionName ) )
88
+ }
89
+
90
+ function addToCollection ( methodName ) {
91
+ if ( typeof mongodb . Collection . prototype [ methodName ] === "function" ) {
92
+ Collection [ methodName ] = tunnel ( methodName )
93
+ }
94
+ }
95
+
96
+ function tunnel ( methodName ) {
97
+ return proxy
98
+
99
+ function proxy ( ) {
100
+ var args = arguments ,
101
+ callback = args [ args . length - 1 ]
102
+
103
+ this . collection ( invokeMethod )
104
+
105
+ function invokeMethod ( err , collection ) {
106
+ if ( err ) {
107
+ if ( callback . call ) {
108
+ callback ( err )
109
+ }
110
+ return
111
+ }
112
+ collection [ methodName ] . apply ( collection , args )
113
+ }
114
+ }
115
+ }
0 commit comments