OLD | NEW |
1 /* | 1 /* |
2 ** 2008 October 7 | 2 ** 2008 October 7 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
11 ************************************************************************* | 11 ************************************************************************* |
12 ** | 12 ** |
13 ** This file contains code use to implement an in-memory rollback journal. | 13 ** This file contains code use to implement an in-memory rollback journal. |
14 ** The in-memory rollback journal is used to journal transactions for | 14 ** The in-memory rollback journal is used to journal transactions for |
15 ** ":memory:" databases and when the journal_mode=MEMORY pragma is used. | 15 ** ":memory:" databases and when the journal_mode=MEMORY pragma is used. |
16 */ | 16 */ |
17 #include "sqliteInt.h" | 17 #include "sqliteInt.h" |
18 | 18 |
19 /* Forward references to internal structures */ | 19 /* Forward references to internal structures */ |
20 typedef struct MemJournal MemJournal; | 20 typedef struct MemJournal MemJournal; |
21 typedef struct FilePoint FilePoint; | 21 typedef struct FilePoint FilePoint; |
22 typedef struct FileChunk FileChunk; | 22 typedef struct FileChunk FileChunk; |
23 | 23 |
24 /* Space to hold the rollback journal is allocated in increments of | 24 /* Space to hold the rollback journal is allocated in increments of |
25 ** this many bytes. | 25 ** this many bytes. |
26 ** | 26 ** |
27 ** The size chosen is a little less than a power of two. That way, | 27 ** The size chosen is a little less than a power of two. That way, |
28 ** the FileChunk object will have a size that almost exactly fills | 28 ** the FileChunk object will have a size that almost exactly fills |
29 ** a power-of-two allocation. This mimimizes wasted space in power-of-two | 29 ** a power-of-two allocation. This minimizes wasted space in power-of-two |
30 ** memory allocators. | 30 ** memory allocators. |
31 */ | 31 */ |
32 #define JOURNAL_CHUNKSIZE ((int)(1024-sizeof(FileChunk*))) | 32 #define JOURNAL_CHUNKSIZE ((int)(1024-sizeof(FileChunk*))) |
33 | 33 |
34 /* Macro to find the minimum of two numeric values. | |
35 */ | |
36 #ifndef MIN | |
37 # define MIN(x,y) ((x)<(y)?(x):(y)) | |
38 #endif | |
39 | |
40 /* | 34 /* |
41 ** The rollback journal is composed of a linked list of these structures. | 35 ** The rollback journal is composed of a linked list of these structures. |
42 */ | 36 */ |
43 struct FileChunk { | 37 struct FileChunk { |
44 FileChunk *pNext; /* Next chunk in the journal */ | 38 FileChunk *pNext; /* Next chunk in the journal */ |
45 u8 zChunk[JOURNAL_CHUNKSIZE]; /* Content of this chunk */ | 39 u8 zChunk[JOURNAL_CHUNKSIZE]; /* Content of this chunk */ |
46 }; | 40 }; |
47 | 41 |
48 /* | 42 /* |
49 ** An instance of this object serves as a cursor into the rollback journal. | 43 ** An instance of this object serves as a cursor into the rollback journal. |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 memjrnlFileSize, /* xFileSize */ | 217 memjrnlFileSize, /* xFileSize */ |
224 0, /* xLock */ | 218 0, /* xLock */ |
225 0, /* xUnlock */ | 219 0, /* xUnlock */ |
226 0, /* xCheckReservedLock */ | 220 0, /* xCheckReservedLock */ |
227 0, /* xFileControl */ | 221 0, /* xFileControl */ |
228 0, /* xSectorSize */ | 222 0, /* xSectorSize */ |
229 0, /* xDeviceCharacteristics */ | 223 0, /* xDeviceCharacteristics */ |
230 0, /* xShmMap */ | 224 0, /* xShmMap */ |
231 0, /* xShmLock */ | 225 0, /* xShmLock */ |
232 0, /* xShmBarrier */ | 226 0, /* xShmBarrier */ |
233 0 /* xShmUnlock */ | 227 0, /* xShmUnmap */ |
| 228 0, /* xFetch */ |
| 229 0 /* xUnfetch */ |
234 }; | 230 }; |
235 | 231 |
236 /* | 232 /* |
237 ** Open a journal file. | 233 ** Open a journal file. |
238 */ | 234 */ |
239 void sqlite3MemJournalOpen(sqlite3_file *pJfd){ | 235 void sqlite3MemJournalOpen(sqlite3_file *pJfd){ |
240 MemJournal *p = (MemJournal *)pJfd; | 236 MemJournal *p = (MemJournal *)pJfd; |
241 assert( EIGHT_BYTE_ALIGNMENT(p) ); | 237 assert( EIGHT_BYTE_ALIGNMENT(p) ); |
242 memset(p, 0, sqlite3MemJournalSize()); | 238 memset(p, 0, sqlite3MemJournalSize()); |
243 p->pMethod = (sqlite3_io_methods*)&MemJournalMethods; | 239 p->pMethod = (sqlite3_io_methods*)&MemJournalMethods; |
244 } | 240 } |
245 | 241 |
246 /* | 242 /* |
247 ** Return true if the file-handle passed as an argument is | 243 ** Return true if the file-handle passed as an argument is |
248 ** an in-memory journal | 244 ** an in-memory journal |
249 */ | 245 */ |
250 int sqlite3IsMemJournal(sqlite3_file *pJfd){ | 246 int sqlite3IsMemJournal(sqlite3_file *pJfd){ |
251 return pJfd->pMethods==&MemJournalMethods; | 247 return pJfd->pMethods==&MemJournalMethods; |
252 } | 248 } |
253 | 249 |
254 /* | 250 /* |
255 ** Return the number of bytes required to store a MemJournal file descriptor. | 251 ** Return the number of bytes required to store a MemJournal file descriptor. |
256 */ | 252 */ |
257 int sqlite3MemJournalSize(void){ | 253 int sqlite3MemJournalSize(void){ |
258 return sizeof(MemJournal); | 254 return sizeof(MemJournal); |
259 } | 255 } |
OLD | NEW |