meadow 1.0.34 → 1.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.config/configstore/update-notifier-npm.json +1 -1
- package/Dockerfile +15 -0
- package/README.md +0 -5
- package/debug/Harness.js +0 -1
- package/package.json +20 -4
- package/source/Meadow.js +16 -6
- package/source/behaviors/Meadow-Undelete.js +42 -0
- package/source/providers/Meadow-Provider-ALASQL.js +33 -0
- package/source/providers/Meadow-Provider-MySQL.js +40 -0
- package/source/providers/Meadow-Provider-None.js +8 -0
- package/test/Meadow-Provider-ALASQL.js +32 -8
- package/test/Meadow-Provider-MySQL_tests.js +37 -8
- package/test/Meadow-Provider-None_tests.js +15 -0
package/Dockerfile
CHANGED
|
@@ -26,6 +26,21 @@ RUN ( sudo mysqld_safe --skip-grant-tables --skip-networking & ) && sleep 5 &&
|
|
|
26
26
|
# Import the initial database
|
|
27
27
|
RUN sudo service mariadb restart && sleep 5 && mysql -u root -p"123456789" -e "CREATE DATABASE FableTest;"
|
|
28
28
|
|
|
29
|
+
RUN echo "...installing vscode extensions..."
|
|
30
|
+
RUN code-server --install-extension rangav.vscode-thunder-client \
|
|
31
|
+
code-server --install-extension hbenl.vscode-mocha-test-adapter \
|
|
32
|
+
code-server --install-extension hbenl.vscode-test-explorer \
|
|
33
|
+
code-server --install-extension hbenl.test-adapter-converter \
|
|
34
|
+
code-server --install-extension cweijan.vscode-mysql-client2 \
|
|
35
|
+
code-server --install-extension daylerees.rainglow \
|
|
36
|
+
code-server --install-extension oderwat.indent-rainbow \
|
|
37
|
+
code-server --install-extension evan-buss.font-switcher \
|
|
38
|
+
code-server --install-extension vscode-icons-team.vscode-icons \
|
|
39
|
+
code-server --install-extension bengreenier.vscode-node-readme \
|
|
40
|
+
code-server --install-extension bierner.color-info \
|
|
41
|
+
code-server --install-extension dbaeumer.vscode-eslint \
|
|
42
|
+
code-server --install-extension PKief.material-icon-theme
|
|
43
|
+
|
|
29
44
|
SHELL ["/bin/bash", "-c"]
|
|
30
45
|
USER coder
|
|
31
46
|
|
package/README.md
CHANGED
|
@@ -3,11 +3,6 @@ Meadow
|
|
|
3
3
|
|
|
4
4
|
A Javascript Data Broker.
|
|
5
5
|
|
|
6
|
-
[](https://coveralls.io/r/stevenvelozo/meadow?branch=master)
|
|
7
|
-
[](https://travis-ci.org/stevenvelozo/meadow)
|
|
8
|
-
[](https://david-dm.org/stevenvelozo/meadow)
|
|
9
|
-
[](https://david-dm.org/stevenvelozo/meadow#info=devDependencies)
|
|
10
|
-
|
|
11
6
|
Who doesn't love writing the same code over and over again? Good question. Anybody who doesn't probably wants something to do simple data access stuff. And some of the complicated interactions as well. Meadow aims to provide a simple “magic where you want it, programmability where you don't” pattern.
|
|
12
7
|
|
|
13
8
|
## Install
|
package/debug/Harness.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "meadow",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.35",
|
|
4
4
|
"description": "A data access library.",
|
|
5
5
|
"main": "source/Meadow.js",
|
|
6
6
|
"scripts": {
|
|
@@ -11,6 +11,24 @@
|
|
|
11
11
|
"docker-dev-build-image": "docker build ./ -t retold/meadow:local",
|
|
12
12
|
"docker-dev-run": "docker run -it -d --name meadow-dev -p 127.0.0.1:12342:8080 -p 12106:3306 -v \"$PWD/.config:/home/coder/.config\" -v \"$PWD:/home/coder/meadow\" -u \"$(id -u):$(id -g)\" -e \"DOCKER_USER=$USER\" retold/meadow:local"
|
|
13
13
|
},
|
|
14
|
+
"mocha": {
|
|
15
|
+
"diff": true,
|
|
16
|
+
"extension": [
|
|
17
|
+
"js"
|
|
18
|
+
],
|
|
19
|
+
"package": "./package.json",
|
|
20
|
+
"reporter": "spec",
|
|
21
|
+
"slow": "75",
|
|
22
|
+
"timeout": "5000",
|
|
23
|
+
"ui": "tdd",
|
|
24
|
+
"watch-files": [
|
|
25
|
+
"source/**/*.js",
|
|
26
|
+
"test/**/*.js"
|
|
27
|
+
],
|
|
28
|
+
"watch-ignore": [
|
|
29
|
+
"lib/vendor"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
14
32
|
"repository": {
|
|
15
33
|
"type": "git",
|
|
16
34
|
"url": "https://github.com/stevenvelozo/meadow.git"
|
|
@@ -28,8 +46,6 @@
|
|
|
28
46
|
"devDependencies": {
|
|
29
47
|
"alasql": "^0.4.0",
|
|
30
48
|
"chai": "3.5.0",
|
|
31
|
-
"codeclimate-test-reporter": "0.4.1",
|
|
32
|
-
"coveralls": "2.13.1",
|
|
33
49
|
"groc": "^0.8.0",
|
|
34
50
|
"istanbul": "0.4.5",
|
|
35
51
|
"mocha": "3.4.1",
|
|
@@ -38,7 +54,7 @@
|
|
|
38
54
|
"dependencies": {
|
|
39
55
|
"async": "2.4.0",
|
|
40
56
|
"fable": "~1.0.1",
|
|
41
|
-
"foxhound": "^1.0.
|
|
57
|
+
"foxhound": "^1.0.39",
|
|
42
58
|
"is-my-json-valid": "2.16.0",
|
|
43
59
|
"underscore": "1.8.3"
|
|
44
60
|
}
|
package/source/Meadow.js
CHANGED
|
@@ -43,6 +43,7 @@ var Meadow = function()
|
|
|
43
43
|
var _ReadsBehavior = require('./behaviors/Meadow-Reads.js');
|
|
44
44
|
var _UpdateBehavior = require('./behaviors/Meadow-Update.js');
|
|
45
45
|
var _DeleteBehavior = require('./behaviors/Meadow-Delete.js');
|
|
46
|
+
var _UndeleteBehavior = require('./behaviors/Meadow-Undelete.js');
|
|
46
47
|
var _CountBehavior = require('./behaviors/Meadow-Count.js');
|
|
47
48
|
|
|
48
49
|
// The data provider
|
|
@@ -70,12 +71,12 @@ var Meadow = function()
|
|
|
70
71
|
/**
|
|
71
72
|
* Load a Meadow Package JSON from file, create a Meadow object from it.
|
|
72
73
|
*/
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
74
|
+
var _MeadowPackageObjectLoader = require('./Meadow-PackageObjectLoader.js');
|
|
75
|
+
var loadFromPackageObject = function(pPackage)
|
|
76
|
+
{
|
|
77
|
+
return _MeadowPackageObjectLoader(this, pPackage);
|
|
78
|
+
};
|
|
79
|
+
|
|
79
80
|
/**
|
|
80
81
|
* Pass relevant state into the provider
|
|
81
82
|
*
|
|
@@ -276,6 +277,14 @@ var Meadow = function()
|
|
|
276
277
|
return _DeleteBehavior(this, pQuery, fCallBack);
|
|
277
278
|
};
|
|
278
279
|
|
|
280
|
+
/**
|
|
281
|
+
* Undelete a record
|
|
282
|
+
*/
|
|
283
|
+
var doUndelete = function(pQuery, fCallBack)
|
|
284
|
+
{
|
|
285
|
+
return _UndeleteBehavior(this, pQuery, fCallBack);
|
|
286
|
+
};
|
|
287
|
+
|
|
279
288
|
/**
|
|
280
289
|
* Count multiple records
|
|
281
290
|
*/
|
|
@@ -366,6 +375,7 @@ var Meadow = function()
|
|
|
366
375
|
doReads: doReads,
|
|
367
376
|
doUpdate: doUpdate,
|
|
368
377
|
doDelete: doDelete,
|
|
378
|
+
doUndelete: doUndelete,
|
|
369
379
|
doCount: doCount,
|
|
370
380
|
|
|
371
381
|
validateObject: _Schema.validateObject,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
|
|
2
|
+
/**
|
|
3
|
+
* @license MIT
|
|
4
|
+
* @author <steven@velozo.com>
|
|
5
|
+
*/
|
|
6
|
+
var libAsync = require('async');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Meadow Behavior - Undelete a single record
|
|
10
|
+
*
|
|
11
|
+
* @function meadowBehaviorUndelete
|
|
12
|
+
*/
|
|
13
|
+
var meadowBehaviorUndelete = function(pMeadow, pQuery, fCallBack)
|
|
14
|
+
{
|
|
15
|
+
// TODO: Check if this recordset has implicit delete tracking, branch in this module?
|
|
16
|
+
// Undelete the record(s) if they were deleted with a bit
|
|
17
|
+
libAsync.waterfall(
|
|
18
|
+
[
|
|
19
|
+
// Step 1: Undelete the record
|
|
20
|
+
function (fStageComplete)
|
|
21
|
+
{
|
|
22
|
+
if (pMeadow.rawQueries.checkQuery('Undelete'))
|
|
23
|
+
{
|
|
24
|
+
pQuery.parameters.queryOverride = pMeadow.rawQueries.getQuery('Undelete');
|
|
25
|
+
}
|
|
26
|
+
pMeadow.provider.Undelete(pQuery, function(){ fStageComplete(pQuery.result.error, pQuery, pQuery.result.value); });
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
function(pError, pQuery, pRecord)
|
|
30
|
+
{
|
|
31
|
+
if (pError)
|
|
32
|
+
{
|
|
33
|
+
pMeadow.fable.log.warn('Error during the undelete waterfall', {Error:pError, Message: pError.message, Query: pQuery.query});
|
|
34
|
+
}
|
|
35
|
+
fCallBack(pError, pQuery, pRecord);
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
return pMeadow;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
module.exports = meadowBehaviorUndelete;
|
|
@@ -304,6 +304,38 @@ var MeadowProvider = function()
|
|
|
304
304
|
fCallback();
|
|
305
305
|
};
|
|
306
306
|
|
|
307
|
+
var Undelete = function(pQuery, fCallback)
|
|
308
|
+
{
|
|
309
|
+
var tmpResult = pQuery.parameters.result;
|
|
310
|
+
|
|
311
|
+
checkDataExists(pQuery.parameters);
|
|
312
|
+
|
|
313
|
+
pQuery.setDialect('ALASQL').buildUndeleteQuery();
|
|
314
|
+
var fQuery = libALASQL.compile(pQuery.query.body);
|
|
315
|
+
|
|
316
|
+
if (pQuery.logLevel > 0 ||
|
|
317
|
+
_GlobalLogLevel > 0)
|
|
318
|
+
{
|
|
319
|
+
_Fable.log.trace(pQuery.query.body, pQuery.query.parameters);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
try
|
|
323
|
+
{
|
|
324
|
+
tmpResult.error = undefined;
|
|
325
|
+
tmpResult.executed = false;
|
|
326
|
+
|
|
327
|
+
tmpResult.value = fQuery(pQuery.query.parameters);
|
|
328
|
+
|
|
329
|
+
tmpResult.executed = true;
|
|
330
|
+
}
|
|
331
|
+
catch (pError)
|
|
332
|
+
{
|
|
333
|
+
tmpResult.error = pError;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
fCallback();
|
|
337
|
+
};
|
|
338
|
+
|
|
307
339
|
var Count = function(pQuery, fCallback)
|
|
308
340
|
{
|
|
309
341
|
var tmpResult = pQuery.parameters.result;
|
|
@@ -463,6 +495,7 @@ var MeadowProvider = function()
|
|
|
463
495
|
Read: Read,
|
|
464
496
|
Update: Update,
|
|
465
497
|
Delete: Delete,
|
|
498
|
+
Undelete: Undelete,
|
|
466
499
|
Count: Count,
|
|
467
500
|
|
|
468
501
|
new: createNew
|
|
@@ -189,6 +189,45 @@ var MeadowProvider = function()
|
|
|
189
189
|
});
|
|
190
190
|
};
|
|
191
191
|
|
|
192
|
+
var Undelete = function(pQuery, fCallback)
|
|
193
|
+
{
|
|
194
|
+
var tmpResult = pQuery.parameters.result;
|
|
195
|
+
|
|
196
|
+
pQuery.setDialect('MySQL').buildUndeleteQuery();
|
|
197
|
+
|
|
198
|
+
if (pQuery.logLevel > 0 ||
|
|
199
|
+
_GlobalLogLevel > 0)
|
|
200
|
+
{
|
|
201
|
+
_Fable.log.trace(pQuery.query.body, pQuery.query.parameters);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
getSQLPool().getConnection(function(pError, pDBConnection)
|
|
205
|
+
{
|
|
206
|
+
pDBConnection.query
|
|
207
|
+
(
|
|
208
|
+
pQuery.query.body,
|
|
209
|
+
pQuery.query.parameters,
|
|
210
|
+
// The MySQL library also returns the Fields as the third parameter
|
|
211
|
+
function(pError, pRows)
|
|
212
|
+
{
|
|
213
|
+
pDBConnection.release();
|
|
214
|
+
tmpResult.error = pError;
|
|
215
|
+
tmpResult.value = false;
|
|
216
|
+
try
|
|
217
|
+
{
|
|
218
|
+
tmpResult.value = pRows.affectedRows;
|
|
219
|
+
}
|
|
220
|
+
catch(pErrorGettingRowcount)
|
|
221
|
+
{
|
|
222
|
+
_Fable.log.warn('Error getting affected rowcount during delete query',{Body:pQuery.query.body, Parameters:pQuery.query.parameters});
|
|
223
|
+
}
|
|
224
|
+
tmpResult.executed = true;
|
|
225
|
+
return fCallback();
|
|
226
|
+
}
|
|
227
|
+
);
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
|
|
192
231
|
var Count = function(pQuery, fCallback)
|
|
193
232
|
{
|
|
194
233
|
var tmpResult = pQuery.parameters.result;
|
|
@@ -235,6 +274,7 @@ var MeadowProvider = function()
|
|
|
235
274
|
Read: Read,
|
|
236
275
|
Update: Update,
|
|
237
276
|
Delete: Delete,
|
|
277
|
+
Undelete: Undelete,
|
|
238
278
|
Count: Count,
|
|
239
279
|
|
|
240
280
|
new: createNew
|
|
@@ -52,6 +52,13 @@ var MeadowProvider = function()
|
|
|
52
52
|
fCallback();
|
|
53
53
|
};
|
|
54
54
|
|
|
55
|
+
var Undelete = function(pQuery, fCallback)
|
|
56
|
+
{
|
|
57
|
+
// This does nothing because it's the none data provider!
|
|
58
|
+
pQuery.parameters.result.executed = true;
|
|
59
|
+
fCallback();
|
|
60
|
+
};
|
|
61
|
+
|
|
55
62
|
var Count = function(pQuery, fCallback)
|
|
56
63
|
{
|
|
57
64
|
// This does nothing because it's the none data provider!
|
|
@@ -67,6 +74,7 @@ var MeadowProvider = function()
|
|
|
67
74
|
Read: Read,
|
|
68
75
|
Update: Update,
|
|
69
76
|
Delete: Delete,
|
|
77
|
+
Undelete: Undelete,
|
|
70
78
|
Count: Count,
|
|
71
79
|
|
|
72
80
|
new: createNew
|
|
@@ -18,14 +18,14 @@ var libALASQL = require('alasql');
|
|
|
18
18
|
var libFable = require('fable').new({
|
|
19
19
|
LogStreams:
|
|
20
20
|
[
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
{
|
|
22
|
+
level: 'fatal',
|
|
23
|
+
streamtype:'process.stdout',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
level: 'trace',
|
|
27
|
+
path: __dirname+'/../tests.log'
|
|
28
|
+
}
|
|
29
29
|
]
|
|
30
30
|
});
|
|
31
31
|
|
|
@@ -291,6 +291,30 @@ suite
|
|
|
291
291
|
}
|
|
292
292
|
);
|
|
293
293
|
test
|
|
294
|
+
(
|
|
295
|
+
'Undelete a record in the database',
|
|
296
|
+
function(fDone)
|
|
297
|
+
{
|
|
298
|
+
var testMeadow = newMeadow();
|
|
299
|
+
|
|
300
|
+
testMeadow.fable.settings.QueryThresholdWarnTime = 1;
|
|
301
|
+
var tmpQuery = testMeadow.query.addFilter('IDAnimal',3);
|
|
302
|
+
|
|
303
|
+
testMeadow.doUndelete(tmpQuery,
|
|
304
|
+
function(pError, pQuery, pRecord)
|
|
305
|
+
{
|
|
306
|
+
// TODO: Research why this is working but not returning the row count
|
|
307
|
+
Expect(pRecord)
|
|
308
|
+
.to.equal(0);
|
|
309
|
+
|
|
310
|
+
testMeadow.fable.settings.QueryThresholdWarnTime = 1000;
|
|
311
|
+
|
|
312
|
+
fDone();
|
|
313
|
+
}
|
|
314
|
+
)
|
|
315
|
+
}
|
|
316
|
+
);
|
|
317
|
+
test
|
|
294
318
|
(
|
|
295
319
|
'Count all records from the database',
|
|
296
320
|
function(fDone)
|
|
@@ -29,14 +29,14 @@ var tmpFableSettings = (
|
|
|
29
29
|
},
|
|
30
30
|
LogStreams:
|
|
31
31
|
[
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
{
|
|
33
|
+
level: 'fatal',
|
|
34
|
+
streamtype:'process.stdout',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
level: 'trace',
|
|
38
|
+
path: __dirname+'/../tests.log'
|
|
39
|
+
}
|
|
40
40
|
]
|
|
41
41
|
});
|
|
42
42
|
|
|
@@ -379,6 +379,35 @@ suite
|
|
|
379
379
|
}
|
|
380
380
|
);
|
|
381
381
|
test
|
|
382
|
+
(
|
|
383
|
+
'Undelete a record in the database',
|
|
384
|
+
function(fDone)
|
|
385
|
+
{
|
|
386
|
+
var testMeadow = newMeadow();
|
|
387
|
+
|
|
388
|
+
testMeadow.fable.settings.QueryThresholdWarnTime = 1;
|
|
389
|
+
var tmpDeleteQuery = testMeadow.query.addFilter('IDAnimal',5);
|
|
390
|
+
|
|
391
|
+
// Make sure the record is deleted!
|
|
392
|
+
testMeadow.doDelete(tmpDeleteQuery,
|
|
393
|
+
function(pDeleteError, pDeleteQuery, pDeleteRecord)
|
|
394
|
+
{
|
|
395
|
+
var tmpQuery = testMeadow.query.addFilter('IDAnimal',5);
|
|
396
|
+
testMeadow.doUndelete(tmpQuery,
|
|
397
|
+
function(pError, pQuery, pRecord)
|
|
398
|
+
{
|
|
399
|
+
// It returns the number of rows deleted
|
|
400
|
+
Expect(pRecord)
|
|
401
|
+
.to.equal(1);
|
|
402
|
+
|
|
403
|
+
testMeadow.fable.settings.QueryThresholdWarnTime = 1000;
|
|
404
|
+
|
|
405
|
+
fDone();
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
);
|
|
410
|
+
test
|
|
382
411
|
(
|
|
383
412
|
'Count all records from the database',
|
|
384
413
|
function(fDone)
|
|
@@ -186,6 +186,21 @@ suite
|
|
|
186
186
|
}
|
|
187
187
|
);
|
|
188
188
|
test
|
|
189
|
+
(
|
|
190
|
+
'Undelete a record in the database',
|
|
191
|
+
function(fDone)
|
|
192
|
+
{
|
|
193
|
+
var testMeadow = newMeadow();
|
|
194
|
+
testMeadow.doUndelete(testMeadow.query,
|
|
195
|
+
function(pError, pQuery, pRecord)
|
|
196
|
+
{
|
|
197
|
+
Expect(pQuery.parameters.result.executed).to.equal(true);
|
|
198
|
+
fDone();
|
|
199
|
+
}
|
|
200
|
+
)
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
test
|
|
189
204
|
(
|
|
190
205
|
'Count all records from the database',
|
|
191
206
|
function(fDone)
|