MERGE : incorporate changes on cleaning branch to completelly decouple wifiview and...
[wifihood] / wifiscanner / 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         query = []
54         lat , lon , alt = gps
55         if lat and lon :
56             query.append( "lat=lat+%f , lat2=lat2+%f , lon=lon+%f , lon2=lon2+%f" % ( lat , lat*lat , lon , lon*lon ) )
57         if alt :
58             query.append( "alt=alt+%f , alt2=alt2+%f" % ( alt , alt*alt ) )
59         return " , ".join( query )
60
61     def add ( self , mac , rss , timestamp , gps ) :
62   
63         query = "INSERT INTO ap ( mac , rss , last_seen ) VALUES ( '%s' , %d , %f )" % ( mac , rss , timestamp )
64         rc = self.db.execute( query )
65         if rc.rowcount :
66             extra = self.__extend_query(gps)
67             if extra :
68                 query = "UPDATE ap SET n=1 , %s WHERE mac='%s'" % ( extra , mac )
69                 rc = self.db.execute( query )
70             self.db.commit()
71
72     def update ( self , mac , rss , timestamp , gps ) :
73
74         query = "UPDATE ap set rss=%d , last_seen=%f" % ( rss , timestamp )
75         extra = self.__extend_query(gps)
76         if extra :
77             query += " , n=n+1 , %s" % extra
78         query += " WHERE mac='%s'" % mac
79         rc = self.db.execute( query )
80         if rc.rowcount :
81             self.db.commit()
82
83     def delete ( self , mac ) :
84         rc = self.db.execute( "DELETE FROM ap WHERE mac='%s'" % mac )
85         if rc.rowcount :
86             self.db.commit()
87
88     def get ( self , mac ) :
89         query = "SELECT rss FROM ap WHERE mac='%s'" % mac
90         return self.__get( query )
91
92     def nrows ( self ) :
93         query = "SELECT COUNT(*) FROM ap"
94         values = self.__get( query )
95         return int( values[0] )
96