Modify ↓
      
Opened 10 years ago
Closed 10 years ago
#12420 closed defect (fixed)
Safety level may not be changed inside a transaction on SQLite with synchronous=normal if PySqlite 2.8.1 (3.8.2)
| Reported by: | Jun Omae | Owned by: | Jun Omae | 
|---|---|---|---|
| Priority: | normal | Milestone: | 1.0.11 | 
| Component: | database backend | Version: | 1.0-stable | 
| Severity: | normal | Keywords: | pysqlite | 
| Cc: | Branch: | ||
| Release Notes: | 
           
Fix raising   | 
      ||
| API Changes: | |||
| Internal Changes: | |||
Description
2016-03-28 00:56:58,865 Trac[pool] ERROR: Exception caught on create
Traceback (most recent call last):
  File "/home/jun66j5/src/tracdev/svn/branches/1.0-stable/trac/db/pool.py", line 105, in get_cnx
    cnx = connector.get_connection(**kwargs)
  File "/home/jun66j5/src/tracdev/svn/branches/1.0-stable/trac/db/sqlite_backend.py", line 190, in get_connection
    return SQLiteConnection(path, log, params)
  File "/home/jun66j5/src/tracdev/svn/branches/1.0-stable/trac/db/sqlite_backend.py", line 298, in __init__
    _set_synchronous(cursor, params.get('synchronous'))
  File "/home/jun66j5/src/tracdev/svn/branches/1.0-stable/trac/db/sqlite_backend.py", line 408, in _set_synchronous
    cursor.execute('PRAGMA synchronous = %s' % _quote(value))
OperationalError: Safety level may not be changed inside a transaction
2016-03-28 00:56:58,865 Trac[chrome] ERROR: Error during check of EMAIL_VIEW: TimeoutError: Unable to get database connection within 0 seconds. (OperationalError: Safety level may not be changed inside a transaction)
      Attachments (0)
Change History (5)
comment:1 by , 10 years ago
| Keywords: | pysqlite added | 
|---|
comment:2 by , 10 years ago
Patch (jomae.git@t12420) looks good to me. I tested it on trunk with PySqlite 2.8.1, SQLite 3.12, Python 2.7.10 Windows x64.
TRAC_TEST_DB_URL=sqlite:test.dbTRAC_TEST_DB_URL=sqlite:test.db?journal_mode=walTRAC_TEST_DB_URL=sqlite:test.db?journal_mode=wal&synchronous=normal
All tests pass.
comment:3 by , 10 years ago
| Owner: | set to | 
|---|---|
| Release Notes: | modified (diff) | 
| Status: | new → assigned | 
Thanks for the reviewing and testing! I'm going to push it.
comment:4 by , 10 years ago
| Milestone: | next-stable-1.0.x → 1.0.11 | 
|---|
comment:5 by , 10 years ago
| Resolution: | → fixed | 
|---|---|
| Status: | assigned → closed | 
  Note:
 See   TracTickets
 for help on using tickets.
    


  
After pysqlite 2.8.0, this issue is reproduced. Also, the same issue is raised with
journal_mode=walparameter.====================================================================== ERROR: test_insert_empty (trac.db.tests.api.StringsTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/jun66j5/src/tracdev/git/trac/db/tests/api.py", line 311, in setUp self.env = EnvironmentStub() File "/home/jun66j5/src/tracdev/git/trac/core.py", line 124, in __call__ self.__init__(*args, **kwargs) File "/home/jun66j5/src/tracdev/git/trac/test.py", line 405, in __init__ self.reset_db(default_data) File "/home/jun66j5/src/tracdev/git/trac/test.py", line 452, in reset_db self.global_databasemanager.init_db() File "/home/jun66j5/src/tracdev/git/trac/db/api.py", line 253, in init_db connector.init_db(**args) File "/home/jun66j5/src/tracdev/git/trac/db/sqlite_backend.py", line 212, in init_db _set_journal_mode(cursor, params.get('journal_mode')) File "/home/jun66j5/src/tracdev/git/trac/db/sqlite_backend.py", line 392, in _set_journal_mode cursor.execute('PRAGMA journal_mode = %s' % _quote(value)) OperationalError: cannot change into wal mode from within a transaction