fixes for sqlite on python 3.6

we need to switch to autocommit mode before executing vacuums &
certain pragmas

also removed the pysqlite version workaround; we just use the
python-provided versions in all cases now as it is new enough
This commit is contained in:
Damien Elmes 2017-01-13 17:00:03 +10:00
parent a05ebdbefb
commit e6adc3c195
5 changed files with 17 additions and 11 deletions

View File

@ -201,6 +201,7 @@ crt=?, mod=?, scm=?, dty=?, usn=?, ls=?, conf=?""",
self.modSchema(check=False) self.modSchema(check=False)
self.ls = self.scm self.ls = self.scm
# ensure db is compacted before upload # ensure db is compacted before upload
self.db.setAutocommit(True)
self.db.execute("vacuum") self.db.execute("vacuum")
self.db.execute("analyze") self.db.execute("analyze")
self.close() self.close()
@ -810,8 +811,10 @@ and queue = 0""", intTime(), self.usn())
return ("\n".join(problems), ok) return ("\n".join(problems), ok)
def optimize(self): def optimize(self):
self.db.setAutocommit(True)
self.db.execute("vacuum") self.db.execute("vacuum")
self.db.execute("analyze") self.db.execute("analyze")
self.db.setAutocommit(False)
self.lock() self.lock()
# Logging # Logging

View File

@ -5,14 +5,7 @@
import os import os
import time import time
try: from sqlite3 import dbapi2 as sqlite
from pysqlite2 import dbapi2 as sqlite
vi = sqlite.version_info
if vi[0] > 2 or vi[1] > 6:
# latest pysqlite breaks anki
raise ImportError()
except ImportError:
from sqlite3 import dbapi2 as sqlite
Error = sqlite.Error Error = sqlite.Error
@ -103,3 +96,9 @@ class DB(object):
def interrupt(self): def interrupt(self):
self._db.interrupt() self._db.interrupt()
def setAutocommit(self, autocommit):
if autocommit:
self._db.isolation_level = None
else:
self._db.isolation_level = ''

View File

@ -46,8 +46,10 @@ class Anki2Importer(Importer):
self._importCards() self._importCards()
self._importStaticMedia() self._importStaticMedia()
self._postImport() self._postImport()
self.dst.db.setAutocommit(True)
self.dst.db.execute("vacuum") self.dst.db.execute("vacuum")
self.dst.db.execute("analyze") self.dst.db.execute("analyze")
self.dst.db.setAutocommit(False)
# Notes # Notes
###################################################################### ######################################################################

View File

@ -444,8 +444,10 @@ create table meta (dirMod int, lastUsn int); insert into meta values (0, 0);
def forceResync(self): def forceResync(self):
self.db.execute("delete from media") self.db.execute("delete from media")
self.db.execute("update meta set lastUsn=0,dirMod=0") self.db.execute("update meta set lastUsn=0,dirMod=0")
self.db.execute("vacuum analyze")
self.db.commit() self.db.commit()
self.db.setAutocommit(True)
self.db.execute("vacuum analyze")
self.db.setAutocommit(False)
# Media syncing: zips # Media syncing: zips
########################################################################## ##########################################################################

View File

@ -2,7 +2,6 @@
# Copyright: Damien Elmes <anki@ichi2.net> # Copyright: Damien Elmes <anki@ichi2.net>
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import os
import copy import copy
import re import re
@ -14,7 +13,6 @@ from anki.consts import *
from anki.stdmodels import addBasicModel, addClozeModel, addForwardReverse, \ from anki.stdmodels import addBasicModel, addClozeModel, addForwardReverse, \
addForwardOptionalReverse addForwardOptionalReverse
def Collection(path, lock=True, server=False, sync=True, log=False): def Collection(path, lock=True, server=False, sync=True, log=False):
"Open a new or existing collection. Path must be unicode." "Open a new or existing collection. Path must be unicode."
assert path.endswith(".anki2") assert path.endswith(".anki2")
@ -26,6 +24,7 @@ def Collection(path, lock=True, server=False, sync=True, log=False):
assert c not in base assert c not in base
# connect # connect
db = DB(path) db = DB(path)
db.setAutocommit(True)
if create: if create:
ver = _createDB(db) ver = _createDB(db)
else: else:
@ -36,6 +35,7 @@ def Collection(path, lock=True, server=False, sync=True, log=False):
db.execute("pragma journal_mode = wal") db.execute("pragma journal_mode = wal")
else: else:
db.execute("pragma synchronous = off") db.execute("pragma synchronous = off")
db.setAutocommit(False)
# add db to col and do any remaining upgrades # add db to col and do any remaining upgrades
col = _Collection(db, server, log) col = _Collection(db, server, log)
if ver < SCHEMA_VERSION: if ver < SCHEMA_VERSION: