[hamster-applet] working around sqlite's utf8 case sensitivity (bug 624438)
- From: Toms Baugis <tbaugis src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [hamster-applet] working around sqlite's utf8 case sensitivity (bug 624438)
- Date: Thu, 15 Jul 2010 11:56:26 +0000 (UTC)
commit 1b8e5ed1688b8d2e8e977aba7a98e226e30ff35a
Author: Toms Bauģis <toms baugis gmail com>
Date: Thu Jul 15 12:56:17 2010 +0100
working around sqlite's utf8 case sensitivity (bug 624438)
src/hamster/db.py | 45 ++++++++++++++++++++++++++++++++-------------
1 files changed, 32 insertions(+), 13 deletions(-)
---
diff --git a/src/hamster/db.py b/src/hamster/db.py
index 27cf2ec..f985160 100644
--- a/src/hamster/db.py
+++ b/src/hamster/db.py
@@ -198,20 +198,20 @@ class Storage(storage.Storage):
def __add_category(self, name):
query = """
- INSERT INTO categories (name)
- VALUES (?)
+ INSERT INTO categories (name, search_name)
+ VALUES (?, ?)
"""
- self.execute(query, (name,))
+ self.execute(query, (name, name.lower()))
return self.__last_insert_rowid()
def __update_category(self, id, name):
if id > -1: # Update, and ignore unsorted, if that was somehow triggered
update = """
UPDATE categories
- SET name = ?
+ SET name = ?, search_name = ?
WHERE id = ?
"""
- self.execute(update, (name, id))
+ self.execute(update, (name, name.lower(), id))
def __get_activity_by_name(self, name, category_id = None, resurrect = True):
@@ -618,8 +618,8 @@ class Storage(storage.Storage):
def all_fields(term):
return """(lower(a.description) like '%%%(term)s%%'
- or lower(b.name) = '%(term)s'
- or lower(c.name) = '%(term)s'
+ or b.search_name = '%(term)s'
+ or c.search_name = '%(term)s'
or lower(e.name) = '%(term)s' )""" % dict(term = term)
if or_bits:
@@ -735,11 +735,12 @@ class Storage(storage.Storage):
LEFT JOIN categories b ON coalesce(b.id, -1) = a.category_id
LEFT JOIN facts f ON a.id = f.activity_id
WHERE deleted IS NULL
- AND lower(a.name) LIKE ? ESCAPE '\\'
+ AND a.search_name LIKE ? ESCAPE '\\'
GROUP BY a.id
ORDER BY max(f.start_time) DESC, lower(a.name)
LIMIT 50
"""
+ search = search.lower()
search = search.replace('\\', '\\\\').replace('%', '\\%').replace('_', '\\_')
activities = self.fetchall(query, (u'%s%%' % search, ))
@@ -782,20 +783,21 @@ class Storage(storage.Storage):
query = """
- INSERT INTO activities (name, category_id, deleted)
- VALUES (?, ?, ?)
+ INSERT INTO activities (name, search_name, category_id, deleted)
+ VALUES (?, ?, ?, ?)
"""
- self.execute(query, (name, category_id, deleted))
+ self.execute(query, (name, name.lower(), category_id, deleted))
return self.__last_insert_rowid()
def __update_activity(self, id, name, category_id):
query = """
UPDATE activities
SET name = ?,
+ search_name = ?,
category_id = ?
WHERE id = ?
"""
- self.execute(query, (name, category_id, id))
+ self.execute(query, (name, name.lower(), category_id, id))
""" Here be dragons (lame connection/cursor wrappers) """
def get_connection(self):
@@ -882,7 +884,7 @@ class Storage(storage.Storage):
"""upgrade DB to hamster version"""
version = self.fetchone("SELECT version FROM version")["version"]
- current_version = 7
+ current_version = 8
if version < 2:
"""moving from fact_date, fact_time to start_time, end_time"""
@@ -1074,6 +1076,23 @@ class Storage(storage.Storage):
self.execute("DROP table facts")
self.execute("ALTER TABLE increment_facts RENAME TO facts")
+ if version < 8:
+ # working around sqlite's utf-f case sensitivity (bug 624438)
+ # more info: http://www.gsak.net/help/hs23820.htm
+ self.execute("ALTER TABLE activities ADD COLUMN search_name varchar2")
+
+ activities = self.fetchall("select * from activities")
+ statement = "update activities set search_name = ? where id = ?"
+ for activity in activities:
+ self.execute(statement, (activity['name'].lower(), activity['id']))
+
+ # same for categories
+ self.execute("ALTER TABLE categories ADD COLUMN search_name varchar2")
+ categories = self.fetchall("select * from categories")
+ statement = "update categories set search_name = ? where id = ?"
+ for category in categories:
+ self.execute(statement, (category['name'].lower(), category['id']))
+
# at the happy end, update version number
if version < current_version:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]