6868 unit text,
6969 start int,
7070 end int,
71- CONSTRAINT time CHECK (start < end),
7271 primary key(unit, start)
7372)
7473'''
8685)
8786'''
8887
89- def error_item_to_sql_item (_x ,meta ):
90- """
91- returns the error as a tuple and converts the time to unix timestamp (milliseconds)
92- """
93- _id = meta ['id' ]
94- #print(x['time'])
95- _time = int (get_datetime (_x ['time' ]).timestamp ()* 1000 )
96- #print(_time,x['time'],get_datetime(x['time']))
97- _spn = _x ['spn' ]
98- _fmi = _x ['fmi' ]
99- _oc = _x ['occurrenceCount' ]
100- if 'name' in _x :
101- _name = _x ['name' ]
102- else :
103- _name = 'none'
104- if 'description' in _x :
105- _desc = _x ['description' ]
106- else :
107- _desc = 'none'
108- return (_id ,_time ,_spn ,_fmi ,_oc ,_name ,_desc )
109- def sql_item_to_error_item (obj ):
110- """
111- the operation error_item_to_sql_item reversed
112- """
113- _x = {}
114- _x ['id' ] = obj [0 ]
115- _x ['time' ] = datetime .fromtimestamp (obj [1 ]/ 1000.0 ).isoformat ()
116- _x ['spn' ] = obj [2 ]
117- _x ['fmi' ] = obj [3 ]
118- _x ['occurrenceCount' ] = obj [4 ]
119- _x ['name' ] = obj [5 ]
120- _x ['description' ] = obj [6 ]
121- return _x
12288class SqlInsertIter :
12389 """iterator for tucache data"""
12490 def __init__ (self , sqliter , meta = None , _db = None ):
@@ -137,12 +103,29 @@ def __aiter__(self):
137103 return self
138104
139105 async def __anext__ (self ):
106+ def map_f (_x ,meta ):
107+ _id = meta ['id' ]
108+ #print(x['time'])
109+ _time = int (get_datetime (_x ['time' ]).timestamp ()* 1000 )
110+ #print(_time,x['time'],get_datetime(x['time']))
111+ _spn = _x ['spn' ]
112+ _fmi = _x ['fmi' ]
113+ _oc = _x ['occurrenceCount' ]
114+ if 'name' in _x :
115+ _name = _x ['name' ]
116+ else :
117+ _name = 'none'
118+ if 'description' in _x :
119+ _desc = _x ['description' ]
120+ else :
121+ _desc = 'none'
122+ return (_id ,_time ,_spn ,_fmi ,_oc ,_name ,_desc )
123+
140124 try :
141125 data , meta = await self .sqliter .__anext__ ()
142126 if self ._db is not None :
143127 #print(data)
144- data = list (data )
145- sqldata = map (lambda x : error_item_to_sql_item (x ,meta ),data )
128+ sqldata = map (lambda x : map_f (x ,meta ),data )
146129 self .cur .executemany ("INSERT INTO error VALUES (?,?,?,?,?,?,?)" ,sqldata )
147130 return data , meta
148131 except StopAsyncIteration as exc :
@@ -153,17 +136,7 @@ async def __anext__(self):
153136 print ("Committed" )
154137 self ._db .commit ()
155138 raise StopAsyncIteration from exc
156- except sqlite3 .IntegrityError as exc1 :
157- print ("Integrety error with" ,meta )
158- print ("Try to find double entry (insert side)" )
159- sqldata = map (lambda x : error_item_to_sql_item (x ,meta ),data )
160- for in_item in sqldata :
161- try :
162- self .cur .execute ("INSERT INTO error VALUES (?,?,?,?,?,?,?)" ,in_item )
163- except sqlite3 .IntegrityError as exc2 :
164- print ("Item throwing Integrity error" ,in_item )
165- self ._db .rollback ()
166- raise sqlite3 .IntegrityError from exc1
139+
167140class SqlCache :
168141 """Sql cache can cache trackunit data in Sqlite DB"""
169142 def __init__ (self ,auth = None ,_dir = None ,db_file = "webdb.db" ,upstream_cache = None ):
@@ -197,16 +170,16 @@ def get_history(self, unit, start):
197170 print (meta )
198171 except StopIteration :
199172 print ("no element found" )
173+
200174 def get_candata (self ,unit ,start ):
201175 """returns history data of a vehicle with start and end date"""
202176 #tbd
203- def get_faults_upstream (self , veh_id , start_ts , end_ts , previter = None ):
177+ def get_errors_upstream (self , veh_id , start_ts , end_ts , previter = None ):
204178 """gets errors from upstream cache"""
205179 cur = self ._db .cursor ()
206180
207181 cur .execute ("INSERT INTO errormeta VALUES (?,?,?)" ,(veh_id ,start_ts ,end_ts ))
208- # wait until data is in database and commit then
209- #self._db.commit()
182+ self ._db .commit ()
210183
211184 start = datetime .fromtimestamp (start_ts / 1000.0 )
212185 end = datetime .fromtimestamp (end_ts / 1000.0 )
@@ -227,48 +200,48 @@ def get_faults_upstream(self, veh_id, start_ts, end_ts, previter=None):
227200
228201 return previter , _len
229202
230- def get_faults_unixts (self , veh_id , start_ts , end_ts , previter = None ):
203+ def get_errors (self , veh_id , start , end , previter = None ):
204+ """returns error in between the given datetime objects"""
205+ start_ts = int (start .timestamp ()* 1000 )
206+ end_ts = int (end .timestamp ()* 1000 )
207+ return self .get_errors_unixts (veh_id , start_ts , end_ts , previter )
208+
209+ def get_errors_unixts (self , veh_id , start_ts , end_ts , previter = None ):
231210 """returns error in between the given datetime objects"""
232211
233212 cur = self ._db .cursor ()
234213
235214 # Query meta database to check whether there the data is in database
236215 try :
237- me_vehid , me_start , me_end = next (iter (cur .execute ("""
238- select * from errormeta where unit = ? and (
239- (start <= ? and end > ?) or
240- (start < ? and end >= ?) or
241- (start >= ? and end <= ?)
242- ) order by start
243- """ ,(veh_id ,start_ts ,start_ts ,end_ts ,end_ts ,start_ts ,end_ts ))))
216+ _ , me_start , me_end = next (iter (cur .execute ("""
217+ select * from errormeta where unit = ? and
218+ (start <= ? and end >= ?) or
219+ (start <= ? and end >= ?) order by start
220+ """ ,(veh_id ,start_ts ,start_ts ,end_ts ,end_ts ))))
244221 me_start = int (float (me_start ))
245222 me_end = int (float (me_end ))
246223 except StopIteration :
247- print ("Stop iteration. Didnt find" ,\
248- veh_id ,start_ts ,end_ts ,\
249- "Get errors from upstream now" )
250- return self .get_faults_upstream (veh_id ,start_ts ,end_ts ,previter )
251-
252- print ("Found block" ,me_vehid ,me_start ,me_end )
224+ print ("Stop iteration. Get errors from upstream now" )
225+ return self .get_errors_upstream (veh_id ,start_ts ,end_ts ,previter )
253226
254227 # Depending on the start and end of the next block, apply divide and conquer
255228 # by recursive calls of this function.
256229 if me_start <= start_ts :
257230 if me_end < end_ts :
258- previter , cnt1 = self .get_faults_unixts (veh_id ,start_ts ,me_end ,previter )
259- previter , cnt2 = self .get_faults_unixts (veh_id ,me_end + 1 ,end_ts ,previter )
231+ previter , cnt1 = self .get_errors_unixts (veh_id ,start_ts ,me_end ,previter )
232+ previter , cnt2 = self .get_errors_unixts (veh_id ,me_end + 1 ,start_ts ,previter )
260233 return previter ,(cnt1 + cnt2 )
261- return self .get_faults_sql (veh_id ,start_ts ,end_ts ,previter )
234+ return self .get_errors_sql (veh_id ,start_ts ,end_ts ,previter )
262235 if me_end >= end_ts :
263- previter , cnt1 = self .get_faults_unixts (veh_id ,start_ts ,me_start - 1 ,previter )
264- previter , cnt2 = self .get_faults_unixts (veh_id ,me_start ,end_ts ,previter )
236+ previter , cnt1 = self .get_errors_unixts (veh_id ,start_ts ,me_start - 1 ,previter )
237+ previter , cnt2 = self .get_errors_unixts (veh_id ,me_start ,end_ts ,previter )
265238 return previter ,(cnt1 + cnt2 )
266- previter , cnt1 = self .get_faults_unixts (veh_id ,start_ts ,me_start - 1 ,previter )
267- previter , cnt2 = self .get_faults_unixts (veh_id ,me_start ,me_end ,previter )
268- previter , cnt3 = self .get_faults_unixts (veh_id ,me_end + 1 ,end_ts ,previter )
239+ previter , cnt1 = self .get_errors_unixts (veh_id ,start_ts ,me_start - 1 ,previter )
240+ previter , cnt2 = self .get_errors_unixts (veh_id ,me_start ,me_end ,previter )
241+ previter , cnt3 = self .get_errors_unixts (veh_id ,me_end + 1 ,end_ts ,previter )
269242 return previter ,(cnt1 + cnt2 + cnt3 )
270243
271- def get_faults_sql (self , veh_id , start_ts , end_ts , previter = None ):
244+ def get_errors_sql (self , veh_id , start_ts , end_ts , previter = None ):
272245 """gets data of this period from db whether or not it was actually stored there"""
273246 cur = self ._db .cursor ()
274247
@@ -279,8 +252,6 @@ def get_faults_sql(self, veh_id, start_ts, end_ts, previter=None):
279252 order by time
280253 """ ,(veh_id ,start_ts ,end_ts )))[0 ]
281254
282- print ("found" ,cnt ,"in sql" )
283-
284255 meta = {}
285256 meta ["id" ] = veh_id
286257 meta ["start" ] = start_ts
@@ -290,11 +261,9 @@ def get_faults_sql(self, veh_id, start_ts, end_ts, previter=None):
290261 previter = TuIter ()
291262
292263 if cnt > 0 :
293- previter .add (SqlIter (iter (map ( lambda x : [ x ], map ( sql_item_to_error_item , cur .execute (\
264+ previter .add (SqlIter (iter (cur .execute (\
294265 "select * from error where unit = ? and time >= ? and time <= ? order by time" ,\
295- (veh_id ,start_ts ,end_ts ))))),meta ))
296- else :
297- print ("could not find any item in block " , start_ts , end_ts ,"for unit" ,veh_id )
266+ (veh_id ,start_ts ,end_ts ))),meta ))
298267
299268 return previter , cnt
300269 def get_faults (self ,veh_id ,tdelta = None ,previter = None ):
@@ -304,16 +273,14 @@ def get_faults(self,veh_id,tdelta=None,previter=None):
304273 else :
305274 end = self .tdelta_end
306275 end = end .replace (hour = 0 ,minute = 0 ,second = 0 ,microsecond = 0 )
307- if isinstance (tdelta ,timedelta ):
308- start = end - tdelta
276+ if isinstance (tdelta ,datetime ):
277+ start = end + tdelta
309278 else :
310279 irange = int (tdelta )
311280 if irange <= 0 :
312281 return []
313282 start = end - timedelta (days = irange )
314- return self .get_faults_timedelta (veh_id ,start ,end ,previter )
283+ return self .get_errors (veh_id ,start ,end ,previter )
315284 def get_faults_timedelta (self ,veh_id ,start ,end ,previter = None ):
316- """returns error in between the given datetime objects"""
317- start_ts = int (start .timestamp ()* 1000 )
318- end_ts = int (end .timestamp ()* 1000 )
319- return self .get_faults_unixts (veh_id , start_ts , end_ts , previter )
285+ """get_faults_timedelta"""
286+ return self .get_errors (veh_id ,start ,end ,previter )
0 commit comments