mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-28 00:02:28 +00:00
Get SQLite to build
* changed headers * removed redundant declarations * ran clang-format * added sqlite3.mk
This commit is contained in:
parent
644f290035
commit
919b6fec10
156 changed files with 2847 additions and 6772 deletions
43
third_party/sqlite3/wal.c
vendored
43
third_party/sqlite3/wal.c
vendored
|
@ -10,7 +10,7 @@
|
|||
**
|
||||
*************************************************************************
|
||||
**
|
||||
** This file contains the implementation of a write-ahead log (WAL) used in
|
||||
** This file contains the implementation of a write-ahead log (WAL) used in
|
||||
** "journal_mode=WAL" mode.
|
||||
**
|
||||
** WRITE-AHEAD LOG (WAL) FILE FORMAT
|
||||
|
@ -19,7 +19,7 @@
|
|||
** Each frame records the revised content of a single page from the
|
||||
** database file. All changes to the database are recorded by writing
|
||||
** frames into the WAL. Transactions commit when a frame is written that
|
||||
** contains a commit marker. A single WAL can and usually does record
|
||||
** contains a commit marker. A single WAL can and usually does record
|
||||
** multiple transactions. Periodically, the content of the WAL is
|
||||
** transferred back into the database file in an operation called a
|
||||
** "checkpoint".
|
||||
|
@ -45,11 +45,11 @@
|
|||
**
|
||||
** Immediately following the wal-header are zero or more frames. Each
|
||||
** frame consists of a 24-byte frame-header followed by a <page-size> bytes
|
||||
** of page data. The frame-header is six big-endian 32-bit unsigned
|
||||
** of page data. The frame-header is six big-endian 32-bit unsigned
|
||||
** integer values, as follows:
|
||||
**
|
||||
** 0: Page number.
|
||||
** 4: For commit records, the size of the database image in pages
|
||||
** 4: For commit records, the size of the database image in pages
|
||||
** after the commit. For all other records, zero.
|
||||
** 8: Salt-1 (copied from the header)
|
||||
** 12: Salt-2 (copied from the header)
|
||||
|
@ -75,7 +75,7 @@
|
|||
** the checksum. The checksum is computed by interpreting the input as
|
||||
** an even number of unsigned 32-bit integers: x[0] through x[N]. The
|
||||
** algorithm used for the checksum is as follows:
|
||||
**
|
||||
**
|
||||
** for i from 0 to n-1 step 2:
|
||||
** s0 += x[i] + s1;
|
||||
** s1 += x[i+1] + s0;
|
||||
|
@ -83,7 +83,7 @@
|
|||
**
|
||||
** Note that s0 and s1 are both weighted checksums using fibonacci weights
|
||||
** in reverse order (the largest fibonacci weight occurs on the first element
|
||||
** of the sequence being summed.) The s1 value spans all 32-bit
|
||||
** of the sequence being summed.) The s1 value spans all 32-bit
|
||||
** terms of the sequence whereas s0 omits the final term.
|
||||
**
|
||||
** On a checkpoint, the WAL is first VFS.xSync-ed, then valid content of the
|
||||
|
@ -116,19 +116,19 @@
|
|||
** multiple concurrent readers to view different versions of the database
|
||||
** content simultaneously.
|
||||
**
|
||||
** The reader algorithm in the previous paragraphs works correctly, but
|
||||
** The reader algorithm in the previous paragraphs works correctly, but
|
||||
** because frames for page P can appear anywhere within the WAL, the
|
||||
** reader has to scan the entire WAL looking for page P frames. If the
|
||||
** WAL is large (multiple megabytes is typical) that scan can be slow,
|
||||
** and read performance suffers. To overcome this problem, a separate
|
||||
** data structure called the wal-index is maintained to expedite the
|
||||
** search for frames of a particular page.
|
||||
**
|
||||
**
|
||||
** WAL-INDEX FORMAT
|
||||
**
|
||||
** Conceptually, the wal-index is shared memory, though VFS implementations
|
||||
** might choose to implement the wal-index using a mmapped file. Because
|
||||
** the wal-index is shared memory, SQLite does not support journal_mode=WAL
|
||||
** the wal-index is shared memory, SQLite does not support journal_mode=WAL
|
||||
** on a network filesystem. All users of the database must be able to
|
||||
** share memory.
|
||||
**
|
||||
|
@ -146,28 +146,28 @@
|
|||
** byte order of the host computer.
|
||||
**
|
||||
** The purpose of the wal-index is to answer this question quickly: Given
|
||||
** a page number P and a maximum frame index M, return the index of the
|
||||
** a page number P and a maximum frame index M, return the index of the
|
||||
** last frame in the wal before frame M for page P in the WAL, or return
|
||||
** NULL if there are no frames for page P in the WAL prior to M.
|
||||
**
|
||||
** The wal-index consists of a header region, followed by an one or
|
||||
** more index blocks.
|
||||
** more index blocks.
|
||||
**
|
||||
** The wal-index header contains the total number of frames within the WAL
|
||||
** in the mxFrame field.
|
||||
**
|
||||
** Each index block except for the first contains information on
|
||||
** Each index block except for the first contains information on
|
||||
** HASHTABLE_NPAGE frames. The first index block contains information on
|
||||
** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and
|
||||
** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and
|
||||
** HASHTABLE_NPAGE are selected so that together the wal-index header and
|
||||
** first index block are the same size as all other index blocks in the
|
||||
** wal-index.
|
||||
**
|
||||
** Each index block contains two sections, a page-mapping that contains the
|
||||
** database page number associated with each wal frame, and a hash-table
|
||||
** database page number associated with each wal frame, and a hash-table
|
||||
** that allows readers to query an index block for a specific page number.
|
||||
** The page-mapping is an array of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE
|
||||
** for the first index block) 32-bit page numbers. The first entry in the
|
||||
** for the first index block) 32-bit page numbers. The first entry in the
|
||||
** first index-block contains the database page number corresponding to the
|
||||
** first frame in the WAL file. The first entry in the second index block
|
||||
** in the WAL file corresponds to the (HASHTABLE_NPAGE_ONE+1)th frame in
|
||||
|
@ -188,8 +188,8 @@
|
|||
**
|
||||
** The hash table consists of HASHTABLE_NSLOT 16-bit unsigned integers.
|
||||
** HASHTABLE_NSLOT = 2*HASHTABLE_NPAGE, and there is one entry in the
|
||||
** hash table for each page number in the mapping section, so the hash
|
||||
** table is never more than half full. The expected number of collisions
|
||||
** hash table for each page number in the mapping section, so the hash
|
||||
** table is never more than half full. The expected number of collisions
|
||||
** prior to finding a match is 1. Each entry of the hash table is an
|
||||
** 1-based index of an entry in the mapping section of the same
|
||||
** index block. Let K be the 1-based index of the largest entry in
|
||||
|
@ -208,12 +208,12 @@
|
|||
** reached) until an unused hash slot is found. Let the first unused slot
|
||||
** be at index iUnused. (iUnused might be less than iKey if there was
|
||||
** wrap-around.) Because the hash table is never more than half full,
|
||||
** the search is guaranteed to eventually hit an unused entry. Let
|
||||
** the search is guaranteed to eventually hit an unused entry. Let
|
||||
** iMax be the value between iKey and iUnused, closest to iUnused,
|
||||
** where aHash[iMax]==P. If there is no iMax entry (if there exists
|
||||
** no hash slot such that aHash[i]==p) then page P is not in the
|
||||
** current index block. Otherwise the iMax-th mapping entry of the
|
||||
** current index block corresponds to the last entry that references
|
||||
** current index block corresponds to the last entry that references
|
||||
** page P.
|
||||
**
|
||||
** A hash search begins with the last index block and moves toward the
|
||||
|
@ -238,15 +238,16 @@
|
|||
** if no values greater than K0 had ever been inserted into the hash table
|
||||
** in the first place - which is what reader one wants. Meanwhile, the
|
||||
** second reader using K1 will see additional values that were inserted
|
||||
** later, which is exactly what reader two wants.
|
||||
** later, which is exactly what reader two wants.
|
||||
**
|
||||
** When a rollback occurs, the value of K is decreased. Hash table entries
|
||||
** that correspond to frames greater than the new K value are removed
|
||||
** from the hash table at this point.
|
||||
*/
|
||||
#ifndef SQLITE_OMIT_WAL
|
||||
/* clang-format off */
|
||||
|
||||
#include "wal.h"
|
||||
#include "third_party/sqlite3/wal.h"
|
||||
|
||||
/*
|
||||
** Trace output macros
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue