Abstract method to build gps related subquery
[wifihood] / wifimap / db.py
1
2 import sqlite3
3
4 create_db = """
5     CREATE TABLE ap (
6         mac TEXT PRIMARY KEY UNIQUE NOT NULL,
7         rss INTEGER NOT NULL,
8         last_seen TIMESTAMP NOT NULL,
9         n INTEGER DEFAULT 0,
10         lat REAL DEFAULT 0,
11         lon REAL DEFAULT 0,
12         alt REAL DEFAULT 0,
13         lat2 REAL DEFAULT 0,
14         lon2 REAL DEFAULT 0,
15         alt2 REAL DEFAULT 0
16         );
17 """
18
19 class database :
20
21     def __init__ ( self , dbname ) :
22         self.dbname = dbname
23         self.db = None
24
25     def open ( self ) :
26
27         if self.db :
28             self.close()
29
30         self.db = sqlite3.connect( self.dbname )
31
32         rc = self.db.execute( "SELECT * FROM sqlite_master" )
33         tables = map( lambda x : "%s-%s" % ( x[0] , x[1] ) , rc.fetchall() )
34
35         if not tables :
36             self.db.executescript( create_db )
37
38     def close ( self ) :
39         if self.db :
40             self.db.close()
41             self.db = None
42
43     def is_open ( self ) :
44         if not self.db :
45             return False 
46         return True 
47
48     def __get ( self , query ) :
49         rc = self.db.execute( query )
50         return rc.fetchone()
51
52     def __extend_query ( self , gps ) :
53         lat , lon , alt = gps
54         return "lat=lat+%f , lat2=lat2+%f , lon=lon+%f , lon2=lon2+%f , alt=alt+%f , alt2=alt2+%f" % ( lat , lat*lat , lon , lon*lon , alt , alt*alt )
55
56     def add ( self , mac , rss , timestamp , gps=None ) :
57   
58         query = "INSERT INTO ap ( mac , rss , last_seen ) VALUES ( '%s' , %d , %f )" % ( mac , rss , timestamp )
59         rc = self.db.execute( query )
60         if rc.rowcount :
61             if gps :
62                 lat , lon , alt = gps
63                 query = "UPDATE ap SET n=1 , %s WHERE mac='%s'" % ( self.__extend_query(gps) , mac )
64                 rc = self.db.execute( query )
65             self.db.commit()
66
67     def update ( self , mac , rss , timestamp , gps=None ) :
68
69         query = "UPDATE ap set rss=%d , last_seen=%f" % ( rss , timestamp )
70         if gps :
71             lat , lon , alt = gps
72             query += " , n=n+1 , %s" % self.__extend_query(gps)
73         query += " WHERE mac='%s'" % mac
74         rc = self.db.execute( query )
75         if rc.rowcount :
76             self.db.commit()
77
78     def delete ( self , mac ) :
79         rc = self.db.execute( "DELETE FROM ap WHERE mac='%s'" % mac )
80         if rc.rowcount :
81             self.db.commit()
82
83     def get ( self , mac ) :
84         query = "SELECT rss FROM ap WHERE mac='%s'" % mac
85         return self.__get( query )
86
87     def nrows ( self ) :
88         query = "SELECT COUNT(*) FROM ap"
89         values = self.__get( query )
90         return int( values[0] )
91