Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| SHA1 Hash: | b22cc4eb73c34401d74d76627de229e6bb4c5f10 |
|---|---|
| Date: | 2012-05-07 20:59:43 |
| User: | drh |
| Comment: | Avoid database locking errors caused by db_optional_sql() writes. |
Tags And Properties
- branch=trunk inherited from [bf1c21ba16]
- sym-trunk inherited from [bf1c21ba16]
Changes
Changes to src/db.c
115 struct sCommitHook { 115 struct sCommitHook { 116 int (*xHook)(void); /* Functions to call at db_end_transaction() */ 116 int (*xHook)(void); /* Functions to call at db_end_transaction() */ 117 int sequence; /* Call functions in sequence order */ 117 int sequence; /* Call functions in sequence order */ 118 } aHook[5]; 118 } aHook[5]; 119 char *azDeleteOnFail[3]; /* Files to delete on a failure */ 119 char *azDeleteOnFail[3]; /* Files to delete on a failure */ 120 char *azBeforeCommit[5]; /* Commands to run prior to COMMIT */ 120 char *azBeforeCommit[5]; /* Commands to run prior to COMMIT */ 121 int nBeforeCommit; /* Number of entries in azBeforeCommit */ 121 int nBeforeCommit; /* Number of entries in azBeforeCommit */ > 122 int nPriorChanges; /* sqlite3_total_changes() at transaction start */ 122 } db = {0, 0, 0, 0, 0, 0, }; 123 } db = {0, 0, 0, 0, 0, 0, }; 123 124 124 /* 125 /* 125 ** Arrange for the given file to be deleted on a failure. 126 ** Arrange for the given file to be deleted on a failure. 126 */ 127 */ 127 void db_delete_on_failure(const char *zFilename){ 128 void db_delete_on_failure(const char *zFilename){ 128 assert( db.nDeleteOnFail<count(db.azDeleteOnFail) ); 129 assert( db.nDeleteOnFail<count(db.azDeleteOnFail) ); ................................................................................................................................................................................ 149 /* 150 /* 150 ** Begin and end a nested transaction 151 ** Begin and end a nested transaction 151 */ 152 */ 152 void db_begin_transaction(void){ 153 void db_begin_transaction(void){ 153 if( db.nBegin==0 ){ 154 if( db.nBegin==0 ){ 154 db_multi_exec("BEGIN"); 155 db_multi_exec("BEGIN"); 155 sqlite3_commit_hook(g.db, db_verify_at_commit, 0); 156 sqlite3_commit_hook(g.db, db_verify_at_commit, 0); > 157 db.nPriorChanges = sqlite3_total_changes(g.db); 156 } 158 } 157 db.nBegin++; 159 db.nBegin++; 158 } 160 } 159 void db_end_transaction(int rollbackFlag){ 161 void db_end_transaction(int rollbackFlag){ 160 if( g.db==0 ) return; 162 if( g.db==0 ) return; 161 if( db.nBegin<=0 ) return; 163 if( db.nBegin<=0 ) return; 162 if( rollbackFlag ) db.doRollback = 1; 164 if( rollbackFlag ) db.doRollback = 1; 163 db.nBegin--; 165 db.nBegin--; 164 if( db.nBegin==0 ){ 166 if( db.nBegin==0 ){ 165 int i; 167 int i; 166 if( db.doRollback==0 ){ | 168 if( db.doRollback==0 && db.nPriorChanges<sqlite3_total_changes(g.db) ){ 167 while( db.nBeforeCommit ){ 169 while( db.nBeforeCommit ){ 168 db.nBeforeCommit--; 170 db.nBeforeCommit--; 169 db_multi_exec(db.azBeforeCommit[db.nBeforeCommit]); | 171 sqlite3_exec(g.db, db.azBeforeCommit[db.nBeforeCommit], 0, 0, 0); 170 sqlite3_free(db.azBeforeCommit[db.nBeforeCommit]); 172 sqlite3_free(db.azBeforeCommit[db.nBeforeCommit]); 171 } 173 } 172 leaf_do_pending_checks(); 174 leaf_do_pending_checks(); 173 } 175 } 174 for(i=0; db.doRollback==0 && i<db.nCommitHook; i++){ 176 for(i=0; db.doRollback==0 && i<db.nCommitHook; i++){ 175 db.doRollback |= db.aHook[i].xHook(); 177 db.doRollback |= db.aHook[i].xHook(); 176 } 178 }
Changes to src/main.c
1091 g.zBaseURL = mprintf("https://%s%.*s", zHost, i, zCur); 1091 g.zBaseURL = mprintf("https://%s%.*s", zHost, i, zCur); 1092 g.zTop = &g.zBaseURL[8+strlen(zHost)]; 1092 g.zTop = &g.zBaseURL[8+strlen(zHost)]; 1093 }else{ 1093 }else{ 1094 g.zBaseURL = mprintf("http://%s%.*s", zHost, i, zCur); 1094 g.zBaseURL = mprintf("http://%s%.*s", zHost, i, zCur); 1095 g.zTop = &g.zBaseURL[7+strlen(zHost)]; 1095 g.zTop = &g.zBaseURL[7+strlen(zHost)]; 1096 } 1096 } 1097 if( db_is_writeable("repository") ){ 1097 if( db_is_writeable("repository") ){ 1098 if( !db_exists("SELECT 1 FROM config WHERE name='baseurl:%q'", g.zBaseURL) ) | 1098 if( !db_exists("SELECT 1 FROM config WHERE name='baseurl:%q'", g.zBaseURL)){ 1099 db_multi_exec("INSERT INTO config(name,value,mtime)" 1099 db_multi_exec("INSERT INTO config(name,value,mtime)" 1100 "VALUES('baseurl:%q',1,now())", g.zBaseURL); 1100 "VALUES('baseurl:%q',1,now())", g.zBaseURL); 1101 }else{ 1101 }else{ 1102 db_optional_sql("repository", 1102 db_optional_sql("repository", 1103 "REPLACE INTO config(name,value,mtime)" 1103 "REPLACE INTO config(name,value,mtime)" 1104 "VALUES('baseurl:%q',1,now())", g.zBaseURL 1104 "VALUES('baseurl:%q',1,now())", g.zBaseURL 1105 ); 1105 );