masterrecord 0.0.30 → 0.0.31

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.
File without changes
package/Masterrecord.js CHANGED
@@ -2,254 +2,21 @@
2
2
  // https://github.com/kriasoft/node-sqlite
3
3
  // https://www.learnentityframeworkcore.com/dbset/deleting-data
4
4
  // version 1.0.19
5
+ var context = require("./context");
6
+ var schema = require("./Migrations/schema");
5
7
 
6
- var modelBuilder = require('./Entity/EntityModelBuilder');
7
- var query = require('masterrecord/QueryLanguage/queryMethods');
8
- var tools = require('./Tools');
9
- var SQLLiteEngine = require('masterrecord/SQLLiteEngine');
10
- var MYSQLEngine = require('masterrecord/MYSQLEngine');
11
- var insertManager = require('./InsertManager');
12
- var deleteManager = require('./DeleteManager');
13
- var globSearch = require("glob");
14
-
15
-
16
- class Context {
17
- _isModelValid = {
18
- isValid: true,
19
- errors: []
20
- };
21
- __entities = [];
22
- __builderEntities = [];
23
- __trackedEntities = [];
24
- __relationshipModels = [];
25
- __enviornment = "";
26
- __name = "";
27
- isSQite = false;
28
- isMySQL = false;
8
+ class masterrecord{
29
9
 
30
10
  constructor(){
31
- this. __enviornment = process.env.master;
32
- this.__name = this.constructor.name;
33
- this._SQLEngine = "";
34
- }
35
-
36
- /*
37
- SQLite expected model
38
- {
39
- "type": "better-sqlite3",
40
- "connection" : "/db/",
41
- "password": "",
42
- "username": ""
43
- }
44
- */
45
- __SQLiteInit(env, sqlName){
46
- try{
47
- const sqlite3 = require(sqlName);
48
- let DBAddress = env.completeConnection;
49
- var db = new sqlite3(DBAddress, env);
50
- db.__name = sqlName;
51
- this._SQLEngine = new SQLLiteEngine();
52
- return db;
53
- }
54
- catch (e) {
55
- console.log("error SQL", e);
56
- }
57
- }
58
-
59
- /*
60
- mysql expected model
61
- {
62
- "type": "mysql",
63
- host : 'localhost',
64
- user : 'me',
65
- password : 'secret',
66
- database : 'my_db'
67
- }
68
- */
69
- __mysqlInit(env, sqlName){
70
- try{
71
- const mysql = require(sqlName);
72
- const connection = mysql.createConnection(env);
73
- connection.connect();
74
- db.__name = sqlName;
75
- this._SQLEngine = new MYSQLEngine();
76
- return connection;
77
-
78
- }
79
- catch (e) {
80
- console.log("error SQL", e);
81
- }
82
- }
83
-
84
-
85
-
86
- __clearErrorHandler(){
87
- this._isModelValid = {
88
- isValid: true,
89
- errors: []
90
- };
91
- };
92
-
93
- __findSettings(root, rootFolderLocation, envType){
94
-
95
- var rootFolder = `${root}/${rootFolderLocation}`;
96
- var search = `${rootFolder}/**/*env.${envType}.json`;
97
- var files = globSearch.sync(search, rootFolder);
98
- var file = files[0];
99
- if(file === undefined){
100
- root = tools.removeBackwardSlashSection(root, 1, "/");
101
- rootFolder = `${root}/${rootFolderLocation}`;
102
- var search = `${rootFolder}/**/*env.${envType}.json`;
103
- var files = globSearch.sync(search,rootFolder);
104
- file = files[0];
105
- if(file === undefined){
106
- root = tools.removeBackwardSlashSection(root, 1, "/");
107
- rootFolder = `${root}/${rootFolderLocation}`;
108
- var search = `${rootFolder}/**/*env.${envType}.json`;
109
- var files = globSearch.sync(search,rootFolder);
110
- file = files[0];
111
- if(file === undefined){
112
- console.log(`could not find file - ${rootFolder}/env.${envType}.json`);
113
- throw error(`could not find file - ${rootFolder}/env.${envType}.json`);
114
- }
115
-
116
- }
117
-
118
- }
119
-
120
- return {
121
- file: file,
122
- rootFolder : root
123
- };
124
- }
125
-
126
- useSqlite(rootFolderLocation){
127
- this.isSQite = true;
128
- var root = process.cwd();
129
- var envType = this.__enviornment;
130
- var contextName = this.__name;
131
- var file = this.__findSettings(root, rootFolderLocation, envType);
132
- var settings = require(file.file);
133
- var options = settings[contextName];
134
- if(options === undefined){
135
- console.log("settings missing context name settings");
136
- throw error("settings missing context name settings");
137
- }
138
- this.validateSQLiteOptions(options);
139
- options.completeConnection = `${file.rootFolder}${options.connection}`;
140
- this.db = this.__SQLiteInit(options, "better-sqlite3");
141
- this._SQLEngine.setDB(this.db, "better-sqlite3");
142
- return this;
143
- }
144
-
145
- validateSQLiteOptions(options){
146
- if(options.hasOwnProperty('connect') === undefined){
147
- console.log("connnect string settings is missing")
148
- throw error("connection string settings is missing");
149
- }
150
-
151
- }
152
-
153
- useMySql(options, rootFolderLocation){
154
- if(options !== undefined){
155
- this.db = this.__mysqlInit(options, "mysql");
156
- this._SQLEngine.setDB(this.db, "mysql");
157
- return this;
158
- }
159
- else{
160
- console.log("database options not defined - Master Record");
161
- }
162
- }
163
-
164
-
165
- dbset(model, name){
166
- var validModel = modelBuilder.create(model);
167
- validModel.__name = name === undefined ? model.name : name;
168
- this.__entities.push(validModel); // model object
169
- var buildMod = tools.createNewInstance(validModel, query, this);
170
- this.__builderEntities.push(buildMod); // query builder entites
171
- this[validModel.__name] = buildMod;
172
- }
173
-
174
- modelState(){
175
- return this._isModelValid;
176
- }
177
-
178
- saveChanges(){
179
- try{
180
- var tracked = this.__trackedEntities;
181
- // start transaction
182
- this._SQLEngine.startTransaction();
183
- for (var model in tracked) {
184
- var currentModel = tracked[model];
185
- switch(currentModel.__state) {
186
- case "insert":
187
- var insert = new insertManager(this._SQLEngine, this._isModelValid, this.__entities);
188
- insert.init(currentModel);
189
-
190
- break;
191
- case "modified":
192
- if(currentModel.__dirtyFields.length > 0){
193
- var cleanCurrentModel = tools.removePrimarykeyandVirtual(currentModel, currentModel._entity);
194
- // build columns equal to value string
195
- var argu = this._SQLEngine._buildSQLEqualTo(cleanCurrentModel);
196
- var primaryKey = tools.getPrimaryKeyObject(cleanCurrentModel.__entity);
197
- var sqlUpdate = {tableName: cleanCurrentModel.__entity.__name, arg: argu, primaryKey : primaryKey, primaryKeyValue : cleanCurrentModel[primaryKey] };
198
- this._SQLEngine.update(sqlUpdate);
199
- }
200
- else{
201
- console.log("Tracked entity modified with no values being changed");
202
- }
203
-
204
- // code block
205
- break;
206
- case "delete":
207
- var deleteObject = new deleteManager(this._SQLEngine, this.__entities);
208
- deleteObject.init(currentModel);
209
-
210
- break;
211
- }
212
- }
213
- this.__clearErrorHandler();
214
- this._SQLEngine.endTransaction();
215
- }
216
-
217
- catch(error){
218
- this.__clearErrorHandler();
219
- this._SQLEngine.errorTransaction();
220
- console.log("error", error);
221
- this.__clearTracked();
222
- throw error;
223
- }
224
-
225
- this.__clearTracked();
226
- return true;
227
- }
228
-
229
- // TODO: WHY WE HAVE DOUBLE TRACKED OBJECTS - LOOP THROUGH ALL TRACKED OBJECTS
230
- __track(model){
231
- this.__trackedEntities.push(model);
232
- return model;
11
+ this.context = context;
12
+ this.schema = schema;
233
13
  }
14
+ }
234
15
 
235
- __findTracked(id){
236
- if(id){
237
- for (var model in this.__trackedEntities) {
238
- if(this.__trackedEntities[model].__ID === id){
239
- return this.__trackedEntities[model];
240
- }
241
- }
242
- }
243
- return null;
244
- }
245
16
 
246
- __clearTracked(){
247
- this.__trackedEntities = [];
248
- }
249
- }
17
+ module.exports = masterrecord;
250
18
 
251
19
 
252
- module.exports = Context;
253
20
 
254
21
  /*
255
22
 
package/Migrations/cli.js CHANGED
@@ -16,7 +16,7 @@ const [,, ...args] = process.argv
16
16
 
17
17
  program
18
18
  .version('0.0.2')
19
- .option('-v, --version', '0.0.30')
19
+ .option('-v, --version', '0.0.31')
20
20
  .description('A ORM framework that facilitates the creation and use of business objects whose data requires persistent storage to a database');
21
21
 
22
22
  // Instructions : to run command you must go to main project folder is located and run the command using the context file name.
@@ -87,4 +87,4 @@ class schema{
87
87
 
88
88
  */
89
89
 
90
- module.exports = Schema;
90
+ module.exports = schema;
@@ -1,7 +1,7 @@
1
1
  // ALL THIS SHOULD DO IS BUILD A SQL QUERY
2
2
  // version 1.0.222
3
3
  // TODO: change name of queryManager to select manager;
4
- var entityTrackerModel = require('masterrecord/Entity/EntityTrackerModel');
4
+ var entityTrackerModel = require('masterrecord/Entity/entityTrackerModel');
5
5
  var tools = require('masterrecord/Tools');
6
6
  var queryScript = require('masterrecord/QueryLanguage/queryScript');
7
7
 
package/context.js ADDED
@@ -0,0 +1,248 @@
1
+
2
+ var modelBuilder = require('./Entity/EntityModelBuilder');
3
+ var query = require('masterrecord/QueryLanguage/queryMethods');
4
+ var tools = require('./Tools');
5
+ var SQLLiteEngine = require('masterrecord/SQLLiteEngine');
6
+ var MYSQLEngine = require('masterrecord/MYSQLEngine');
7
+ var insertManager = require('./InsertManager');
8
+ var deleteManager = require('./DeleteManager');
9
+ var globSearch = require("glob");
10
+
11
+
12
+ class Context {
13
+ _isModelValid = {
14
+ isValid: true,
15
+ errors: []
16
+ };
17
+ __entities = [];
18
+ __builderEntities = [];
19
+ __trackedEntities = [];
20
+ __relationshipModels = [];
21
+ __enviornment = "";
22
+ __name = "";
23
+ isSQite = false;
24
+ isMySQL = false;
25
+
26
+ constructor(){
27
+ this. __enviornment = process.env.master;
28
+ this.__name = this.constructor.name;
29
+ this._SQLEngine = "";
30
+ }
31
+
32
+ /*
33
+ SQLite expected model
34
+ {
35
+ "type": "better-sqlite3",
36
+ "connection" : "/db/",
37
+ "password": "",
38
+ "username": ""
39
+ }
40
+ */
41
+ __SQLiteInit(env, sqlName){
42
+ try{
43
+ const sqlite3 = require(sqlName);
44
+ let DBAddress = env.completeConnection;
45
+ var db = new sqlite3(DBAddress, env);
46
+ db.__name = sqlName;
47
+ this._SQLEngine = new SQLLiteEngine();
48
+ return db;
49
+ }
50
+ catch (e) {
51
+ console.log("error SQL", e);
52
+ }
53
+ }
54
+
55
+ /*
56
+ mysql expected model
57
+ {
58
+ "type": "mysql",
59
+ host : 'localhost',
60
+ user : 'me',
61
+ password : 'secret',
62
+ database : 'my_db'
63
+ }
64
+ */
65
+ __mysqlInit(env, sqlName){
66
+ try{
67
+ const mysql = require(sqlName);
68
+ const connection = mysql.createConnection(env);
69
+ connection.connect();
70
+ db.__name = sqlName;
71
+ this._SQLEngine = new MYSQLEngine();
72
+ return connection;
73
+
74
+ }
75
+ catch (e) {
76
+ console.log("error SQL", e);
77
+ }
78
+ }
79
+
80
+
81
+
82
+ __clearErrorHandler(){
83
+ this._isModelValid = {
84
+ isValid: true,
85
+ errors: []
86
+ };
87
+ };
88
+
89
+ __findSettings(root, rootFolderLocation, envType){
90
+
91
+ var rootFolder = `${root}/${rootFolderLocation}`;
92
+ var search = `${rootFolder}/**/*env.${envType}.json`;
93
+ var files = globSearch.sync(search, rootFolder);
94
+ var file = files[0];
95
+ if(file === undefined){
96
+ root = tools.removeBackwardSlashSection(root, 1, "/");
97
+ rootFolder = `${root}/${rootFolderLocation}`;
98
+ var search = `${rootFolder}/**/*env.${envType}.json`;
99
+ var files = globSearch.sync(search,rootFolder);
100
+ file = files[0];
101
+ if(file === undefined){
102
+ root = tools.removeBackwardSlashSection(root, 1, "/");
103
+ rootFolder = `${root}/${rootFolderLocation}`;
104
+ var search = `${rootFolder}/**/*env.${envType}.json`;
105
+ var files = globSearch.sync(search,rootFolder);
106
+ file = files[0];
107
+ if(file === undefined){
108
+ console.log(`could not find file - ${rootFolder}/env.${envType}.json`);
109
+ throw error(`could not find file - ${rootFolder}/env.${envType}.json`);
110
+ }
111
+
112
+ }
113
+
114
+ }
115
+
116
+ return {
117
+ file: file,
118
+ rootFolder : root
119
+ };
120
+ }
121
+
122
+ useSqlite(rootFolderLocation){
123
+ this.isSQite = true;
124
+ var root = process.cwd();
125
+ var envType = this.__enviornment;
126
+ var contextName = this.__name;
127
+ var file = this.__findSettings(root, rootFolderLocation, envType);
128
+ var settings = require(file.file);
129
+ var options = settings[contextName];
130
+ if(options === undefined){
131
+ console.log("settings missing context name settings");
132
+ throw error("settings missing context name settings");
133
+ }
134
+ this.validateSQLiteOptions(options);
135
+ options.completeConnection = `${file.rootFolder}${options.connection}`;
136
+ this.db = this.__SQLiteInit(options, "better-sqlite3");
137
+ this._SQLEngine.setDB(this.db, "better-sqlite3");
138
+ return this;
139
+ }
140
+
141
+ validateSQLiteOptions(options){
142
+ if(options.hasOwnProperty('connect') === undefined){
143
+ console.log("connnect string settings is missing")
144
+ throw error("connection string settings is missing");
145
+ }
146
+
147
+ }
148
+
149
+ useMySql(options, rootFolderLocation){
150
+ if(options !== undefined){
151
+ this.db = this.__mysqlInit(options, "mysql");
152
+ this._SQLEngine.setDB(this.db, "mysql");
153
+ return this;
154
+ }
155
+ else{
156
+ console.log("database options not defined - Master Record");
157
+ }
158
+ }
159
+
160
+
161
+ dbset(model, name){
162
+ var validModel = modelBuilder.create(model);
163
+ validModel.__name = name === undefined ? model.name : name;
164
+ this.__entities.push(validModel); // model object
165
+ var buildMod = tools.createNewInstance(validModel, query, this);
166
+ this.__builderEntities.push(buildMod); // query builder entites
167
+ this[validModel.__name] = buildMod;
168
+ }
169
+
170
+ modelState(){
171
+ return this._isModelValid;
172
+ }
173
+
174
+ saveChanges(){
175
+ try{
176
+ var tracked = this.__trackedEntities;
177
+ // start transaction
178
+ this._SQLEngine.startTransaction();
179
+ for (var model in tracked) {
180
+ var currentModel = tracked[model];
181
+ switch(currentModel.__state) {
182
+ case "insert":
183
+ var insert = new insertManager(this._SQLEngine, this._isModelValid, this.__entities);
184
+ insert.init(currentModel);
185
+
186
+ break;
187
+ case "modified":
188
+ if(currentModel.__dirtyFields.length > 0){
189
+ var cleanCurrentModel = tools.removePrimarykeyandVirtual(currentModel, currentModel._entity);
190
+ // build columns equal to value string
191
+ var argu = this._SQLEngine._buildSQLEqualTo(cleanCurrentModel);
192
+ var primaryKey = tools.getPrimaryKeyObject(cleanCurrentModel.__entity);
193
+ var sqlUpdate = {tableName: cleanCurrentModel.__entity.__name, arg: argu, primaryKey : primaryKey, primaryKeyValue : cleanCurrentModel[primaryKey] };
194
+ this._SQLEngine.update(sqlUpdate);
195
+ }
196
+ else{
197
+ console.log("Tracked entity modified with no values being changed");
198
+ }
199
+
200
+ // code block
201
+ break;
202
+ case "delete":
203
+ var deleteObject = new deleteManager(this._SQLEngine, this.__entities);
204
+ deleteObject.init(currentModel);
205
+
206
+ break;
207
+ }
208
+ }
209
+ this.__clearErrorHandler();
210
+ this._SQLEngine.endTransaction();
211
+ }
212
+
213
+ catch(error){
214
+ this.__clearErrorHandler();
215
+ this._SQLEngine.errorTransaction();
216
+ console.log("error", error);
217
+ this.__clearTracked();
218
+ throw error;
219
+ }
220
+
221
+ this.__clearTracked();
222
+ return true;
223
+ }
224
+
225
+ // TODO: WHY WE HAVE DOUBLE TRACKED OBJECTS - LOOP THROUGH ALL TRACKED OBJECTS
226
+ __track(model){
227
+ this.__trackedEntities.push(model);
228
+ return model;
229
+ }
230
+
231
+ __findTracked(id){
232
+ if(id){
233
+ for (var model in this.__trackedEntities) {
234
+ if(this.__trackedEntities[model].__ID === id){
235
+ return this.__trackedEntities[model];
236
+ }
237
+ }
238
+ }
239
+ return null;
240
+ }
241
+
242
+ __clearTracked(){
243
+ this.__trackedEntities = [];
244
+ }
245
+ }
246
+
247
+
248
+ module.exports = Context;
File without changes
File without changes
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "glob" : "^8.0.3",
7
7
  "deep-object-diff" : "^1.1.7"
8
8
  },
9
- "version": "0.0.30",
9
+ "version": "0.0.31",
10
10
  "description": "An Object-relational mapping for the Master framework. Master Record connects classes to relational database tables to establish a database with almost zero-configuration ",
11
11
  "homepage": "https://github.com/Tailor/MasterRecord#readme",
12
12
  "repository": {