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