Comment 28 for bug 836707

Revision history for this message
vcap (vcappe) wrote :

I am unsure how that transaction stuff works.
Is that how it's done:

gboolean
midori_bookmarks_convert_table (sqlite3 *db)
{
    char *convert_errmsg;
    char *sqlcmd =
        "BEGIN TRANSACTION;"
            "ALTER TABLE bookmarks RENAME TO bookmarks_old;"
            "CREATE TABLE bookmarks"
                "(id INTEGER PRIMARY KEY AUTOINCREMENT, parentid INTEGER,"
                "title TEXT, uri TEXT, desc TEXT, app INTEGER, toolbar INTEGER,"
                "FOREIGN KEY(parentid) REFERENCES bookmarks(id) ON DELETE CASCADE);"
            "INSERT INTO bookmarks (parentid, title, uri, desc, app, toolbar) "
                "SELECT NULL AS parentid, title, uri, desc, app, toolbar "
                "FROM bookmarks_old; "
            "UPDATE bookmarks SET parentid = ("
                "SELECT id FROM bookmarks AS b1 WHERE b1.title = ("
                "SELECT folder FROM bookmarks_old WHERE title = bookmarks.title)); "
            "DROP TABLE bookmarks_old;"
        "COMMIT;";

    if (sqlite3_exec (db, sqlcmd, NULL, NULL, &convert_errmsg) != SQLITE_OK)
    {
        g_warning ("Failed to convert old bookmarks table: %s", convert_errmsg);
        sqlite3_free (convert_errmsg);

        if (sqlite3_exec (db, "ROLLBACK;", NULL, NULL, &convert_errmsg) != SQLITE_OK)
        {
            g_warning ("Could not revert changes: %s", convert_errmsg);
            sqlite3_free (convert_errmsg);
        }

        return FALSE;
    }

    return TRUE;
}