-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStringStore.js
165 lines (157 loc) · 4.6 KB
/
StringStore.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
var MongoClient = require('mongodb').MongoClient;
/**
* Store an array of name value pairs. Each pair also gets a timestamp and are arranged into an array
* @param {String} url URL to the MongoDB Database
* @param {Function(Error)} onConnected Function to call on success/failure
*/
function Database(url, onConnected) {
var self = this;
try {
MongoClient.connect(url, function (err, db) {
if (err) {
if (onConnected)
setImmediate(onConnected, err);
}
else {
self.db = db;
self.collection = db.collection('StringStore');
if (onConnected)
setImmediate(onConnected, null);
}
});
}
catch (e) {
console.log(e);
if (onConnected)
setImmediate(onConnected, new Error('Failed to connect to database'));
}
}
/**
* Closes the database connection if there is one.
*/
Database.prototype.close = function close() {
try {
this.db.close();
}
catch (e) {
console.error(e);
}
};
/**
* Add a string to the array for the name provided
* @param {String} name Name of the name-value array
* @param {String} s A value to push to the name-value array.
* @param {Function(Error)} callback Function to call on success/failure
*/
Database.prototype.push = function push(name, s, callback) {
try {
this.collection.insert({ name: name, created: new Date(), value: s }, function(err, num, status) {
if (err || num == null) {
console.error(err);
if (callback)
setImmediate(callback, new Error('Failed to push value to database'));
}
else if (callback)
setImmediate(callback, null);
});
}
catch (e) {
console.log(e);
if (callback)
setImmediate(callback, new Error('Failed to insert value to database'));
}
};
/**
* Add multiple strings to the array for the name provided
* @param {String} name Name of the name-value array
* @param {String} s Array of values to push to the name-value array.
* @param {Function(Error)} callback Function to call on success/failure
*/
Database.prototype.pushMany = function pushMany(name, arr, callback) {
try {
for (var i = arr.length - 1; i > -1; i--) {
arr[i] = {name: name, created: new Date(), value: arr[i]};
}
this.collection.insert(arr, function(err, num, status) {
if (err || num == null) {
console.error(err);
if (callback)
setImmediate(callback, new Error('Failed to push values to database'));
}
else if (callback)
setImmediate(callback, null);
});
}
catch (e) {
console.log(e);
if (callback)
setImmediate(callback, new Error('Failed to insert values to database'));
}
};
/**
* Get the most recent string for the name provided
* @param {String} name Name of the name-value array
* @param {Function(Error, Value)} callback Function to call on success/failure with value
*/
Database.prototype.peek = function peek(name, callback) {
try {
this.collection.find({ name: name }, { _id: false, name: true, created: true, value: true }, { sort: [['created', 'desc']], limit: 1 }, function (err, cursor) {
if (err) {
console.error(err);
if (callback)
setImmediate(callback, new Error('Failed to peek at one string.'));
}
else if (callback) {
cursor.toArray(function (err, docs) {
if (err) {
console.error(err);
setImmediate(callback, new Error('Failed to convert cursor to array.'), null);
}
else if (docs == null || docs.length == 0)
setImmediate(callback, null, null);
else
setImmediate(callback, null, docs[0]);
});
}
});
}
catch (e) {
console.log(e);
if (callback)
setImmediate(callback, new Error('Failed to find value in database'));
}
};
/**
* Get the most recent strings for the name provided
* @param {String} name Name of the name-value array
* @param {Function(Error, Values)} callback Function to call on success/failure with values
*/
Database.prototype.peekMany = function peekMany(name, callback) {
try {
this.collection.find({ name: name }, { _id: false, name: true, created: true, value: true }, { sort: [['created', 'desc']] }, function (err, cursor) {
if (err) {
console.error(err);
if (callback)
setImmediate(callback, new Error('Failed to peek at all strings.'));
}
else if (callback) {
cursor.toArray(function (err, docs) {
if (err) {
console.error(err);
setImmediate(callback, new Error('Failed to convert cursor to array.'), null);
}
else if (docs == null || docs.length == 0)
setImmediate(callback, null, null);
else
setImmediate(callback, null, docs);
});
}
});
}
catch (e) {
console.log(e);
if (callback)
setImmediate(callback, new Error('Failed to find values in database'));
}
};
module.exports = Database;