forked from maksrom/javascript-nodejs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdataUtil.js
More file actions
executable file
·137 lines (104 loc) · 3.15 KB
/
dataUtil.js
File metadata and controls
executable file
·137 lines (104 loc) · 3.15 KB
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
var mongoose = require('mongoose');
var log = require('log')();
var co = require('co');
var thunk = require('thunkify');
var db;
function *createEmptyDb() {
function *open() {
if (mongoose.connection.readyState == 1) { // connected
return mongoose.connection.db;
}
yield thunk(mongoose.connection.on)('open');
return mongoose.connection.db;
}
function *clearDatabase() {
var collections = yield new Promise(function(resolve, reject) {
db.listCollections().toArray(function(err, items) {
if (err) return reject(err);
resolve(items);
});
});
var collectionNames = collections
.map(function(collection) {
//console.log(collection.name);
//var collectionName = collection.name.slice(db.databaseName.length + 1);
if (collection.name.indexOf('system.') === 0) {
return null;
}
return collection.name;
})
.filter(Boolean);
yield collectionNames.map(function(name) {
log.debug("drop ", name);
return thunk(db.dropCollection)(name);
});
}
// wait till indexes are complete, especially unique
// required to throw errors
function *ensureIndexes() {
yield mongoose.modelNames().map(function(modelName) {
var model = mongoose.models[modelName];
return thunk(model.ensureIndexes.bind(model))();
});
}
// ensure that capped collections are actually capped
function *ensureCapped() {
yield mongoose.modelNames().map(function(modelName) {
var model = mongoose.models[modelName];
var schema = model.schema;
if (!schema.options.capped) return;
return thunk(db.command)({convertToCapped: model.collection.name, size: schema.options.capped});
});
}
log.debug("co");
db = yield open();
log.debug("open");
yield clearDatabase();
log.debug("clear");
yield ensureIndexes();
log.debug('indexes');
yield ensureCapped();
log.debug('capped');
}
// tried using pow-mongoose-fixtures,
// but it fails with capped collections, it calls remove() on them => everything dies
// so rolling my own tiny-loader
function *loadModels(data, options) {
options = options || {};
var modelsData = (typeof data == 'string') ? require(data) : data;
var modelNames = Object.keys(modelsData);
for(var modelName in modelsData) {
var Model = mongoose.models[modelName];
if (options.reset) {
yield Model.destroy({});
}
yield* loadModel(Model, modelsData[modelName]);
}
}
// load data into the DB, replace if _id is the same
function *loadModel(Model, data) {
for (var i = 0; i < data.length; i++) {
if (data[i]._id) {
yield Model.destroy({_id: data[i]._id});
}
var model = new Model(data[i]);
log.debug("persist", data[i]);
try {
yield model.persist();
} catch (e) {
if (e.name == 'ValidationError') {
log.error("loadModel persist validation error", e, e.errors);
}
throw e;
}
}
log.debug("loadModel is done");
}
exports.loadModels = loadModels;
exports.createEmptyDb = createEmptyDb;
/*
Usage:
co(loadModels('sampleDb'))(function(err) {
if (err) throw err;
mongoose.connection.close();
});*/