92fd45bae6ee598fb8cace8e0d2c331e2e7774c5
[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 add ( self , mac , rss , timestamp , gps=None ) :
53   
54         query = "INSERT INTO ap ( mac , rss , last_seen ) VALUES ( '%s' , %d , %f )" % ( mac , rss , timestamp )
55         rc = self.db.execute( query )
56         if rc.rowcount :
57             if gps :
58                 lat , lon , alt = gps
59                 query = "UPDATE ap SET n=1 , lat=%f , lat2=%f , lon=%f , lon2=%f , alt=%f , alt2=%f WHERE mac='%s'" % ( lat , lat*lat , lon , lon*lon , alt , alt*alt , mac )
60                 rc = self.db.execute( query )
61             self.db.commit()
62
63     def update ( self , mac , rss , timestamp , gps=None ) :
64
65         query = "UPDATE ap set rss=%d , last_seen=%f" % ( rss , timestamp )
66         if gps :
67             lat , lon , alt = gps
68             query += " , n=n+1 , 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 )
69         query += " WHERE mac='%s'" % mac
70         rc = self.db.execute( query )
71         if rc.rowcount :
72             self.db.commit()
73
74     def delete ( self , mac ) :
75         rc = self.db.execute( "DELETE FROM ap WHERE mac='%s'" % mac )
76         if rc.rowcount :
77             self.db.commit()
78
79     def get ( self , mac ) :
80         query = "SELECT rss FROM ap WHERE mac='%s'" % mac
81         return self.__get( query )
82
83     def nrows ( self ) :
84         query = "SELECT COUNT(*) FROM ap"
85         values = self.__get( query )
86         return int( values[0] )
87