1+ /*
2+ NoSQL database for Remote IO devices.
3+ Powered by LevelDB.
4+ Original FOX Controller file.
5+ */
6+
7+
18const path = require ( "path" ) ;
29const fs = require ( "fs" ) ;
310const level = require ( "level" ) ;
411const hashGen = require ( "hashids" ) ;
512const createFolder = require ( "../fox-custom/create-folder" ) ;
613const databaseHelp = require ( "../fox-custom/database-help" ) ;
714const pathSettings = require ( "../settings" ) ;
15+
16+
17+ // Creates database root folder upon start.
818createFolder ( pathSettings . dbsPath ) ;
919
1020
21+ // Main function creates LevelDB object.
1122function loadDatabase ( dbName )
1223{
1324 var dbFolderPath = path . join ( pathSettings . dbsPath , dbName ) ;
1425 var dbHash = new hashGen ( dbName ) ;
1526 var loadedDatabaseObject = null ;
1627 var loadRes = { } ;
1728
29+
30+ // Create or load database.
1831 createFolder ( dbFolderPath ) ;
1932 loadedDatabaseObject = level ( dbFolderPath ) ;
2033
2134
35+ // Read active device entries.
2236 function callListDevices ( listCallback )
2337 {
2438 callListAllDevices ( false , listCallback ) ;
2539 }
2640
2741
42+ // List device entries.
2843 function callListAllDevices ( deleteStatus , listAllCallback )
2944 {
3045 var retrievedEntries = [ ] ;
3146 var readStreamObject = loadedDatabaseObject . createReadStream ( ) ;
3247
48+ // Read current row.
3349 readStreamObject . on ( "data" , function ( currentEntry )
3450 {
3551 addRetrievedEntry ( currentEntry , deleteStatus , retrievedEntries ) ;
3652 } ) ;
3753
54+ // Row stream end.
3855 readStreamObject . on ( "end" , function ( )
3956 {
4057 return listAllCallback ( null , retrievedEntries ) ;
4158 } ) ;
4259 }
4360
4461
62+ // Create new device.
4563 function callCreateDevice ( addInputObject , addCallback )
4664 {
4765 callUpdateDevice ( null , addInputObject , addCallback ) ;
4866 }
4967
5068
69+ // Read existing device.
5170 function callReadDevice ( readTargetID , readCallback )
5271 {
5372 var retrievedObject = null ;
@@ -56,106 +75,127 @@ function loadDatabase(dbName)
5675 {
5776 if ( readErr !== null )
5877 {
78+ // Error
5979 return readCallback ( readErr , null ) ;
6080 }
6181 else
6282 {
83+ // Successful.
6384 retrievedObject = JSON . parse ( readRes ) ;
6485 return readCallback ( null , retrievedObject ) ;
6586 }
6687 } ) ;
6788 }
6889
6990
91+ // Update existing device.
7092 function callUpdateDevice ( updateTargetID , updateInputObject , updateCallback )
7193 {
7294 var preparedID = databaseHelp . generateID ( updateTargetID , dbHash ) ;
7395 var jsonSyntaxObject = { definition : "" } ;
7496
7597
98+ // Validate and prepare update input.
7699 databaseHelp . checkUpdateInput ( updateInputObject , preparedID , jsonSyntaxObject , function ( inpCheckErr , inpCheckRes )
77100 {
78101 if ( inpCheckErr !== null )
79102 {
103+ // Input error.
80104 return updateCallback ( inpCheckErr , null ) ;
81105 }
82106 else
83107 {
108+ // Execute update.
84109 handlePut ( preparedID , jsonSyntaxObject . definition , updateCallback ) ;
85110 }
86111 } ) ;
87112
88113 }
89114
90115
116+ // Delete existing device.
91117 function callDeleteDevice ( delTargetID , delPerm , deleteCallback )
92118 {
93119 if ( delPerm === true )
94120 {
121+ // Full deletion.
95122 loadedDatabaseObject . del ( delTargetID , deleteCallback ) ;
96123 }
97124 else
98125 {
126+ // Set inactive.
99127 getDeviceForDeletion ( delTargetID , deleteCallback ) ;
100128 }
101129 }
102130
103131
132+ // Close device database.
104133 function callDatabaseClose ( dbCloseCallback )
105134 {
106135 loadedDatabaseObject . close ( dbCloseCallback ) ;
107136 }
108137
109138
139+ // Secondary - Retrieve device so it can be set inactive.
110140 function getDeviceForDeletion ( delTgtID , getDeleteCallback )
111141 {
112142 callReadDevice ( delTgtID , function ( getDeleteErr , getDeleteRes )
113143 {
114144 if ( getDeleteErr !== null )
115145 {
146+ // Error retrieving device.
116147 return getDeleteCallback ( getDeleteErr , null ) ;
117148 }
118149 else
119150 {
151+ // Set delete status.
120152 getDeleteRes . isDeleted = true ;
121153 updateDeleteStatus ( delTgtID , getDeleteRes , getDeleteCallback ) ;
122154 }
123155 } ) ;
124156 }
125157
126158
159+ // Secondary - Save device delete status.
127160 function updateDeleteStatus ( delTgt , delProps , deleteStatusCallback )
128161 {
129162 callUpdateDevice ( delTgt , delProps , function ( statUpdateErr , statUpdateRes )
130163 {
131164 if ( statUpdateErr !== null )
132165 {
166+ // Status update error.
133167 return deleteStatusCallback ( statUpdateErr , null ) ;
134168 }
135169 else
136170 {
171+ // Status updated successfully.
137172 return deleteStatusCallback ( null , true ) ;
138173 }
139174 } ) ;
140175 }
141176
142177
143178
179+ // Secondary - Execute PUT query.
144180 function handlePut ( putID , putSyntax , putCallback )
145181 {
146182 loadedDatabaseObject . put ( putID , putSyntax , function ( putErr , putRes )
147183 {
148184 if ( putErr !== undefined && putErr !== null )
149185 {
186+ // Error
150187 return putCallback ( putErr , null ) ;
151188 }
152189 else
153190 {
191+ // Successful.
154192 return putCallback ( null , putID ) ;
155193 }
156194 } ) ;
157195 }
158196
197+
198+ // Set database object properties.
159199 loadRes [ "listDevices" ] = callListDevices ;
160200 loadRes [ "listAllDevices" ] = callListAllDevices ;
161201 loadRes [ "createDeviceEntity" ] = callCreateDevice ;
@@ -168,21 +208,28 @@ function loadDatabase(dbName)
168208}
169209
170210
211+
212+
213+ // Secondary - Read database entry and save to list.
171214function addRetrievedEntry ( dataObj , delStat , entryArr )
172215{
173216 var parsedEntry = { } ;
174217
175218 try
176219 {
220+ // Parse string data into JSON.
177221 parsedEntry = JSON . parse ( dataObj . value ) ;
178222
223+
179224 if ( delStat === true || parsedEntry . isDeleted !== true )
180225 {
226+ // Save.
181227 entryArr . push ( parsedEntry ) ;
182228 }
183229 }
184230 catch ( e )
185231 {
232+ // Thrown error.
186233 parsedEntry = null ;
187234 }
188235}
0 commit comments