diff options
Diffstat (limited to 'places.py')
-rw-r--r-- | places.py | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/places.py b/places.py new file mode 100644 index 0000000..1277835 --- /dev/null +++ b/places.py @@ -0,0 +1,138 @@ +# Copyright (C) 2008, Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +import os +import sqlite3 +from datetime import datetime, timedelta + +from sugar.activity import activity + +_store = None + +class Place(object): + def __init__(self, uri=None): + self.uri = uri + self.title = None + self.bookmark = False + self.gecko_flags = 0 + self.visits = 0 + self.last_visit = datetime.now() + +class SqliteStore(object): + MAX_SEARCH_MATCHES = 20 + EXPIRE_DAYS = 30 + + def __init__(self): + db_path = os.path.join(activity.get_activity_root(), + 'data', 'places.db') + + self._connection = sqlite3.connect(db_path) + cursor = self._connection.cursor() + + cursor.execute('select * from sqlite_master where name == "places"') + if cursor.fetchone() == None: + cursor.execute("""create table places ( + uri text, + title text, + bookmark boolean, + gecko_flags integer, + visits integer, + last_visit timestamp + ); + """) + else: + self._cleanup() + + def search(self, text): + cursor = self._connection.cursor() + + try: + text = '%' + text + '%' + cursor.execute('select uri, title, bookmark, gecko_flags, ' \ + 'visits, last_visit from places ' \ + 'where uri like ? or title like ? ' \ + 'order by visits desc limit 0, ?', + (text, text, self.MAX_SEARCH_MATCHES)) + + result = [self._place_from_row(row) for row in cursor] + finally: + cursor.close() + + return result + + def add_place(self, place): + cursor = self._connection.cursor() + + try: + cursor.execute('insert into places (uri, title, bookmark, ' \ + 'gecko_flags, visits, last_visit) ' \ + 'values (?, ?, ?, ?, ?, ?)', \ + (place.uri, place.title, place.bookmark, + place.gecko_flags, place.visits, place.last_visit)) + self._connection.commit() + finally: + cursor.close() + + def lookup_place(self, uri): + cursor = self._connection.cursor() + + try: + cursor.execute('select uri, title, bookmark, gecko_flags,visits, ' \ + 'last_visit from places where uri=?', (uri,)) + + row = cursor.fetchone() + if row: + return self._place_from_row(row) + else: + return None + finally: + cursor.close() + + def update_place(self, place): + cursor = self._connection.cursor() + + try: + cursor.execute('update places set title=?, gecko_flags=?, ' + 'visits=?, last_visit=?, bookmark=? where uri=?', + (place.title, place.gecko_flags, place.visits, + place.last_visit, place.bookmark, place.uri)) + self._connection.commit() + finally: + cursor.close() + + def _place_from_row(self, row): + place = Place() + + place.uri, place.title, place.bookmark, place.gecko_flags, \ + place.visits, place.last_visit = row + + return place + + def _cleanup(self): + cursor = self._connection.cursor() + + try: + date = datetime.now() - timedelta(days=self.EXPIRE_DAYS) + cursor.execute('delete from places where last_visit < ?', (date,)) + self._connection.commit() + finally: + cursor.close() + +def get_store(): + global _store + if _store == None: + _store = SqliteStore() + return _store |