Helpviewer/Bookmarks/BookmarksImporters/FirefoxImporter.py

changeset 1725
d7a3430f7cbf
parent 1719
c65aefefa2ff
child 2302
f29e9405c851
diff -r 6e690a8f5971 -r d7a3430f7cbf Helpviewer/Bookmarks/BookmarksImporters/FirefoxImporter.py
--- a/Helpviewer/Bookmarks/BookmarksImporters/FirefoxImporter.py	Tue Mar 20 19:47:18 2012 +0100
+++ b/Helpviewer/Bookmarks/BookmarksImporters/FirefoxImporter.py	Wed Mar 21 12:02:57 2012 +0100
@@ -8,9 +8,9 @@
 """
 
 import os
+import sqlite3
 
 from PyQt4.QtCore import QCoreApplication, QDate, Qt, QUrl
-from PyQt4.QtSql import QSqlDatabase, QSqlQuery
 
 from ..BookmarkNode import BookmarkNode
 
@@ -32,6 +32,9 @@
         if Globals.isWindowsPlatform():
             standardDir = os.path.expandvars(
                 "%APPDATA%\\Mozilla\\Firefox\\Profiles")
+        elif Globals.isMacPlatform():
+            standardDir = os.path.expanduser(
+                "~/Library/Application Support/Firefox/Profiles")
         else:
             standardDir = os.path.expanduser("~/.mozilla/firefox")
         return (
@@ -85,14 +88,12 @@
                 .format(self.__fileName)
             return False
         
-        self.__db = QSqlDatabase.addDatabase("QSQLITE")
-        self.__db.setDatabaseName(self.__fileName)
-        opened = self.__db.open()
-        
-        if not opened:
+        try:
+            self.__db = sqlite3.connect(self.__fileName)
+        except sqlite3.DatabaseError as err:
             self._error = True
             self._errorString = self.trUtf8("Unable to open database.\nReason: {0}")\
-                .format(self.__db.lastError().text())
+                .format(str(err))
             return False
         
         return True
@@ -103,53 +104,64 @@
         
         @return imported bookmarks (BookmarkNode)
         """
-        importRootNode = BookmarkNode(BookmarkNode.Folder)
+        importRootNode = BookmarkNode(BookmarkNode.Root)
         
         # step 1: build the hierarchy of bookmark folders
         folders = {}
-        query = QSqlQuery(self.__db)
-        query.exec_(
-            "SELECT id, parent, title FROM moz_bookmarks WHERE type = 2 and title !=''")
-        while query.next():
-            id_ = int(query.value(0))
-            parent = int(query.value(1))
-            title = query.value(2)
-            if parent in folders:
-                folder = BookmarkNode(BookmarkNode.Folder, folders[parent])
-            else:
-                folder = BookmarkNode(BookmarkNode.Folder, importRootNode)
-            folder.title = title.replace("&", "&&")
-            folders[id_] = folder
+        
+        try:
+            cursor = self.__db.cursor()
+            cursor.execute(
+                "SELECT id, parent, title FROM moz_bookmarks "
+                "WHERE type = 2 and title !=''")
+            for row in cursor:
+                id_ = row[0]
+                parent = row[1]
+                title = row[2]
+                if parent in folders:
+                    folder = BookmarkNode(BookmarkNode.Folder, folders[parent])
+                else:
+                    folder = BookmarkNode(BookmarkNode.Folder, importRootNode)
+                folder.title = title.replace("&", "&&")
+                folders[id_] = folder
+        except sqlite3.DatabaseError as err:
+            self._error = True
+            self._errorString = self.trUtf8("Unable to open database.\nReason: {0}")\
+                .format(str(err))
+            return None
         
-        query = QSqlQuery(self.__db)
-        query.exec_(
-            "SELECT parent, title, fk, position FROM moz_bookmarks"
-            " WHERE type = 1 and title != '' ORDER BY position")
-        while query.next():
-            parent = int(query.value(0))
-            title = query.value(1).replace("&", "&&")
-            placesId = int(query.value(2))
-            
-            query2 = QSqlQuery(self.__db)
-            query2.exec_("SELECT url FROM moz_places WHERE id = {0}".format(placesId))
-            if not query2.next():
-                continue
-            
-            url = QUrl(query2.value(0))
-            if not title or url.isEmpty() or url.scheme() in ["place", "about"]:
-                continue
-            
-            if parent in folders:
-                bookmark = BookmarkNode(BookmarkNode.Bookmark, folders[parent])
-            else:
-                bookmark = BookmarkNode(BookmarkNode.Bookmark, importRootNode)
-            bookmark.url = url.toString()
-            bookmark.title = title.replace("&", "&&")
+        try:
+            cursor = self.__db.cursor()
+            cursor.execute(
+                "SELECT parent, title, fk, position FROM moz_bookmarks"
+                " WHERE type = 1 and title != '' ORDER BY position")
+            for row in cursor:
+                parent = row[0]
+                title = row[1]
+                placesId = row[2]
+                
+                cursor2 = self.__db.cursor()
+                cursor2.execute(
+                    "SELECT url FROM moz_places WHERE id = {0}".format(placesId))
+                row2 = cursor2.fetchone()
+                if row2:
+                    url = QUrl(row2[0])
+                    if not title or url.isEmpty() or url.scheme() in ["place", "about"]:
+                        continue
+                    
+                    if parent in folders:
+                        bookmark = BookmarkNode(BookmarkNode.Bookmark, folders[parent])
+                    else:
+                        bookmark = BookmarkNode(BookmarkNode.Bookmark, importRootNode)
+                    bookmark.url = url.toString()
+                    bookmark.title = title.replace("&", "&&")
+        except sqlite3.DatabaseError as err:
+            self._error = True
+            self._errorString = self.trUtf8("Unable to open database.\nReason: {0}")\
+                .format(str(err))
+            return None
         
-        if query.lastError().isValid():
-            self._error = True
-            self._errorString = query.lastError().text()
-        
+        importRootNode.setType(BookmarkNode.Folder)
         if self._id == "firefox":
             importRootNode.title = self.trUtf8("Mozilla Firefox Import")
         else:

eric ide

mercurial