@@ -1,8 +1,8 @@
1 1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/******************************************************************************
2 2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This file is an amalgamation of many separate C source files from SQLite
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** version 3.6.23. By combining all the individual C code files into this
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** version 3.7.0. By combining all the individual C code files into this
4 4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** single large file, the entire code can be compiled as a one translation
5 5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** unit. This allows many compilers to do optimizations that would not be
6 6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** possible if the files were compiled separately. Performance improvements
7 7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of 5% are more are commonly seen when SQLite is compiled as a single
8 8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** translation unit.
@@ -188,10 +188,18 @@
188 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
189 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_DEFAULT_TEMP_CACHE_SIZE
190 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define SQLITE_DEFAULT_TEMP_CACHE_SIZE 500
191 191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
192 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The default number of frames to accumulate in the log file before
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** checkpointing the database in WAL mode.
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
193 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
194 202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The maximum number of attached databases. This must be between 0
195 203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and 30. The upper bound on 30 is because a 32-bit integer bitmap
196 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is used internally to track attached databases.
197 205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -626,13 +634,13 @@
626 634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
627 635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** See also: [sqlite3_libversion()],
628 636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
629 637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite_version()] and [sqlite_source_id()].
630 638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_VERSION "3.6.23"
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_VERSION_NUMBER 3006023
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_SOURCE_ID "2010-04-15 23:24:29 f96782b389b5b97b488dc5814f7082e0393f64cd"
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_VERSION "3.7.0"
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_VERSION_NUMBER 3007000
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SOURCE_ID "2010-06-16 12:30:11 ad3209572d0e6afe5c8b52313e334509661045e2"
634 642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
635 643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
636 644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Run-Time Library Version Numbers
637 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** KEYWORDS: sqlite3_version, sqlite3_sourceid
638 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -912,11 +920,11 @@
912 920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
913 921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
914 922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_NOTFOUND 12 /* NOT USED. Table or record not found */
915 923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FULL 13 /* Insertion failed because database is full */
916 924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_PROTOCOL 15 /* NOT USED. Database lock protocol error */
925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_PROTOCOL 15 /* Database lock protocol error */
918 926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_EMPTY 16 /* Database is empty */
919 927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_SCHEMA 17 /* The database schema changed */
920 928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */
921 929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */
922 930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_MISMATCH 20 /* Data type mismatch */
@@ -968,11 +976,16 @@
968 976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8))
969 977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8))
970 978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8))
971 979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8))
972 980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8))
973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8) )
981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8))
982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8))
983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8))
984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
974 987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
975 988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
976 989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Flags For File Open Operations
977 990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
978 991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** These bit values are intended for use in the
@@ -1177,10 +1190,17 @@
1177 1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xUnlock)(sqlite3_file*, int);
1178 1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xCheckReservedLock)(sqlite3_file*, int *pResOut);
1179 1192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xFileControl)(sqlite3_file*, int op, void *pArg);
1180 1193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xSectorSize)(sqlite3_file*);
1181 1194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xDeviceCharacteristics)(sqlite3_file*);
1195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Methods above are valid for version 1 */
1196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xShmOpen)(sqlite3_file*);
1197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xShmLock)(sqlite3_file*, int offset, int n, int flags);
1198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xShmMap)(sqlite3_file*, int iPage, int pgsz, int, void volatile**);
1199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*xShmBarrier)(sqlite3_file*);
1200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xShmClose)(sqlite3_file*, int deleteFlag);
1201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Methods above are valid for version 2 */
1182 1202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Additional methods may be added in future releases */
1183 1203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1184 1204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1185 1205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1186 1206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Standard File Control Opcodes
@@ -1194,15 +1214,23 @@
1194 1214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED],
1195 1215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE])
1196 1216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** into an integer that the pArg argument points to. This capability
1197 1217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is used during testing and only needs to be supported when SQLITE_TEST
1198 1218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is defined.
1219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS
1221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** layer a hint of how large the database file will grow to be during the
1222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current transaction. This hint is not guaranteed to be accurate but it
1223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is often close. The underlying VFS might choose to preallocate database
1224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file space based on this hint in order to help writes to the database
1225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file run faster.
1199 1226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1200 1227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FCNTL_LOCKSTATE 1
1201 1228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_GET_LOCKPROXYFILE 2
1202 1229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_SET_LOCKPROXYFILE 3
1203 1230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_LAST_ERRNO 4
1231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_FCNTL_SIZE_HINT 5
1204 1232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1205 1233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1206 1234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Mutex Handle
1207 1235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1208 1236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The mutex module within SQLite defines [sqlite3_mutex] to be an
@@ -1343,11 +1371,11 @@
1343 1371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** method returns a Julian Day Number for the current date and time.
1344 1372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1345 1373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1346 1374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct sqlite3_vfs sqlite3_vfs;
1347 1375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct sqlite3_vfs {
1348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iVersion; /* Structure version number */
1376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iVersion; /* Structure version number (currently 2) */
1349 1377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int szOsFile; /* Size of subclassed sqlite3_file */
1350 1378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int mxPathname; /* Maximum file pathname length */
1351 1379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vfs *pNext; /* Next registered VFS */
1352 1380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName; /* Name of this virtual file system */
1353 1381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pAppData; /* Pointer to application-specific data */
@@ -1362,12 +1390,21 @@
1362 1390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*xDlClose)(sqlite3_vfs*, void*);
1363 1391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut);
1364 1392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xSleep)(sqlite3_vfs*, int microseconds);
1365 1393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xCurrentTime)(sqlite3_vfs*, double*);
1366 1394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xGetLastError)(sqlite3_vfs*, int, char *);
1367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* New fields may be appended in figure versions. The iVersion
1368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** value will increment whenever this happens. */
1395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The methods above are in version 1 of the sqlite_vfs object
1397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** definition. Those that follow are added in version 2 or later
1398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xRename)(sqlite3_vfs*, const char *zOld, const char *zNew, int dirSync);
1400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*);
1401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The methods above are in versions 1 and 2 of the sqlite_vfs object.
1403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** New fields may be appended in figure versions. The iVersion
1404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** value will increment whenever this happens.
1405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1369 1406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1370 1407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1371 1408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1372 1409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Flags for the xAccess VFS method
1373 1410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -1382,10 +1419,48 @@
1382 1419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** checks whether the file is readable.
1383 1420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1384 1421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_ACCESS_EXISTS 0
1385 1422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_ACCESS_READWRITE 1
1386 1423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_ACCESS_READ 2
1424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** CAPI3REF: Flags for the xShmLock VFS method
1427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** These integer constants define the various locking operations
1429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** allowed by the xShmLock method of [sqlite3_io_methods]. The
1430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** following are the only legal combinations of flags to the
1431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** xShmLock method:
1432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <ul>
1434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <li> SQLITE_SHM_LOCK | SQLITE_SHM_SHARED
1435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <li> SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE
1436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <li> SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED
1437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <li> SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE
1438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** </ul>
1439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as
1441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** was given no the corresponding lock.
1442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The xShmLock method can transition between unlocked and SHARED or
1444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** between unlocked and EXCLUSIVE. It cannot transition between SHARED
1445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and EXCLUSIVE.
1446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SHM_UNLOCK 1
1448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SHM_LOCK 2
1449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SHM_SHARED 4
1450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SHM_EXCLUSIVE 8
1451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** CAPI3REF: Maximum xShmLock index
1454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The xShmLock method on [sqlite3_io_methods] may use values
1456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** between 0 and this upper bound as its "offset" argument.
1457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The SQLite core will never attempt to acquire or release a
1458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** lock outside of this range
1459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SHM_NLOCK 8
1461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1387 1462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1388 1463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1389 1464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Initialize The SQLite Library
1390 1465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1391 1466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^The sqlite3_initialize() routine initializes the
@@ -3409,10 +3484,18 @@
3409 3484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** already been [sqlite3_finalize | finalized] or on one that had
3410 3485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could
3411 3486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be the case that the same database connection is being used by two or
3412 3487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** more threads at the same moment in time.
3413 3488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
3489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For all versions of SQLite up to and including 3.6.23.1, it was required
3490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** after sqlite3_step() returned anything other than [SQLITE_ROW] that
3491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [sqlite3_reset()] be called before any subsequent invocation of
3492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3_step(). Failure to invoke [sqlite3_reset()] in this way would
3493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** result in an [SQLITE_MISUSE] return from sqlite3_step(). But after
3494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** version 3.6.23.1, sqlite3_step() began calling [sqlite3_reset()]
3495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** automatically in this circumstance rather than returning [SQLITE_MISUSE].
3496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
3414 3497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** <b>Goofy Interface Alert:</b> In the legacy interface, the sqlite3_step()
3415 3498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** API always returns a generic error code, [SQLITE_ERROR], following any
3416 3499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call
3417 3500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the
3418 3501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** specific [error codes] that better describes the error.
@@ -5507,11 +5590,12 @@
5507 5590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TESTCTRL_ASSERT 12
5508 5591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TESTCTRL_ALWAYS 13
5509 5592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TESTCTRL_RESERVE 14
5510 5593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
5511 5594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TESTCTRL_ISKEYWORD 16
5512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_TESTCTRL_LAST 16
5595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_TESTCTRL_PGHDRSZ 17
5596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_TESTCTRL_LAST 17
5513 5597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
5514 5598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
5515 5599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: SQLite Runtime Status
5516 5600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
5517 5601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^This interface is used to retrieve runtime status information
@@ -5971,14 +6055,18 @@
5971 6055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** then an [error code] is returned. ^As well as [SQLITE_OK] and
5972 6056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY],
5973 6057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an
5974 6058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code.
5975 6059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
5976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** ^The sqlite3_backup_step() might return [SQLITE_READONLY] if the destination
5977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** database was opened read-only or if
5978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the destination is an in-memory database with a different page size
5979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** from the source database.
6060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if
6061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <ol>
6062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <li> the destination database was opened read-only, or
6063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <li> the destination database is using write-ahead-log journaling
6064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and the destination and source page sizes differ, or
6065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <li> The destination database is an in-memory database and the
6066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** destination and source page sizes differ.
6067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** </ol>)^
5980 6068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
5981 6069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then
5982 6070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the [sqlite3_busy_handler | busy-handler function]
5983 6071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is invoked (if one is specified). ^If the
5984 6072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** busy-handler returns non-zero before the lock is available, then
@@ -6242,10 +6330,93 @@
6242 6330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a few hundred characters, it will be truncated to the length of the
6243 6331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** buffer.
6244 6332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
6245 6333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...);
6246 6334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
6335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
6336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** CAPI3REF: Write-Ahead Log Commit Hook
6337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The [sqlite3_wal_hook()] function is used to register a callback that
6339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** will be invoked each time a database connection commits data to a
6340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [write-ahead log] (i.e. whenever a transaction is committed in
6341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [journal_mode | journal_mode=WAL mode]).
6342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The callback is invoked by SQLite after the commit has taken place and
6344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the associated write-lock on the database released, so the implementation
6345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** may read, write or [checkpoint] the database as required.
6346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The first parameter passed to the callback function when it is invoked
6348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is a copy of the third parameter passed to sqlite3_wal_hook() when
6349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** registering the callback. ^The second is a copy of the database handle.
6350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The third parameter is the name of the database that was written to -
6351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter
6352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is the number of pages currently in the write-ahead log file,
6353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** including those that were just committed.
6354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The callback function should normally return [SQLITE_OK]. ^If an error
6356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** code is returned, that error will propagate back up through the
6357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLite code base to cause the statement that provoked the callback
6358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to report an error, though the commit will have still occurred. If the
6359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value
6360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that does not correspond to any valid SQLite error code, the results
6361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are undefined.
6362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A single database handle may have at most a single write-ahead log callback
6364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any
6365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** previously registered write-ahead log callback. ^Note that the
6366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [sqlite3_wal_autocheckpoint()] interface and the
6367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will
6368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** those overwrite any prior [sqlite3_wal_hook()] settings.
6369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
6370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_API void *sqlite3_wal_hook(
6371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3*,
6372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int(*)(void *,sqlite3*,const char*,int),
6373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void*
6374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
6375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
6376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
6377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** CAPI3REF: Configure an auto-checkpoint
6378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around
6380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [sqlite3_wal_hook()] that causes any database on [database connection] D
6381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to automatically [checkpoint]
6382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** after committing a transaction if there are N or
6383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** more frames in the [write-ahead log] file. ^Passing zero or
6384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a negative value as the nFrame parameter disables automatic
6385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** checkpoints entirely.
6386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The callback registered by this function replaces any existing callback
6388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback
6389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism
6390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** configured by this function.
6391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The [wal_autocheckpoint pragma] can be used to invoke this interface
6393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** from SQL.
6394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^Every new [database connection] defaults to having the auto-checkpoint
6396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** enabled with a threshold of 1000 pages. The use of this interface
6397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is only necessary if the default setting is found to be suboptimal
6398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for a particular application.
6399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
6400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N);
6401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
6402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
6403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** CAPI3REF: Checkpoint a database
6404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The [sqlite3_wal_checkpoint(D,X)] interface causes database named X
6406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** on [database connection] D to be [checkpointed]. ^If X is NULL or an
6407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** empty string, then a checkpoint is run on all databases of
6408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** connection D. ^If the database connection D is not in
6409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [WAL | write-ahead log mode] then this interface is a harmless no-op.
6410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
6411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The [wal_checkpoint pragma] can be used to invoke this interface
6412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** from SQL. ^The [sqlite3_wal_autocheckpoint()] interface and the
6413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [wal_autocheckpoint pragma] can be used to cause this interface to be
6414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** run whenever the WAL reaches a certain size threshold.
6415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
6416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb);
6417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
6247 6418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
6248 6419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Undo the hack that converts floating point types to integer for
6249 6420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** builds on processors without floating point support.
6250 6421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
6251 6422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_OMIT_FLOATING_POINT
@@ -7050,10 +7221,12 @@
7050 7221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7051 7222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*);
7052 7223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *);
7053 7224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *);
7054 7225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion);
7227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
7055 7228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef NDEBUG
7056 7229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*);
7057 7230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
7058 7231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7059 7232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_BTREECOUNT
@@ -7396,31 +7569,31 @@
7396 7569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OP_IfPos 113
7397 7570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OP_IfNeg 114
7398 7571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OP_IfZero 115
7399 7572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OP_AggStep 116
7400 7573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OP_AggFinal 117
7401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_Vacuum 118
7402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_IncrVacuum 119
7403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_Expire 120
7404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_TableLock 121
7405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_VBegin 122
7406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_VCreate 123
7407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_VDestroy 124
7408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_VOpen 125
7409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_VFilter 126
7410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_VColumn 127
7411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_VNext 128
7412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_VRename 129
7413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_VUpdate 131
7414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_Pagecount 132
7415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_Trace 133
7416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_Noop 134
7417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_Explain 135
7574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_Checkpoint 118
7575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_JournalMode 119
7576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_Vacuum 120
7577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_IncrVacuum 121
7578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_Expire 122
7579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_TableLock 123
7580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_VBegin 124
7581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_VCreate 125
7582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_VDestroy 126
7583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_VOpen 127
7584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_VFilter 128
7585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_VColumn 129
7586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_VNext 131
7587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_VRename 132
7588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_VUpdate 133
7589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_Pagecount 134
7590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_Trace 135
7591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_Noop 136
7592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OP_Explain 137
7418 7593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7419 7594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The following opcode values are never used */
7420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_NotUsed_136 136
7421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OP_NotUsed_137 137
7422 7595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OP_NotUsed_138 138
7423 7596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OP_NotUsed_139 139
7424 7597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OP_NotUsed_140 140
7425 7598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7426 7599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -7435,11 +7608,11 @@
7435 7608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OPFLG_IN3 0x0010 /* in3: P3 is an input */
7436 7609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OPFLG_OUT2 0x0020 /* out2: P2 is an output */
7437 7610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OPFLG_OUT3 0x0040 /* out3: P3 is an output */
7438 7611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OPFLG_INITIALIZER {\
7439 7612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 0 */ 0x00, 0x01, 0x05, 0x04, 0x04, 0x10, 0x00, 0x02,\
7440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 8 */ 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x24, 0x24,\
7613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 8 */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x24, 0x24,\
7441 7614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 16 */ 0x00, 0x00, 0x00, 0x24, 0x04, 0x05, 0x04, 0x00,\
7442 7615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 24 */ 0x00, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02,\
7443 7616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 32 */ 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00,\
7444 7617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 40 */ 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11,\
7445 7618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 48 */ 0x08, 0x11, 0x11, 0x11, 0x11, 0x02, 0x02, 0x00,\
@@ -7448,13 +7621,13 @@
7448 7621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 72 */ 0x02, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\
7449 7622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 80 */ 0x15, 0x01, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,\
7450 7623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x01, 0x24, 0x02, 0x02,\
7451 7624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 96 */ 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\
7452 7625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 104 */ 0x00, 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01,\
7453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 112 */ 0x08, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x01,\
7454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\
7455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 128 */ 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,\
7626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 112 */ 0x08, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02,\
7627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 120 */ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
7628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 128 */ 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x02, 0x00,\
7456 7629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,\
7457 7630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 144 */ 0x04, 0x04,}
7458 7631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7459 7632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** End of opcodes.h *********************************************/
7460 7633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Continuing where we left off in vdbe.h ***********************/
@@ -7596,18 +7769,19 @@
7596 7769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define PAGER_LOCKINGMODE_QUERY -1
7597 7770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define PAGER_LOCKINGMODE_NORMAL 0
7598 7771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define PAGER_LOCKINGMODE_EXCLUSIVE 1
7599 7772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7600 7773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
7601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Valid values for the second argument to sqlite3PagerJournalMode().
7774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Numeric constants that encode the journalmode.
7602 7775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
7603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define PAGER_JOURNALMODE_QUERY -1
7776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */
7604 7777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */
7605 7778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */
7606 7779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */
7607 7780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */
7608 7781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */
7782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */
7609 7783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7610 7784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
7611 7785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The remainder of this file contains the declarations of the functions
7612 7786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that make up the Pager sub-system API. See source code comments for
7613 7787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a detailed description of each routine.
@@ -7631,11 +7805,13 @@
7631 7805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u16*, int);
7632 7806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int);
7633 7807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int);
7634 7808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int);
7635 7809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int);
7636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3PagerJournalMode(Pager *, int);
7810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *, int);
7811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager*);
7812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager*);
7637 7813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64);
7638 7814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*);
7639 7815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7640 7816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Functions used to obtain and release page references. */
7641 7817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag);
@@ -7660,10 +7836,16 @@
7660 7836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*);
7661 7837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerRollback(Pager*);
7662 7838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n);
7663 7839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint);
7664 7840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager);
7841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
7842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager);
7843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager);
7844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager);
7845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen);
7846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager);
7665 7847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7666 7848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Functions used to query pager state and configuration. */
7667 7849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager*);
7668 7850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*);
7669 7851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*);
@@ -8077,11 +8259,15 @@
8077 8259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the incompatibility right away, even running a full regression test.
8078 8260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The default location of PENDING_BYTE is the first byte past the
8079 8261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 1GB boundary.
8080 8262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
8081 8263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
8082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define PENDING_BYTE sqlite3PendingByte
8264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_OMIT_WSD
8265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define PENDING_BYTE (0x40000000)
8266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
8267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define PENDING_BYTE sqlite3PendingByte
8268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
8083 8269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define RESERVED_BYTE (PENDING_BYTE+1)
8084 8270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SHARED_FIRST (PENDING_BYTE+2)
8085 8271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SHARED_SIZE 510
8086 8272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
8087 8273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -8103,10 +8289,15 @@
8103 8289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut);
8104 8290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*);
8105 8291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0
8106 8292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id);
8107 8293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id);
8294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3OsShmOpen(sqlite3_file *id);
8295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int);
8296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id);
8297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3OsShmClose(sqlite3_file *id, int);
8298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **);
8108 8299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
8109 8300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
8110 8301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Functions for accessing sqlite3_vfs methods
8111 8302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
8112 8303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *);
@@ -8119,11 +8310,11 @@
8119 8310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
8120 8311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *);
8121 8312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_LOAD_EXTENSION */
8122 8313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *);
8123 8314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int);
8124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3OsCurrentTime(sqlite3_vfs *, double*);
8315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*);
8125 8316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
8126 8317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
8127 8318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Convenience functions for opening and closing files using
8128 8319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3_malloc() to obtain space for the file-handle structure.
8129 8320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -8396,10 +8587,14 @@
8396 8587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xCommitCallback)(void*); /* Invoked at every commit. */
8397 8588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pRollbackArg; /* Argument to xRollbackCallback() */
8398 8589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*xRollbackCallback)(void*); /* Invoked at every commit. */
8399 8590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pUpdateArg;
8400 8591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64);
8592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
8593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xWalCallback)(void *, sqlite3 *, const char *, int);
8594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pWalArg;
8595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
8401 8596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*);
8402 8597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*);
8403 8598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pCollNeededArg;
8404 8599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value *pErr; /* Most recent error message */
8405 8600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zErrMsg; /* Most recent error message (UTF-8 encoded) */
@@ -8486,10 +8681,11 @@
8486 8681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_RecoveryMode 0x00800000 /* Ignore schema errors */
8487 8682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_ReverseOrder 0x01000000 /* Reverse unordered SELECTs */
8488 8683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_RecTriggers 0x02000000 /* Enable recursive triggers */
8489 8684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_ForeignKeys 0x04000000 /* Enforce foreign key constraints */
8490 8685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_AutoIndex 0x08000000 /* Enable automatic indexes */
8686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_PreferBuiltin 0x10000000 /* Preference to built-in funcs */
8491 8687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
8492 8688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
8493 8689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Bits of the sqlite3.flags field that are used by the
8494 8690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface.
8495 8691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** These must be the low-order bits of the flags field.
@@ -8497,11 +8693,12 @@
8497 8693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_QueryFlattener 0x01 /* Disable query flattening */
8498 8694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_ColumnCache 0x02 /* Disable the column cache */
8499 8695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IndexSort 0x04 /* Disable indexes for sorting */
8500 8696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IndexSearch 0x08 /* Disable indexes for searching */
8501 8697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IndexCover 0x10 /* Disable index covering table */
8502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_OptMask 0x1f /* Mask of all disablable opts */
8698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_GroupByOrder 0x20 /* Disable GROUPBY cover of ORDERBY */
8699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_OptMask 0xff /* Mask of all disablable opts */
8503 8700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
8504 8701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
8505 8702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Possible values for the sqlite.magic field.
8506 8703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The numbers are obtained at random and have no special meaning, other
8507 8704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** than being distinct from one another.
@@ -10103,11 +10300,12 @@
10103 10300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void);
10104 10301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
10105 10302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
10106 10303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
10107 10304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_MUTEX_OMIT
10108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void);
10305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void);
10306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void);
10109 10307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int);
10110 10308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3MutexInit(void);
10111 10309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3MutexEnd(void);
10112 10310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
10113 10311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -10235,10 +10433,11 @@
10235 10433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*);
10236 10434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*, Expr*, int);
10237 10435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*, SrcList*, Expr*, ExprList**, u16);
10238 10436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*);
10239 10437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int);
10438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int);
10240 10439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int);
10241 10440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, int, int, int);
10242 10441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse*, int, int, int);
10243 10442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprCachePush(Parse*);
10244 10443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprCachePop(Parse*, int);
@@ -10261,10 +10460,11 @@
10261 10460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*);
10262 10461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Vacuum(Parse*);
10263 10462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*);
10264 10463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, Token*);
10265 10464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3ExprCompare(Expr*, Expr*);
10465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList*, ExprList*);
10266 10466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*);
10267 10467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*);
10268 10468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse*);
10269 10469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3PrngSaveState(void);
10270 10470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3PrngRestoreState(void);
@@ -10450,15 +10650,17 @@
10450 10650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[];
10451 10651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[];
10452 10652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[];
10453 10653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config;
10454 10654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE SQLITE_WSD FuncDefHash sqlite3GlobalFunctions;
10655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WSD
10455 10656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PendingByte;
10657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
10456 10658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
10457 10659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3RootPageMoved(Db*, int, int);
10458 10660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*);
10459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE void sqlite3AlterFunctions(sqlite3*);
10661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3AlterFunctions(void);
10460 10662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3AlterRenameTable(Parse*, SrcList*, Token*);
10461 10663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *, int *);
10462 10664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...);
10463 10665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*);
10464 10666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *, Expr *, int, int);
@@ -10563,10 +10765,13 @@
10563 10765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*);
10564 10766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*);
10565 10767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);
10566 10768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*);
10567 10769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*);
10770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE const char *sqlite3JournalModename(int);
10771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3*, int);
10772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalDefaultHook(void*,sqlite3*,const char*,int);
10568 10773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
10569 10774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Declarations for functions in fkey.c. All of these are replaced by
10570 10775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign
10571 10776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** key functionality is available. If OMIT_TRIGGER is defined but
10572 10777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** OMIT_FOREIGN_KEY is not, only some of the functions are no-oped. In
@@ -10907,11 +11112,13 @@
10907 11112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** IMPORTANT: Changing the pending byte to any value other than
10908 11113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 0x40000000 results in an incompatible database file format!
10909 11114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Changing the pending byte during operating results in undefined
10910 11115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and dileterious behavior.
10911 11116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
11117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WSD
10912 11118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000;
11119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
10913 11120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
10914 11121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
10915 11122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Properties of opcodes. The OPFLG_INITIALIZER macro is
10916 11123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** created by mkopcodeh.awk during compilation. Data is obtained
10917 11124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** from the comments following the "case OP_xxxx:" statements in
@@ -11764,14 +11971,12 @@
11764 11971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
11765 11972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
11766 11973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Set the time to the current time reported by the VFS
11767 11974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
11768 11975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
11769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- double r;
11770 11976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3 *db = sqlite3_context_db_handle(context);
11771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3OsCurrentTime(db->pVfs, &r);
11772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5);
11977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsCurrentTimeInt64(db->pVfs, &p->iJD);
11773 11978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->validJD = 1;
11774 11979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
11775 11980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
11776 11981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
11777 11982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Attempt to parse the given string into a Julian Day Number. Return
@@ -12488,26 +12693,19 @@
12488 12693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value **argv
12489 12694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
12490 12695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
time_t t;
12491 12696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zFormat = (char *)sqlite3_user_data(context);
12492 12697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3 *db;
12493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- double rT;
12698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iT;
12494 12699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char zBuf[20];
12495 12700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
12496 12701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(argc);
12497 12702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(argv);
12498 12703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
12499 12704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db = sqlite3_context_db_handle(context);
12500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3OsCurrentTime(db->pVfs, &rT);
12501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifndef SQLITE_OMIT_FLOATING_POINT
12502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- t = 86400.0*(rT - 2440587.5) + 0.5;
12503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
12504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* without floating point support, rT will have
12505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** already lost fractional day precision.
12506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
12507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- t = 86400 * (rT - 2440587) - 43200;
12508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
12705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsCurrentTimeInt64(db->pVfs, &iT);
12706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t = iT/1000 - 10000*(sqlite3_int64)21086676;
12509 12707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef HAVE_GMTIME_R
12510 12708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{
12511 12709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct tm sNow;
12512 12710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
gmtime_r(&t, &sNow);
12513 12711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
strftime(zBuf, 20, zFormat, &sNow);
@@ -12656,10 +12854,31 @@
12656 12854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE);
12657 12855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
12658 12856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id){
12659 12857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return id->pMethods->xDeviceCharacteristics(id);
12660 12858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
12859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3OsShmOpen(sqlite3_file *id){
12860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return id->pMethods->xShmOpen(id);
12861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
12862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int offset, int n, int flags){
12863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return id->pMethods->xShmLock(id, offset, n, flags);
12864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
12865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id){
12866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id->pMethods->xShmBarrier(id);
12867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
12868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3OsShmClose(sqlite3_file *id, int deleteFlag){
12869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return id->pMethods->xShmClose(id, deleteFlag);
12870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
12871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3OsShmMap(
12872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *id,
12873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iPage,
12874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int pgsz,
12875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isWrite,
12876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void volatile **pp
12877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
12878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return id->pMethods->xShmMap(id, iPage, pgsz, isWrite, pp);
12879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
12661 12880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
12662 12881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
12663 12882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The next group of routines are convenience wrappers around the
12664 12883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** VFS methods.
12665 12884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -12719,12 +12938,20 @@
12719 12938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return pVfs->xRandomness(pVfs, nByte, zBufOut);
12720 12939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
12721 12940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){
12722 12941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return pVfs->xSleep(pVfs, nMicro);
12723 12942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
12724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3OsCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
12725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return pVfs->xCurrentTime(pVfs, pTimeOut);
12943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){
12944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
12945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
12946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pVfs->xCurrentTimeInt64(pVfs, pTimeOut);
12947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
12948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double r;
12949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pVfs->xCurrentTime(pVfs, &r);
12950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pTimeOut = (sqlite3_int64)(r*86400000.0);
12951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
12952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
12726 12953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
12727 12954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
12728 12955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsOpenMalloc(
12729 12956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vfs *pVfs,
12730 12957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFile,
@@ -14974,27 +15201,30 @@
14974 15201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
14975 15202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Initialize the mutex system.
14976 15203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
14977 15204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3MutexInit(void){
14978 15205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
14979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3GlobalConfig.bCoreMutex ){
14980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){
14981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If the xMutexAlloc method has not been set, then the user did not
14982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** install a mutex implementation via sqlite3_config() prior to
14983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sqlite3_initialize() being called. This block copies pointers to
14984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the default implementation into the sqlite3GlobalConfig structure.
14985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
14986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_mutex_methods *pFrom = sqlite3DefaultMutex();
14987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex;
14988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
14989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(pTo, pFrom, offsetof(sqlite3_mutex_methods, xMutexAlloc));
14990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(&pTo->xMutexFree, &pFrom->xMutexFree,
14991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sizeof(*pTo) - offsetof(sqlite3_mutex_methods, xMutexFree));
14992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTo->xMutexAlloc = pFrom->xMutexAlloc;
14993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
14994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3GlobalConfig.mutex.xMutexInit();
14995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
15206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){
15207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the xMutexAlloc method has not been set, then the user did not
15208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** install a mutex implementation via sqlite3_config() prior to
15209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3_initialize() being called. This block copies pointers to
15210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the default implementation into the sqlite3GlobalConfig structure.
15211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
15212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_methods const *pFrom;
15213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex;
15214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
15215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3GlobalConfig.bCoreMutex ){
15216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFrom = sqlite3DefaultMutex();
15217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
15218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFrom = sqlite3NoopMutex();
15219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
15220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(pTo, pFrom, offsetof(sqlite3_mutex_methods, xMutexAlloc));
15221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&pTo->xMutexFree, &pFrom->xMutexFree,
15222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sizeof(*pTo) - offsetof(sqlite3_mutex_methods, xMutexFree));
15223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTo->xMutexAlloc = pFrom->xMutexAlloc;
15224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
15225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3GlobalConfig.mutex.xMutexInit();
14996 15226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
14997 15227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
14998 15228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
GLOBAL(int, mutexIsInit) = 1;
14999 15229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
15000 15230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -15122,68 +15352,69 @@
15122 15352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If compiled with SQLITE_DEBUG, then additional logic is inserted
15123 15353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that does error checking on mutexes to make sure they are being
15124 15354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** called correctly.
15125 15355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15126 15356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_MUTEX_OMIT
15127 15358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if defined(SQLITE_MUTEX_NOOP) && !defined(SQLITE_DEBUG)
15359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_DEBUG
15129 15360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15130 15361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Stub routines for all mutex methods.
15131 15362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
15132 15363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routines provide no mutual exclusion or error checking.
15133 15364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int noopMutexHeld(sqlite3_mutex *p){ return 1; }
15135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int noopMutexNotheld(sqlite3_mutex *p){ return 1; }
15136 15365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int noopMutexInit(void){ return SQLITE_OK; }
15137 15366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int noopMutexEnd(void){ return SQLITE_OK; }
15138 15367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static sqlite3_mutex *noopMutexAlloc(int id){ return (sqlite3_mutex*)8; }
15139 15368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void noopMutexFree(sqlite3_mutex *p){ return; }
15140 15369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void noopMutexEnter(sqlite3_mutex *p){ return; }
15141 15370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int noopMutexTry(sqlite3_mutex *p){ return SQLITE_OK; }
15142 15371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void noopMutexLeave(sqlite3_mutex *p){ return; }
15143 15372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){
15145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static sqlite3_mutex_methods sMutex = {
15373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){
15374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const sqlite3_mutex_methods sMutex = {
15146 15375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
noopMutexInit,
15147 15376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
noopMutexEnd,
15148 15377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
noopMutexAlloc,
15149 15378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
noopMutexFree,
15150 15379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
noopMutexEnter,
15151 15380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
noopMutexTry,
15152 15381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
noopMutexLeave,
15153 15382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- noopMutexHeld,
15155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- noopMutexNotheld
15383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0,
15384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0,
15156 15385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
15157 15386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15158 15387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return &sMutex;
15159 15388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* defined(SQLITE_MUTEX_NOOP) && !defined(SQLITE_DEBUG) */
15389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* !SQLITE_DEBUG */
15161 15390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if defined(SQLITE_MUTEX_NOOP) && defined(SQLITE_DEBUG)
15391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
15163 15392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15164 15393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** In this implementation, error checking is provided for testing
15165 15394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and debugging purposes. The mutexes still do not provide any
15166 15395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** mutual exclusion.
15167 15396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15168 15397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15169 15398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15170 15399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The mutex object
15171 15400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct sqlite3_mutex {
15401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct sqlite3_debug_mutex {
15173 15402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int id; /* The mutex type */
15174 15403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int cnt; /* Number of entries without a matching leave */
15175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
15404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } sqlite3_debug_mutex;
15176 15405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15177 15406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15178 15407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
15179 15408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** intended for use inside assert() statements.
15180 15409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int debugMutexHeld(sqlite3_mutex *p){
15410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int debugMutexHeld(sqlite3_mutex *pX){
15411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
15182 15412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return p==0 || p->cnt>0;
15183 15413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int debugMutexNotheld(sqlite3_mutex *p){
15414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int debugMutexNotheld(sqlite3_mutex *pX){
15415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
15185 15416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return p==0 || p->cnt==0;
15186 15417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15187 15418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15188 15419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15189 15420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Initialize and deinitialize the mutex subsystem.
@@ -15195,12 +15426,12 @@
15195 15426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The sqlite3_mutex_alloc() routine allocates a new
15196 15427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** mutex and returns a pointer to it. If it returns NULL
15197 15428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that means that a mutex could not be allocated.
15198 15429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15199 15430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static sqlite3_mutex *debugMutexAlloc(int id){
15200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static sqlite3_mutex aStatic[6];
15201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_mutex *pNew = 0;
15431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static sqlite3_debug_mutex aStatic[6];
15432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_debug_mutex *pNew = 0;
15202 15433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
switch( id ){
15203 15434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_MUTEX_FAST:
15204 15435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_MUTEX_RECURSIVE: {
15205 15436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew = sqlite3Malloc(sizeof(*pNew));
15206 15437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pNew ){
@@ -15215,17 +15446,18 @@
15215 15446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew = &aStatic[id-2];
15216 15447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->id = id;
15217 15448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
15218 15449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15219 15450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return pNew;
15451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (sqlite3_mutex*)pNew;
15221 15452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15222 15453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15223 15454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15224 15455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine deallocates a previously allocated mutex.
15225 15456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void debugMutexFree(sqlite3_mutex *p){
15457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void debugMutexFree(sqlite3_mutex *pX){
15458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
15227 15459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->cnt==0 );
15228 15460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
15229 15461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(p);
15230 15462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15231 15463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -15238,16 +15470,18 @@
15238 15470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be entered multiple times by the same thread. In such cases the,
15239 15471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** mutex must be exited an equal number of times before another thread
15240 15472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** can enter. If the same thread tries to enter any other kind of mutex
15241 15473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** more than once, the behavior is undefined.
15242 15474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void debugMutexEnter(sqlite3_mutex *p){
15244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(p) );
15475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void debugMutexEnter(sqlite3_mutex *pX){
15476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
15477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) );
15245 15478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->cnt++;
15246 15479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int debugMutexTry(sqlite3_mutex *p){
15248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(p) );
15480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int debugMutexTry(sqlite3_mutex *pX){
15481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
15482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) );
15249 15483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->cnt++;
15250 15484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
15251 15485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15252 15486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15253 15487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -15254,18 +15488,19 @@
15254 15488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The sqlite3_mutex_leave() routine exits a mutex that was
15255 15489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** previously entered by the same thread. The behavior
15256 15490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is undefined if the mutex is not currently entered or
15257 15491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is not currently allocated. SQLite will never do either.
15258 15492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void debugMutexLeave(sqlite3_mutex *p){
15260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( debugMutexHeld(p) );
15493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void debugMutexLeave(sqlite3_mutex *pX){
15494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
15495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( debugMutexHeld(pX) );
15261 15496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->cnt--;
15262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(p) );
15497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) );
15263 15498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15264 15499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){
15266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static sqlite3_mutex_methods sMutex = {
15500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){
15501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const sqlite3_mutex_methods sMutex = {
15267 15502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
debugMutexInit,
15268 15503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
debugMutexEnd,
15269 15504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
debugMutexAlloc,
15270 15505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
debugMutexFree,
15271 15506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
debugMutexEnter,
@@ -15276,11 +15511,22 @@
15276 15511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
debugMutexNotheld
15277 15512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
15278 15513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15279 15514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return &sMutex;
15280 15515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* defined(SQLITE_MUTEX_NOOP) && defined(SQLITE_DEBUG) */
15516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_DEBUG */
15517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
15518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
15519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If compiled with SQLITE_MUTEX_NOOP, then the no-op mutex implementation
15520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is used regardless of the run-time threadsafety setting.
15521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
15522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_MUTEX_NOOP
15523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){
15524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return sqliteNoopMutex();
15525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
15526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_MUTEX_NOOP */
15527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_MUTEX_OMIT */
15282 15528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15283 15529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** End of mutex_noop.c ******************************************/
15284 15530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Begin file mutex_os2.c ***************************************/
15285 15531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15286 15532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 2007 August 28
@@ -15532,12 +15778,12 @@
15532 15778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nRef--;
15533 15779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE );
15534 15780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DosReleaseMutexSem(p->mutex);
15535 15781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15536 15782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){
15538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static sqlite3_mutex_methods sMutex = {
15783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){
15784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const sqlite3_mutex_methods sMutex = {
15539 15785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2MutexInit,
15540 15786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2MutexEnd,
15541 15787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2MutexAlloc,
15542 15788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2MutexFree,
15543 15789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2MutexEnter,
@@ -15578,27 +15824,37 @@
15578 15824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15579 15825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_MUTEX_PTHREADS
15580 15826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15581 15827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <pthread.h>
15582 15828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
15830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The sqlite3_mutex.id, sqlite3_mutex.nRef, and sqlite3_mutex.owner fields
15831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are necessary under two condidtions: (1) Debug builds and (2) using
15832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** home-grown mutexes. Encapsulate these conditions into a single #define.
15833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
15834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(SQLITE_DEBUG) || defined(SQLITE_HOMEGROWN_RECURSIVE_MUTEX)
15835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_MUTEX_NREF 1
15836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
15837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_MUTEX_NREF 0
15838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
15583 15839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15584 15840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15585 15841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Each recursive mutex is an instance of the following structure.
15586 15842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15587 15843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct sqlite3_mutex {
15588 15844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthread_mutex_t mutex; /* Mutex controlling the lock */
15845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_MUTEX_NREF
15589 15846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int id; /* Mutex type */
15590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nRef; /* Number of entrances */
15591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pthread_t owner; /* Thread that is within this mutex */
15592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_DEBUG
15847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile int nRef; /* Number of entrances */
15848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile pthread_t owner; /* Thread that is within this mutex */
15593 15849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int trace; /* True to trace changes */
15594 15850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
15595 15851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
15596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_DEBUG
15852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_MUTEX_NREF
15597 15853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0, (pthread_t)0, 0 }
15598 15854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
15599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0, (pthread_t)0 }
15855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER }
15600 15856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
15601 15857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15602 15858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15603 15859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
15604 15860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** intended for use only inside assert() statements. On some platforms,
@@ -15696,27 +15952,33 @@
15696 15952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthread_mutexattr_init(&recursiveAttr);
15697 15953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthread_mutexattr_settype(&recursiveAttr, PTHREAD_MUTEX_RECURSIVE);
15698 15954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthread_mutex_init(&p->mutex, &recursiveAttr);
15699 15955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthread_mutexattr_destroy(&recursiveAttr);
15700 15956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
15957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_MUTEX_NREF
15701 15958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->id = iType;
15959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
15702 15960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15703 15961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
15704 15962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15705 15963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_MUTEX_FAST: {
15706 15964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p = sqlite3MallocZero( sizeof(*p) );
15707 15965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p ){
15966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_MUTEX_NREF
15708 15967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->id = iType;
15968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
15709 15969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthread_mutex_init(&p->mutex, 0);
15710 15970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15711 15971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
15712 15972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15713 15973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
default: {
15714 15974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( iType-2 >= 0 );
15715 15975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( iType-2 < ArraySize(staticMutexes) );
15716 15976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p = &staticMutexes[iType-2];
15977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_MUTEX_NREF
15717 15978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->id = iType;
15979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
15718 15980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
15719 15981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15720 15982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15721 15983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return p;
15722 15984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -15772,12 +16034,14 @@
15772 16034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15773 16035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
15774 16036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Use the built-in recursive mutexes if they are available.
15775 16037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15776 16038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthread_mutex_lock(&p->mutex);
16039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_MUTEX_NREF
15777 16040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->owner = pthread_self();
15778 16041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nRef++;
16042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
15779 16043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
15780 16044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15781 16045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
15782 16046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->trace ){
15783 16047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
@@ -15815,12 +16079,14 @@
15815 16079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15816 16080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
15817 16081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Use the built-in recursive mutexes if they are available.
15818 16082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15819 16083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pthread_mutex_trylock(&p->mutex)==0 ){
16084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_MUTEX_NREF
15820 16085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->owner = pthread_self();
15821 16086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nRef++;
16087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
15822 16088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_OK;
15823 16089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
15824 16090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
15825 16091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15826 16092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
@@ -15839,11 +16105,13 @@
15839 16105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is undefined if the mutex is not currently entered or
15840 16106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is not currently allocated. SQLite will never do either.
15841 16107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15842 16108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void pthreadMutexLeave(sqlite3_mutex *p){
15843 16109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pthreadMutexHeld(p) );
16110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_MUTEX_NREF
15844 16111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nRef--;
16112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
15845 16113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE );
15846 16114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15847 16115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
15848 16116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->nRef==0 ){
15849 16117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthread_mutex_unlock(&p->mutex);
@@ -15857,12 +16125,12 @@
15857 16125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
printf("leave mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
15858 16126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15859 16127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
15860 16128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15861 16129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){
15863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static sqlite3_mutex_methods sMutex = {
16130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){
16131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const sqlite3_mutex_methods sMutex = {
15864 16132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthreadMutexInit,
15865 16133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthreadMutexEnd,
15866 16134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthreadMutexAlloc,
15867 16135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthreadMutexFree,
15868 16136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pthreadMutexEnter,
@@ -15908,21 +16176,21 @@
15908 16176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Each recursive mutex is an instance of the following structure.
15909 16177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15910 16178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct sqlite3_mutex {
15911 16179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CRITICAL_SECTION mutex; /* Mutex controlling the lock */
15912 16180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int id; /* Mutex type */
15913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nRef; /* Number of enterances */
15914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DWORD owner; /* Thread holding this mutex */
15915 16181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
16182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile int nRef; /* Number of enterances */
16183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile DWORD owner; /* Thread holding this mutex */
15916 16184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int trace; /* True to trace changes */
15917 16185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
15918 16186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
15919 16187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_W32_MUTEX_INITIALIZER { 0 }
15920 16188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
15921 16189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0, 0L, (DWORD)0, 0 }
15922 16190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
15923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0, 0L, (DWORD)0 }
16191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0 }
15924 16192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
15925 16193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15926 16194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15927 16195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return true (non-zero) if we are running under WinNT, Win2K, WinXP,
15928 16196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** or WinCE. Return false (zero) for Win95, Win98, or WinME.
@@ -16074,21 +16342,25 @@
16074 16342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
switch( iType ){
16075 16343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_MUTEX_FAST:
16076 16344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_MUTEX_RECURSIVE: {
16077 16345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p = sqlite3MallocZero( sizeof(*p) );
16078 16346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p ){
16347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
16079 16348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->id = iType;
16349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
16080 16350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
InitializeCriticalSection(&p->mutex);
16081 16351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
16082 16352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
16083 16353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
16084 16354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
default: {
16085 16355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( winMutex_isInit==1 );
16086 16356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( iType-2 >= 0 );
16087 16357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( iType-2 < ArraySize(winMutex_staticMutexes) );
16088 16358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p = &winMutex_staticMutexes[iType-2];
16359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
16089 16360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->id = iType;
16361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
16090 16362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
16091 16363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
16092 16364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
16093 16365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return p;
16094 16366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -16117,16 +16389,18 @@
16117 16389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** mutex must be exited an equal number of times before another thread
16118 16390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** can enter. If the same thread tries to enter any other kind of mutex
16119 16391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** more than once, the behavior is undefined.
16120 16392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
16121 16393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void winMutexEnter(sqlite3_mutex *p){
16394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
16122 16395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD tid = GetCurrentThreadId();
16123 16396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld2(p, tid) );
16397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
16124 16398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
EnterCriticalSection(&p->mutex);
16399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
16125 16400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->owner = tid;
16126 16401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nRef++;
16127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_DEBUG
16128 16402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->trace ){
16129 16403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
16130 16404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
16131 16405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
16132 16406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -16171,25 +16445,25 @@
16171 16445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is not currently allocated. SQLite will never do either.
16172 16446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
16173 16447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void winMutexLeave(sqlite3_mutex *p){
16174 16448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef NDEBUG
16175 16449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD tid = GetCurrentThreadId();
16176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
16177 16450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->nRef>0 );
16178 16451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->owner==tid );
16179 16452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nRef--;
16180 16453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE );
16454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
16181 16455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LeaveCriticalSection(&p->mutex);
16182 16456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
16183 16457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->trace ){
16184 16458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
printf("leave mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
16185 16459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
16186 16460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
16187 16461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
16188 16462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
16189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){
16190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static sqlite3_mutex_methods sMutex = {
16463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){
16464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const sqlite3_mutex_methods sMutex = {
16191 16465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winMutexInit,
16192 16466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winMutexEnd,
16193 16467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winMutexAlloc,
16194 16468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winMutexFree,
16195 16469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winMutexEnter,
@@ -20557,30 +20831,30 @@
20557 20831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 113 */ "IfPos",
20558 20832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 114 */ "IfNeg",
20559 20833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 115 */ "IfZero",
20560 20834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 116 */ "AggStep",
20561 20835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 117 */ "AggFinal",
20562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 118 */ "Vacuum",
20563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 119 */ "IncrVacuum",
20564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 120 */ "Expire",
20565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 121 */ "TableLock",
20566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 122 */ "VBegin",
20567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 123 */ "VCreate",
20568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 124 */ "VDestroy",
20569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 125 */ "VOpen",
20570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 126 */ "VFilter",
20571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 127 */ "VColumn",
20572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 128 */ "VNext",
20573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 129 */ "VRename",
20836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 118 */ "Checkpoint",
20837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 119 */ "JournalMode",
20838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 120 */ "Vacuum",
20839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 121 */ "IncrVacuum",
20840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 122 */ "Expire",
20841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 123 */ "TableLock",
20842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 124 */ "VBegin",
20843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 125 */ "VCreate",
20844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 126 */ "VDestroy",
20845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 127 */ "VOpen",
20846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 128 */ "VFilter",
20847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 129 */ "VColumn",
20574 20848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 130 */ "Real",
20575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 131 */ "VUpdate",
20576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 132 */ "Pagecount",
20577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 133 */ "Trace",
20578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 134 */ "Noop",
20579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 135 */ "Explain",
20580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 136 */ "NotUsed_136",
20581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 137 */ "NotUsed_137",
20849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 131 */ "VNext",
20850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 132 */ "VRename",
20851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 133 */ "VUpdate",
20852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 134 */ "Pagecount",
20853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 135 */ "Trace",
20854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 136 */ "Noop",
20855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 137 */ "Explain",
20582 20856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 138 */ "NotUsed_138",
20583 20857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 139 */ "NotUsed_139",
20584 20858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 140 */ "NotUsed_140",
20585 20859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 141 */ "ToText",
20586 20860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 142 */ "ToBlob",
@@ -20681,27 +20955,13 @@
20681 20955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
20682 20956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
20683 20957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
20684 20958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
20685 20959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OSTrace = 0;
20686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE1(X) if( sqlite3OSTrace ) sqlite3DebugPrintf(X)
20687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE2(X,Y) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y)
20688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE3(X,Y,Z) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z)
20689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE4(X,Y,Z,A) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z,A)
20690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE5(X,Y,Z,A,B) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z,A,B)
20691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE6(X,Y,Z,A,B,C) \
20692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(sqlite3OSTrace) sqlite3DebugPrintf(X,Y,Z,A,B,C)
20693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE7(X,Y,Z,A,B,C,D) \
20694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(sqlite3OSTrace) sqlite3DebugPrintf(X,Y,Z,A,B,C,D)
20960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
20695 20961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
20696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE1(X)
20697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE2(X,Y)
20698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE3(X,Y,Z)
20699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE4(X,Y,Z,A)
20700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE5(X,Y,Z,A,B)
20701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE6(X,Y,Z,A,B,C)
20702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE7(X,Y,Z,A,B,C,D)
20962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OSTRACE(X)
20703 20963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
20704 20964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
20705 20965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
20706 20966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Macros for performance tracing. Normally turned off. Only works
20707 20967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** on i486 hardware.
@@ -20893,11 +21153,11 @@
20893 21153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
20894 21154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int os2Close( sqlite3_file *id ){
20895 21155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
APIRET rc = NO_ERROR;
20896 21156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2File *pFile;
20897 21157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( id && (pFile = (os2File*)id) != 0 ){
20898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2( "CLOSE %d\n", pFile->h );
21158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "CLOSE %d\n", pFile->h ));
20899 21159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = DosClose( pFile->h );
20900 21160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->locktype = NO_LOCK;
20901 21161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->pathToDel != NULL ){
20902 21162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = DosForceDelete( (PSZ)pFile->pathToDel );
20903 21163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free( pFile->pathToDel );
@@ -20924,11 +21184,11 @@
20924 21184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ULONG fileLocation = 0L;
20925 21185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ULONG got;
20926 21186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2File *pFile = (os2File*)id;
20927 21187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
20928 21188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( return SQLITE_IOERR_READ );
20929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "READ %d lock=%d\n", pFile->h, pFile->locktype );
21189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "READ %d lock=%d\n", pFile->h, pFile->locktype ));
20930 21190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( DosSetFilePtr(pFile->h, offset, FILE_BEGIN, &fileLocation) != NO_ERROR ){
20931 21191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_IOERR;
20932 21192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
20933 21193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( DosRead( pFile->h, pBuf, amt, &got ) != NO_ERROR ){
20934 21194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_IOERR_READ;
@@ -20957,11 +21217,11 @@
20957 21217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ULONG wrote;
20958 21218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2File *pFile = (os2File*)id;
20959 21219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
20960 21220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( return SQLITE_IOERR_WRITE );
20961 21221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateDiskfullError( return SQLITE_FULL );
20962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "WRITE %d lock=%d\n", pFile->h, pFile->locktype );
21222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "WRITE %d lock=%d\n", pFile->h, pFile->locktype ));
20963 21223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( DosSetFilePtr(pFile->h, offset, FILE_BEGIN, &fileLocation) != NO_ERROR ){
20964 21224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_IOERR;
20965 21225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
20966 21226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( amt>0 );
20967 21227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( amt > 0 &&
@@ -20979,11 +21239,11 @@
20979 21239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Truncate an open file to a specified size
20980 21240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
20981 21241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int os2Truncate( sqlite3_file *id, i64 nByte ){
20982 21242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
APIRET rc = NO_ERROR;
20983 21243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2File *pFile = (os2File*)id;
20984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "TRUNCATE %d %lld\n", pFile->h, nByte );
21244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "TRUNCATE %d %lld\n", pFile->h, nByte ));
20985 21245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( return SQLITE_IOERR_TRUNCATE );
20986 21246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = DosSetFileSize( pFile->h, nByte );
20987 21247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR_TRUNCATE;
20988 21248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
20989 21249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -20999,11 +21259,11 @@
20999 21259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
21000 21260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Make sure all writes to a particular file are committed to disk.
21001 21261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
21002 21262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int os2Sync( sqlite3_file *id, int flags ){
21003 21263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2File *pFile = (os2File*)id;
21004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "SYNC %d lock=%d\n", pFile->h, pFile->locktype );
21264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "SYNC %d lock=%d\n", pFile->h, pFile->locktype ));
21005 21265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_TEST
21006 21266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags & SQLITE_SYNC_FULL){
21007 21267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_fullsync_count++;
21008 21268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21009 21269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_sync_count++;
@@ -21049,11 +21309,11 @@
21049 21309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lOffset = SHARED_FIRST;
21050 21310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lRange = SHARED_SIZE;
21051 21311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lOffset = 0L;
21052 21312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lRange = 0L;
21053 21313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 1L );
21054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "GETREADLOCK %d res=%d\n", pFile->h, res );
21314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "GETREADLOCK %d res=%d\n", pFile->h, res ));
21055 21315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return res;
21056 21316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21057 21317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21058 21318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
21059 21319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Undo a readlock
@@ -21067,11 +21327,11 @@
21067 21327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lOffset = 0L;
21068 21328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lRange = 0L;
21069 21329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lOffset = SHARED_FIRST;
21070 21330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lRange = SHARED_SIZE;
21071 21331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = DosSetFileLocks( id->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 1L );
21072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "UNLOCK-READLOCK file handle=%d res=%d?\n", id->h, res );
21332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "UNLOCK-READLOCK file handle=%d res=%d?\n", id->h, res ));
21073 21333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return res;
21074 21334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21075 21335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21076 21336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
21077 21337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Lock the file with the lock specified by parameter locktype - one
@@ -21108,18 +21368,18 @@
21108 21368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea;
21109 21369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2File *pFile = (os2File*)id;
21110 21370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&LockArea, 0, sizeof(LockArea));
21111 21371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&UnlockArea, 0, sizeof(UnlockArea));
21112 21372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile!=0 );
21113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4( "LOCK %d %d was %d\n", pFile->h, locktype, pFile->locktype );
21373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "LOCK %d %d was %d\n", pFile->h, locktype, pFile->locktype ));
21114 21374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21115 21375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there is already a lock of this type or more restrictive on the
21116 21376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** os2File, do nothing. Don't use the end_lock: exit path, as
21117 21377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3_mutex_enter() hasn't been called yet.
21118 21378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
21119 21379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->locktype>=locktype ){
21120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "LOCK %d %d ok (already held)\n", pFile->h, locktype );
21380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "LOCK %d %d ok (already held)\n", pFile->h, locktype ));
21121 21381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
21122 21382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21123 21383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21124 21384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Make sure the locking sequence is correct
21125 21385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -21142,11 +21402,11 @@
21142 21402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21143 21403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* wait longer than LOCK_TIMEOUT here not to have to try multiple times */
21144 21404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 100L, 0L );
21145 21405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( res == NO_ERROR ){
21146 21406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
gotPendingLock = 1;
21147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "LOCK %d pending lock boolean set. res=%d\n", pFile->h, res );
21407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "LOCK %d pending lock boolean set. res=%d\n", pFile->h, res ));
21148 21408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21149 21409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21150 21410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21151 21411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Acquire a shared lock
21152 21412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -21154,11 +21414,11 @@
21154 21414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile->locktype==NO_LOCK );
21155 21415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = getReadLock(pFile);
21156 21416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( res == NO_ERROR ){
21157 21417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
newLocktype = SHARED_LOCK;
21158 21418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "LOCK %d acquire shared lock. res=%d\n", pFile->h, res );
21419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "LOCK %d acquire shared lock. res=%d\n", pFile->h, res ));
21160 21420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21161 21421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21162 21422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Acquire a RESERVED lock
21163 21423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
21164 21424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( locktype==RESERVED_LOCK && res == NO_ERROR ){
@@ -21169,39 +21429,40 @@
21169 21429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lRange = 0L;
21170 21430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );
21171 21431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( res == NO_ERROR ){
21172 21432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
newLocktype = RESERVED_LOCK;
21173 21433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "LOCK %d acquire reserved lock. res=%d\n", pFile->h, res );
21434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "LOCK %d acquire reserved lock. res=%d\n", pFile->h, res ));
21175 21435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21176 21436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21177 21437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Acquire a PENDING lock
21178 21438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
21179 21439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( locktype==EXCLUSIVE_LOCK && res == NO_ERROR ){
21180 21440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
newLocktype = PENDING_LOCK;
21181 21441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
gotPendingLock = 0;
21182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2( "LOCK %d acquire pending lock. pending lock boolean unset.\n", pFile->h );
21442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "LOCK %d acquire pending lock. pending lock boolean unset.\n",
21443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->h ));
21183 21444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21184 21445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21185 21446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Acquire an EXCLUSIVE lock
21186 21447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
21187 21448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( locktype==EXCLUSIVE_LOCK && res == NO_ERROR ){
21188 21449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile->locktype>=SHARED_LOCK );
21189 21450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = unlockReadLock(pFile);
21190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2( "unreadlock = %d\n", res );
21451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "unreadlock = %d\n", res ));
21191 21452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lOffset = SHARED_FIRST;
21192 21453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lRange = SHARED_SIZE;
21193 21454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lOffset = 0L;
21194 21455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lRange = 0L;
21195 21456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );
21196 21457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( res == NO_ERROR ){
21197 21458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
newLocktype = EXCLUSIVE_LOCK;
21198 21459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
21199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2( "OS/2 error-code = %d\n", res );
21460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OS/2 error-code = %d\n", res ));
21200 21461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
getReadLock(pFile);
21201 21462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "LOCK %d acquire exclusive lock. res=%d\n", pFile->h, res );
21463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "LOCK %d acquire exclusive lock. res=%d\n", pFile->h, res ));
21203 21464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21204 21465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21205 21466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If we are holding a PENDING lock that ought to be released, then
21206 21467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** release it now.
21207 21468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -21210,25 +21471,25 @@
21210 21471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lOffset = 0L;
21211 21472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lRange = 0L;
21212 21473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lOffset = PENDING_BYTE;
21213 21474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lRange = 1L;
21214 21475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
r = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );
21215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "LOCK %d unlocking pending/is shared. r=%d\n", pFile->h, r );
21476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "LOCK %d unlocking pending/is shared. r=%d\n", pFile->h, r ));
21216 21477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21217 21478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21218 21479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Update the state of the lock has held in the file descriptor then
21219 21480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** return the appropriate result code.
21220 21481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
21221 21482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( res == NO_ERROR ){
21222 21483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_OK;
21223 21484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
21224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4( "LOCK FAILED %d trying for %d but got %d\n", pFile->h,
21225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- locktype, newLocktype );
21485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "LOCK FAILED %d trying for %d but got %d\n", pFile->h,
21486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ locktype, newLocktype ));
21226 21487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
21227 21488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21228 21489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->locktype = newLocktype;
21229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "LOCK %d now %d\n", pFile->h, pFile->locktype );
21490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "LOCK %d now %d\n", pFile->h, pFile->locktype ));
21230 21491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
21231 21492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21232 21493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21233 21494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
21234 21495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine checks if there is a RESERVED lock held on the specified
@@ -21239,11 +21500,11 @@
21239 21500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int r = 0;
21240 21501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2File *pFile = (os2File*)id;
21241 21502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile!=0 );
21242 21503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->locktype>=RESERVED_LOCK ){
21243 21504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
r = 1;
21244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "TEST WR-LOCK %d %d (local)\n", pFile->h, r );
21505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "TEST WR-LOCK %d %d (local)\n", pFile->h, r ));
21245 21506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
21246 21507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FILELOCK LockArea,
21247 21508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea;
21248 21509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
APIRET rc = NO_ERROR;
21249 21510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&LockArea, 0, sizeof(LockArea));
@@ -21251,22 +21512,22 @@
21251 21512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lOffset = RESERVED_BYTE;
21252 21513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lRange = 1L;
21253 21514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lOffset = 0L;
21254 21515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lRange = 0L;
21255 21516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );
21256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "TEST WR-LOCK %d lock reserved byte rc=%d\n", pFile->h, rc );
21517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "TEST WR-LOCK %d lock reserved byte rc=%d\n", pFile->h, rc ));
21257 21518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc == NO_ERROR ){
21258 21519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
APIRET rcu = NO_ERROR; /* return code for unlocking */
21259 21520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lOffset = 0L;
21260 21521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lRange = 0L;
21261 21522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lOffset = RESERVED_BYTE;
21262 21523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lRange = 1L;
21263 21524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rcu = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );
21264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "TEST WR-LOCK %d unlock reserved byte r=%d\n", pFile->h, rcu );
21525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "TEST WR-LOCK %d unlock reserved byte r=%d\n", pFile->h, rcu ));
21265 21526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21266 21527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
r = !(rc == NO_ERROR);
21267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "TEST WR-LOCK %d %d (remote)\n", pFile->h, r );
21528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "TEST WR-LOCK %d %d (remote)\n", pFile->h, r ));
21268 21529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21269 21530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pOut = r;
21270 21531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
21271 21532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21272 21533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -21290,48 +21551,49 @@
21290 21551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea;
21291 21552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&LockArea, 0, sizeof(LockArea));
21292 21553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&UnlockArea, 0, sizeof(UnlockArea));
21293 21554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile!=0 );
21294 21555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( locktype<=SHARED_LOCK );
21295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4( "UNLOCK %d to %d was %d\n", pFile->h, locktype, pFile->locktype );
21556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "UNLOCK %d to %d was %d\n", pFile->h, locktype, pFile->locktype ));
21296 21557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
type = pFile->locktype;
21297 21558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( type>=EXCLUSIVE_LOCK ){
21298 21559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lOffset = 0L;
21299 21560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lRange = 0L;
21300 21561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lOffset = SHARED_FIRST;
21301 21562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lRange = SHARED_SIZE;
21302 21563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );
21303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "UNLOCK %d exclusive lock res=%d\n", pFile->h, res );
21564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "UNLOCK %d exclusive lock res=%d\n", pFile->h, res ));
21304 21565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( locktype==SHARED_LOCK && getReadLock(pFile) != NO_ERROR ){
21305 21566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* This should never happen. We should always be able to
21306 21567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** reacquire the read lock */
21307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "UNLOCK %d to %d getReadLock() failed\n", pFile->h, locktype );
21568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "UNLOCK %d to %d getReadLock() failed\n", pFile->h, locktype ));
21308 21569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_IOERR_UNLOCK;
21309 21570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21310 21571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21311 21572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( type>=RESERVED_LOCK ){
21312 21573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lOffset = 0L;
21313 21574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lRange = 0L;
21314 21575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lOffset = RESERVED_BYTE;
21315 21576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lRange = 1L;
21316 21577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );
21317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "UNLOCK %d reserved res=%d\n", pFile->h, res );
21578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "UNLOCK %d reserved res=%d\n", pFile->h, res ));
21318 21579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21319 21580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( locktype==NO_LOCK && type>=SHARED_LOCK ){
21320 21581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = unlockReadLock(pFile);
21321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE5( "UNLOCK %d is %d want %d res=%d\n", pFile->h, type, locktype, res );
21582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "UNLOCK %d is %d want %d res=%d\n",
21583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->h, type, locktype, res ));
21322 21584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21323 21585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( type>=PENDING_LOCK ){
21324 21586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lOffset = 0L;
21325 21587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LockArea.lRange = 0L;
21326 21588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lOffset = PENDING_BYTE;
21327 21589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockArea.lRange = 1L;
21328 21590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );
21329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "UNLOCK %d pending res=%d\n", pFile->h, res );
21591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "UNLOCK %d pending res=%d\n", pFile->h, res ));
21330 21592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21331 21593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->locktype = locktype;
21332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "UNLOCK %d now %d\n", pFile->h, pFile->locktype );
21594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "UNLOCK %d now %d\n", pFile->h, pFile->locktype ));
21333 21595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
21334 21596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21335 21597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21336 21598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
21337 21599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Control and query of the open file handle.
@@ -21338,11 +21600,12 @@
21338 21600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
21339 21601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int os2FileControl(sqlite3_file *id, int op, void *pArg){
21340 21602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
switch( op ){
21341 21603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_FCNTL_LOCKSTATE: {
21342 21604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*(int*)pArg = ((os2File*)id)->locktype;
21343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "FCNTL_LOCKSTATE %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype );
21605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "FCNTL_LOCKSTATE %d lock=%d\n",
21606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ((os2File*)id)->h, ((os2File*)id)->locktype ));
21344 21607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
21345 21608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21346 21609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21347 21610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_ERROR;
21348 21611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -21525,11 +21788,11 @@
21525 21788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_randomness( 20, &zBuf[j] );
21526 21789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for( i = 0; i < 20; i++, j++ ){
21527 21790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
21528 21791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21529 21792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBuf[j] = 0;
21530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2( "TEMP FILENAME: %s\n", zBuf );
21793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "TEMP FILENAME: %s\n", zBuf ));
21531 21794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
21532 21795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21533 21796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21534 21797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21535 21798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -21588,47 +21851,47 @@
21588 21851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21589 21852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21590 21853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21591 21854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset( pFile, 0, sizeof(*pFile) );
21592 21855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2( "OPEN want %d\n", flags );
21856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE( "OPEN want %d\n", flags ));
21594 21857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21595 21858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags & SQLITE_OPEN_READWRITE ){
21596 21859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulOpenMode |= OPEN_ACCESS_READWRITE;
21597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE1( "OPEN read/write\n" );
21860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN read/write\n" ));
21598 21861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
21599 21862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulOpenMode |= OPEN_ACCESS_READONLY;
21600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE1( "OPEN read only\n" );
21863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN read only\n" ));
21601 21864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21602 21865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21603 21866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags & SQLITE_OPEN_CREATE ){
21604 21867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulOpenFlags |= OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
21605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE1( "OPEN open new/create\n" );
21868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN open new/create\n" ));
21606 21869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
21607 21870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulOpenFlags |= OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW;
21608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE1( "OPEN open existing\n" );
21871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN open existing\n" ));
21609 21872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21610 21873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21611 21874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags & SQLITE_OPEN_MAIN_DB ){
21612 21875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulOpenMode |= OPEN_SHARE_DENYNONE;
21613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE1( "OPEN share read/write\n" );
21876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN share read/write\n" ));
21614 21877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
21615 21878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulOpenMode |= OPEN_SHARE_DENYWRITE;
21616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE1( "OPEN share read only\n" );
21879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN share read only\n" ));
21617 21880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21618 21881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21619 21882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags & SQLITE_OPEN_DELETEONCLOSE ){
21620 21883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char pathUtf8[CCHMAXPATH];
21621 21884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef NDEBUG /* when debugging we want to make sure it is deleted */
21622 21885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulFileAttribute = FILE_HIDDEN;
21623 21886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
21624 21887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2FullPathname( pVfs, zName, CCHMAXPATH, pathUtf8 );
21625 21888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->pathToDel = convertUtf8PathToCp( pathUtf8 );
21626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE1( "OPEN hidden/delete on close file attributes\n" );
21889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN hidden/delete on close file attributes\n" ));
21627 21890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
21628 21891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->pathToDel = NULL;
21629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE1( "OPEN normal file attribute\n" );
21892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN normal file attribute\n" ));
21630 21893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21631 21894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21632 21895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* always open in random access mode for possibly better speed */
21633 21896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulOpenMode |= OPEN_FLAGS_RANDOM;
21634 21897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulOpenMode |= OPEN_FLAGS_FAIL_ON_ERROR;
@@ -21643,17 +21906,18 @@
21643 21906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulOpenFlags,
21644 21907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ulOpenMode,
21645 21908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(PEAOP2)NULL );
21646 21909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free( zNameCp );
21647 21910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc != NO_ERROR ){
21648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE7( "OPEN Invalid handle rc=%d: zName=%s, ulAction=%#lx, ulAttr=%#lx, ulFlags=%#lx, ulMode=%#lx\n",
21649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc, zName, ulAction, ulFileAttribute, ulOpenFlags, ulOpenMode );
21911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN Invalid handle rc=%d: zName=%s, ulAction=%#lx, ulAttr=%#lx, ulFlags=%#lx, ulMode=%#lx\n",
21912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc, zName, ulAction, ulFileAttribute, ulOpenFlags, ulOpenMode ));
21650 21913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->pathToDel )
21651 21914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free( pFile->pathToDel );
21652 21915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->pathToDel = NULL;
21653 21916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags & SQLITE_OPEN_READWRITE ){
21654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2( "OPEN %d Invalid handle\n", ((flags | SQLITE_OPEN_READONLY) & ~SQLITE_OPEN_READWRITE) );
21917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN %d Invalid handle\n",
21918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ((flags | SQLITE_OPEN_READONLY) & ~SQLITE_OPEN_READWRITE) ));
21655 21919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return os2Open( pVfs, zName, id,
21656 21920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
((flags | SQLITE_OPEN_READONLY) & ~SQLITE_OPEN_READWRITE),
21657 21921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOutFlags );
21658 21922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
21659 21923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_CANTOPEN;
@@ -21665,11 +21929,11 @@
21665 21929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21666 21930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21667 21931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->pMethod = &os2IoMethod;
21668 21932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->h = h;
21669 21933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
OpenCounter(+1);
21670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "OPEN %d pOutFlags=%d\n", pFile->h, pOutFlags );
21934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "OPEN %d pOutFlags=%d\n", pFile->h, pOutFlags ));
21671 21935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
21672 21936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21673 21937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21674 21938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
21675 21939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Delete the named file.
@@ -21682,11 +21946,11 @@
21682 21946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
APIRET rc = NO_ERROR;
21683 21947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zFilenameCp = convertUtf8PathToCp( zFilename );
21684 21948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( return SQLITE_IOERR_DELETE );
21685 21949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = DosDelete( (PSZ)zFilenameCp );
21686 21950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free( zFilenameCp );
21687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2( "DELETE \"%s\"\n", zFilename );
21951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "DELETE \"%s\"\n", zFilename ));
21688 21952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR_DELETE;
21689 21953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21690 21954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21691 21955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
21692 21956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Check the existance and status of a file.
@@ -21703,21 +21967,21 @@
21703 21967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21704 21968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset( &fsts3ConfigInfo, 0, sizeof(fsts3ConfigInfo) );
21705 21969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = DosQueryPathInfo( (PSZ)zFilenameCp, FIL_STANDARD,
21706 21970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&fsts3ConfigInfo, sizeof(FILESTATUS3) );
21707 21971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free( zFilenameCp );
21708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4( "ACCESS fsts3ConfigInfo.attrFile=%d flags=%d rc=%d\n",
21709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fsts3ConfigInfo.attrFile, flags, rc );
21972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "ACCESS fsts3ConfigInfo.attrFile=%d flags=%d rc=%d\n",
21973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fsts3ConfigInfo.attrFile, flags, rc ));
21710 21974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
switch( flags ){
21711 21975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_ACCESS_READ:
21712 21976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_ACCESS_EXISTS:
21713 21977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = (rc == NO_ERROR);
21714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "ACCESS %s access of read and exists rc=%d\n", zFilename, rc );
21978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "ACCESS %s access of read and exists rc=%d\n", zFilename, rc));
21715 21979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
21716 21980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_ACCESS_READWRITE:
21717 21981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = (rc == NO_ERROR) && ( (fsts3ConfigInfo.attrFile & FILE_READONLY) == 0 );
21718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3( "ACCESS %s access of read/write rc=%d\n", zFilename, rc );
21982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(( "ACCESS %s access of read/write rc=%d\n", zFilename, rc ));
21719 21983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
21720 21984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
default:
21721 21985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !"Invalid flags argument" );
21722 21986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21723 21987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pOut = rc;
@@ -21923,11 +22187,11 @@
21923 22187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2DlSym, /* xDlSym */
21924 22188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2DlClose, /* xDlClose */
21925 22189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2Randomness, /* xRandomness */
21926 22190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2Sleep, /* xSleep */
21927 22191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
os2CurrentTime, /* xCurrentTime */
21928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- os2GetLastError /* xGetLastError */
22192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ os2GetLastError, /* xGetLastError */
21929 22193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
21930 22194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vfs_register(&os2Vfs, 1);
21931 22195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
initUconvObjects();
21932 22196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
21933 22197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -22057,10 +22321,11 @@
22057 22321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <sys/stat.h>
22058 22322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <fcntl.h>
22059 22323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <unistd.h>
22060 22324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <sys/time.h>
22061 22325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <errno.h>
22326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #include <sys/mman.h>
22062 22327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22063 22328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_ENABLE_LOCKING_STYLE
22064 22329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# include <sys/ioctl.h>
22065 22330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# if OS_VXWORKS
22066 22331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# include <semaphore.h>
@@ -22111,18 +22376,22 @@
22111 22376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Only set the lastErrno if the error code is a real error and not
22112 22377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a normal expected return code of SQLITE_BUSY or SQLITE_OK
22113 22378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
22114 22379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define IS_LOCK_ERROR(x) ((x != SQLITE_OK) && (x != SQLITE_BUSY))
22115 22380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Forward references */
22382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct unixShm unixShm; /* Connection shared memory */
22383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct unixShmNode unixShmNode; /* Shared memory instance */
22384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct unixInodeInfo unixInodeInfo; /* An i-node */
22385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct UnixUnusedFd UnixUnusedFd; /* An unused file descriptor */
22116 22386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22117 22387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
22118 22388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Sometimes, after a file handle is closed by SQLite, the file descriptor
22119 22389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** cannot be closed immediately. In these cases, instances of the following
22120 22390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** structure are used to store the file descriptor while waiting for an
22121 22391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** opportunity to either close or reuse it.
22122 22392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
22123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- typedef struct UnixUnusedFd UnixUnusedFd;
22124 22393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct UnixUnusedFd {
22125 22394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fd; /* File descriptor to close */
22126 22395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int flags; /* Flags this file descriptor was opened with */
22127 22396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnixUnusedFd *pNext; /* Next unused file descriptor on same file */
22128 22397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
@@ -22132,31 +22401,29 @@
22132 22401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** VFS implementations.
22133 22402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
22134 22403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct unixFile unixFile;
22135 22404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct unixFile {
22136 22405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_io_methods const *pMethod; /* Always the first entry */
22137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixOpenCnt *pOpen; /* Info about all open fd's on this inode */
22138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockInfo *pLock; /* Info about locks on this inode */
22139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int h; /* The file descriptor */
22140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int dirfd; /* File descriptor for the directory */
22141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned char locktype; /* The type of lock held on this fd */
22142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int lastErrno; /* The unix errno from the last I/O error */
22143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void *lockingContext; /* Locking style specific state */
22144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UnixUnusedFd *pUnused; /* Pre-allocated UnixUnusedFd */
22145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int fileFlags; /* Miscellanous flags */
22406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode; /* Info about locks on this inode */
22407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int h; /* The file descriptor */
22408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int dirfd; /* File descriptor for the directory */
22409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned char eFileLock; /* The type of lock held on this fd */
22410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int lastErrno; /* The unix errno from last I/O error */
22411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *lockingContext; /* Locking style specific state */
22412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UnixUnusedFd *pUnused; /* Pre-allocated UnixUnusedFd */
22413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fileFlags; /* Miscellanous flags */
22414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zPath; /* Name of the file */
22415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShm *pShm; /* Shared memory segment information */
22146 22416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_ENABLE_LOCKING_STYLE
22147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int openFlags; /* The flags specified at open() */
22417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int openFlags; /* The flags specified at open() */
22148 22418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
22149 22419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__)
22150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned fsFlags; /* cached details from statfs() */
22151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
22152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if SQLITE_THREADSAFE && defined(__linux__)
22153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pthread_t tid; /* The thread that "owns" this unixFile */
22420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned fsFlags; /* cached details from statfs() */
22154 22421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
22155 22422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if OS_VXWORKS
22156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isDelete; /* Delete on close if true */
22157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct vxworksFileId *pId; /* Unique file ID */
22423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isDelete; /* Delete on close if true */
22424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct vxworksFileId *pId; /* Unique file ID */
22158 22425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
22159 22426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef NDEBUG
22160 22427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The next group of variables are used to track whether or not the
22161 22428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** transaction counter in bytes 24-27 of database files are updated
22162 22429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** whenever any part of the database changes. An assertion fault will
@@ -22217,27 +22484,13 @@
22217 22484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
22218 22485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
22219 22486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22220 22487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
22221 22488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OSTrace = 0;
22222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE1(X) if( sqlite3OSTrace ) sqlite3DebugPrintf(X)
22223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE2(X,Y) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y)
22224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE3(X,Y,Z) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z)
22225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE4(X,Y,Z,A) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z,A)
22226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE5(X,Y,Z,A,B) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z,A,B)
22227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE6(X,Y,Z,A,B,C) \
22228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(sqlite3OSTrace) sqlite3DebugPrintf(X,Y,Z,A,B,C)
22229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE7(X,Y,Z,A,B,C,D) \
22230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(sqlite3OSTrace) sqlite3DebugPrintf(X,Y,Z,A,B,C,D)
22489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
22231 22490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
22232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE1(X)
22233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE2(X,Y)
22234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE3(X,Y,Z)
22235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE4(X,Y,Z,A)
22236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE5(X,Y,Z,A,B)
22237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE6(X,Y,Z,A,B,C)
22238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE7(X,Y,Z,A,B,C,D)
22491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OSTRACE(X)
22239 22492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
22240 22493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22241 22494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
22242 22495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Macros for performance tracing. Normally turned off. Only works
22243 22496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** on i486 hardware.
@@ -22443,11 +22696,11 @@
22443 22696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
22444 22697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22445 22698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22446 22699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
22447 22700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Helper functions to obtain and relinquish the global mutex. The
22448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** global mutex is used to protect the unixOpenCnt, unixLockInfo and
22701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** global mutex is used to protect the unixInodeInfo and
22449 22702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** vxworksFileId objects used by this file, all of which may be
22450 22703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** shared by multiple threads.
22451 22704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
22452 22705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Function unixMutexHeld() is used to assert() that the global mutex
22453 22706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is held when required. This function is only used as part of assert()
@@ -22474,12 +22727,12 @@
22474 22727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
22475 22728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Helper function for printing out trace information from debugging
22476 22729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** binaries. This returns the string represetation of the supplied
22477 22730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** integer lock-type.
22478 22731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
22479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const char *locktypeName(int locktype){
22480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- switch( locktype ){
22732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *azFileLock(int eFileLock){
22733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( eFileLock ){
22481 22734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case NO_LOCK: return "NONE";
22482 22735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SHARED_LOCK: return "SHARED";
22483 22736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case RESERVED_LOCK: return "RESERVED";
22484 22737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case PENDING_LOCK: return "PENDING";
22485 22738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case EXCLUSIVE_LOCK: return "EXCLUSIVE";
@@ -22812,17 +23065,16 @@
22812 23065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
22813 23066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** But wait: there are yet more problems with POSIX advisory locks.
22814 23067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
22815 23068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If you close a file descriptor that points to a file that has locks,
22816 23069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** all locks on that file that are owned by the current process are
22817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** released. To work around this problem, each unixFile structure contains
22818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** a pointer to an unixOpenCnt structure. There is one unixOpenCnt structure
22819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** per open inode, which means that multiple unixFile can point to a single
22820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** unixOpenCnt. When an attempt is made to close an unixFile, if there are
23070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** released. To work around this problem, each unixInodeInfo object
23071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** maintains a count of the number of pending locks on tha inode.
23072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When an attempt is made to close an unixFile, if there are
22821 23073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** other unixFile open on the same inode that are holding locks, the call
22822 23074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to close() the file descriptor is deferred until all of the locks clear.
22823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The unixOpenCnt structure keeps a list of file descriptors that need to
23075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The unixInodeInfo structure keeps a list of file descriptors that need to
22824 23076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be closed and that list is walked (and cleared) when the last lock
22825 23077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** clears.
22826 23078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
22827 23079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Yet another problem: LinuxThreads do not play well with posix locks.
22828 23080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -22833,50 +23085,23 @@
22833 23085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** if the appliation uses the newer Native Posix Thread Library (NPTL)
22834 23086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** on linux - with NPTL a lock created by thread A can override locks
22835 23087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in thread B. But there is no way to know at compile-time which
22836 23088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** threading library is being used. So there is no way to know at
22837 23089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** compile-time whether or not thread A can override locks on thread B.
22838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** We have to do a run-time check to discover the behavior of the
23090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** One has to do a run-time check to discover the behavior of the
22839 23091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** current process.
22840 23092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
22841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** On systems where thread A is unable to modify locks created by
22842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** thread B, we have to keep track of which thread created each
22843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** lock. Hence there is an extra field in the key to the unixLockInfo
22844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** structure to record this information. And on those systems it
22845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is illegal to begin a transaction in one thread and finish it
22846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in another. For this latter restriction, there is no work-around.
22847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** It is a limitation of LinuxThreads.
22848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
22849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
22850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
22851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Set or check the unixFile.tid field. This field is set when an unixFile
22852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is first opened. All subsequent uses of the unixFile verify that the
22853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** same thread is operating on the unixFile. Some operating systems do
22854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** not allow locks to be overridden by other threads and that restriction
22855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** means that sqlite3* database handles cannot be moved from one thread
22856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to another while locks are held.
22857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
22858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Version 3.3.1 (2006-01-15): unixFile can be moved from one thread to
22859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** another as long as we are running on a system that supports threads
22860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** overriding each others locks (which is now the most common behavior)
22861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** or if no locks are held. But the unixFile.pLock field needs to be
22862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** recomputed because its key includes the thread-id. See the
22863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** transferOwnership() function below for additional information
22864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
22865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if SQLITE_THREADSAFE && defined(__linux__)
22866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define SET_THREADID(X) (X)->tid = pthread_self()
22867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define CHECK_THREADID(X) (threadsOverrideEachOthersLocks==0 && \
22868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- !pthread_equal((X)->tid, pthread_self()))
22869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
22870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define SET_THREADID(X)
22871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define CHECK_THREADID(X) 0
22872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
23093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLite used to support LinuxThreads. But support for LinuxThreads
23094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** was dropped beginning with version 3.7.0. SQLite will still work with
23095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** LinuxThreads provided that (1) there is no more than one connection
23096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** per database file in the same process and (2) database connections
23097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** do not move across threads.
23098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
22873 23099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22874 23100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
22875 23101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** An instance of the following structure serves as the key used
22876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to locate a particular unixOpenCnt structure given its inode. This
22877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is the same as the unixLockKey except that the thread ID is omitted.
23102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to locate a particular unixInodeInfo object.
22878 23103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
22879 23104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct unixFileId {
22880 23105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dev_t dev; /* Device number */
22881 23106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if OS_VXWORKS
22882 23107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct vxworksFileId *pId; /* Unique file ID for vxworks. */
@@ -22883,260 +23108,122 @@
22883 23108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
22884 23109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ino_t ino; /* Inode number */
22885 23110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
22886 23111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
22887 23112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
22889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** An instance of the following structure serves as the key used
22890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to locate a particular unixLockInfo structure given its inode.
22891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
22892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If threads cannot override each others locks (LinuxThreads), then we
22893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** set the unixLockKey.tid field to the thread ID. If threads can override
22894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** each others locks (Posix and NPTL) then tid is always set to zero.
22895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** tid is omitted if we compile without threading support or on an OS
22896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** other than linux.
22897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
22898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockKey {
22899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixFileId fid; /* Unique identifier for the file */
22900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if SQLITE_THREADSAFE && defined(__linux__)
22901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pthread_t tid; /* Thread ID of lock owner. Zero if not using LinuxThreads */
22902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
22903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
22904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
22905 23113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
22906 23114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** An instance of the following structure is allocated for each open
22907 23115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** inode. Or, on LinuxThreads, there is one of these structures for
22908 23116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** each inode opened by each thread.
22909 23117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
22910 23118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A single inode can have multiple file descriptors, so each unixFile
22911 23119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** structure contains a pointer to an instance of this object and this
22912 23120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** object keeps a count of the number of unixFile pointing to it.
22913 23121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
22914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockInfo {
22915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockKey lockKey; /* The lookup key */
22916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int cnt; /* Number of SHARED locks held */
22917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int locktype; /* One of SHARED_LOCK, RESERVED_LOCK etc. */
22918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nRef; /* Number of pointers to this structure */
22919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if defined(SQLITE_ENABLE_LOCKING_STYLE)
22920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned long long sharedByte; /* for AFP simulated shared lock */
22921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
22922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockInfo *pNext; /* List of all unixLockInfo objects */
22923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockInfo *pPrev; /* .... doubly linked */
22924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
22925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
22926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
22927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** An instance of the following structure is allocated for each open
22928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** inode. This structure keeps track of the number of locks on that
22929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** inode. If a close is attempted against an inode that is holding
22930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** locks, the close is deferred until all locks clear by adding the
22931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** file descriptor to be closed to the pending list.
22932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
22933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** TODO: Consider changing this so that there is only a single file
22934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** descriptor for each open file, even when it is opened multiple times.
22935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The close() system call would only occur when the last database
22936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** using the file closes.
22937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
22938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixOpenCnt {
22939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixFileId fileId; /* The lookup key */
22940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nRef; /* Number of pointers to this structure */
22941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nLock; /* Number of outstanding locks */
22942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UnixUnusedFd *pUnused; /* Unused file descriptors to close */
22943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if OS_VXWORKS
22944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sem_t *pSem; /* Named POSIX semaphore */
22945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char aSemName[MAX_PATHNAME+2]; /* Name of that semaphore */
22946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
22947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixOpenCnt *pNext, *pPrev; /* List of all unixOpenCnt objects */
22948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
22949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
22950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
22951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lists of all unixLockInfo and unixOpenCnt objects. These used to be hash
22952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** tables. But the number of objects is rarely more than a dozen and
22953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** never exceeds a few thousand. And lookup is not on a critical
22954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** path so a simple linked list will suffice.
22955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
22956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static struct unixLockInfo *lockList = 0;
22957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static struct unixOpenCnt *openList = 0;
22958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
22959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
22960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This variable remembers whether or not threads can override each others
22961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** locks.
22962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
22963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** 0: No. Threads cannot override each others locks. (LinuxThreads)
22964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** 1: Yes. Threads can override each others locks. (Posix & NLPT)
22965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** -1: We don't know yet.
22966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
22967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** On some systems, we know at compile-time if threads can override each
22968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** others locks. On those systems, the SQLITE_THREAD_OVERRIDE_LOCK macro
22969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** will be set appropriately. On other systems, we have to check at
22970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** runtime. On these latter systems, SQLTIE_THREAD_OVERRIDE_LOCK is
22971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** undefined.
22972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
22973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This variable normally has file scope only. But during testing, we make
22974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** it a global so that the test code can change its value in order to verify
22975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** that the right stuff happens in either case.
22976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
22977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if SQLITE_THREADSAFE && defined(__linux__)
22978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # ifndef SQLITE_THREAD_OVERRIDE_LOCK
22979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define SQLITE_THREAD_OVERRIDE_LOCK -1
22980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # endif
22981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # ifdef SQLITE_TEST
22982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK;
22983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # else
22984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK;
22985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # endif
22986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
22987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
22988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
22989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This structure holds information passed into individual test
22990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** threads by the testThreadLockingBehavior() routine.
22991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
22992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct threadTestData {
22993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int fd; /* File to be locked */
22994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct flock lock; /* The locking operation */
22995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int result; /* Result of the locking operation */
22996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
22997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
22998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if SQLITE_THREADSAFE && defined(__linux__)
22999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
23000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This function is used as the main routine for a thread launched by
23001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** testThreadLockingBehavior(). It tests whether the shared-lock obtained
23002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** by the main thread in testThreadLockingBehavior() conflicts with a
23003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** hypothetical write-lock obtained by this thread on the same file.
23004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
23005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The write-lock is not actually acquired, as this is not possible if
23006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the file is open in read-only mode (see ticket #3472).
23007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
23008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void *threadLockingTest(void *pArg){
23009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct threadTestData *pData = (struct threadTestData*)pArg;
23010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pData->result = fcntl(pData->fd, F_GETLK, &pData->lock);
23011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return pArg;
23012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* SQLITE_THREADSAFE && defined(__linux__) */
23014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if SQLITE_THREADSAFE && defined(__linux__)
23017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
23018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This procedure attempts to determine whether or not threads
23019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** can override each others locks then sets the
23020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** threadsOverrideEachOthersLocks variable appropriately.
23021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
23022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void testThreadLockingBehavior(int fd_orig){
23023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int fd;
23024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc;
23025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct threadTestData d;
23026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct flock l;
23027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pthread_t t;
23028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fd = dup(fd_orig);
23030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fd<0 ) return;
23031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(&l, 0, sizeof(l));
23032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- l.l_type = F_RDLCK;
23033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- l.l_len = 1;
23034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- l.l_start = 0;
23035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- l.l_whence = SEEK_SET;
23036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fcntl(fd_orig, F_SETLK, &l);
23037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=0 ) return;
23038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(&d, 0, sizeof(d));
23039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- d.fd = fd;
23040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- d.lock = l;
23041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- d.lock.l_type = F_WRLCK;
23042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pthread_create(&t, 0, threadLockingTest, &d)==0 ){
23043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pthread_join(t, 0);
23044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- close(fd);
23046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( d.result!=0 ) return;
23047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- threadsOverrideEachOthersLocks = (d.lock.l_type==F_UNLCK);
23048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* SQLITE_THREADSAFE && defined(__linux__) */
23050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
23052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Release a unixLockInfo structure previously allocated by findLockInfo().
23053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
23054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The mutex entered using the unixEnterMutex() function must be held
23055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** when this function is called.
23056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
23057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void releaseLockInfo(struct unixLockInfo *pLock){
23058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( unixMutexHeld() );
23059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLock ){
23060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->nRef--;
23061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLock->nRef==0 ){
23062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLock->pPrev ){
23063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->pPrev->pNext==pLock );
23064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->pPrev->pNext = pLock->pNext;
23065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
23066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( lockList==pLock );
23067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lockList = pLock->pNext;
23068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLock->pNext ){
23070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->pNext->pPrev==pLock );
23071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->pNext->pPrev = pLock->pPrev;
23072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pLock);
23074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
23079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Release a unixOpenCnt structure previously allocated by findLockInfo().
23080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
23081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The mutex entered using the unixEnterMutex() function must be held
23082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** when this function is called.
23083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
23084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void releaseOpenCnt(struct unixOpenCnt *pOpen){
23085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( unixMutexHeld() );
23086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pOpen ){
23087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->nRef--;
23088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pOpen->nRef==0 ){
23089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pOpen->pPrev ){
23090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pOpen->pPrev->pNext==pOpen );
23091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->pPrev->pNext = pOpen->pNext;
23092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
23093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( openList==pOpen );
23094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- openList = pOpen->pNext;
23095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pOpen->pNext ){
23097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pOpen->pNext->pPrev==pOpen );
23098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->pNext->pPrev = pOpen->pPrev;
23099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if SQLITE_THREADSAFE && defined(__linux__)
23101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( !pOpen->pUnused || threadsOverrideEachOthersLocks==0 );
23102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
23103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If pOpen->pUnused is not null, then memory and file-descriptors
23105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** are leaked.
23106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
23107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This will only happen if, under Linuxthreads, the user has opened
23108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** a transaction in one thread, then attempts to close the database
23109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** handle from another thread (without first unlocking the db file).
23110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This is a misuse. */
23111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pOpen);
23112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
23117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Given a file descriptor, locate unixLockInfo and unixOpenCnt structures that
23118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** describes that file descriptor. Create new ones if necessary. The
23119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** return values might be uninitialized if an error occurs.
23122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct unixInodeInfo {
23123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct unixFileId fileId; /* The lookup key */
23124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nShared; /* Number of SHARED locks held */
23125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int eFileLock; /* One of SHARED_LOCK, RESERVED_LOCK etc. */
23126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRef; /* Number of pointers to this structure */
23127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmNode *pShmNode; /* Shared memory associated with this inode */
23128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nLock; /* Number of outstanding file locks */
23129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UnixUnusedFd *pUnused; /* Unused file descriptors to close */
23130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pNext; /* List of all unixInodeInfo objects */
23131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pPrev; /* .... doubly linked */
23132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(SQLITE_ENABLE_LOCKING_STYLE)
23133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned long long sharedByte; /* for AFP simulated shared lock */
23134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
23135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if OS_VXWORKS
23136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sem_t *pSem; /* Named POSIX semaphore */
23137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char aSemName[MAX_PATHNAME+2]; /* Name of that semaphore */
23138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
23139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
23140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
23141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
23142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A lists of all unixInodeInfo objects.
23143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
23144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static unixInodeInfo *inodeList = 0;
23145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
23146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
23147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Close all file descriptors accumuated in the unixInodeInfo->pUnused list.
23148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If all such file descriptors are closed without error, the list is
23149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** cleared and SQLITE_OK returned.
23150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
23151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, if an error occurs, then successfully closed file descriptor
23152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** entries are removed from the list, and SQLITE_IOERR_CLOSE returned.
23153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** not deleted and SQLITE_IOERR_CLOSE returned.
23154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
23155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int closePendingFds(unixFile *pFile){
23156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
23157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode = pFile->pInode;
23158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UnixUnusedFd *pError = 0;
23159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UnixUnusedFd *p;
23160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UnixUnusedFd *pNext;
23161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=pInode->pUnused; p; p=pNext){
23162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNext = p->pNext;
23163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( close(p->fd) ){
23164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->lastErrno = errno;
23165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_IOERR_CLOSE;
23166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pNext = pError;
23167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pError = p;
23168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
23169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p);
23170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->pUnused = pError;
23173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
23174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
23176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
23177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Release a unixInodeInfo structure previously allocated by findInodeInfo().
23178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
23179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The mutex entered using the unixEnterMutex() function must be held
23180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** when this function is called.
23181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
23182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void releaseInodeInfo(unixFile *pFile){
23183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode = pFile->pInode;
23184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( unixMutexHeld() );
23185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode ){
23186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nRef--;
23187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode->nRef==0 ){
23188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->pShmNode==0 );
23189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closePendingFds(pFile);
23190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode->pPrev ){
23191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->pPrev->pNext==pInode );
23192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->pPrev->pNext = pInode->pNext;
23193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
23194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( inodeList==pInode );
23195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inodeList = pInode->pNext;
23196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode->pNext ){
23198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->pNext->pPrev==pInode );
23199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->pNext->pPrev = pInode->pPrev;
23200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pInode);
23202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
23206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
23207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Given a file descriptor, locate the unixInodeInfo object that
23208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** describes that file descriptor. Create a new one if necessary. The
23209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** return value might be uninitialized if an error occurs.
23120 23210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
23121 23211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The mutex entered using the unixEnterMutex() function must be held
23122 23212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** when this function is called.
23123 23213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
23124 23214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return an appropriate error code.
23125 23215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int findLockInfo(
23216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int findInodeInfo(
23127 23217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile, /* Unix file with file desc used in the key */
23128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockInfo **ppLock, /* Return the unixLockInfo structure here */
23129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixOpenCnt **ppOpen /* Return the unixOpenCnt structure here */
23218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo **ppInode /* Return the unixInodeInfo object here */
23130 23219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
23131 23220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc; /* System call return code */
23132 23221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fd; /* The file descriptor for pFile */
23133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockKey lockKey; /* Lookup key for the unixLockInfo structure */
23134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixFileId fileId; /* Lookup key for the unixOpenCnt struct */
23222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct unixFileId fileId; /* Lookup key for the unixInodeInfo */
23135 23223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct stat statbuf; /* Low-level file information */
23136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockInfo *pLock = 0;/* Candidate unixLockInfo object */
23137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixOpenCnt *pOpen; /* Candidate unixOpenCnt object */
23224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode = 0; /* Candidate unixInodeInfo object */
23138 23225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23139 23226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( unixMutexHeld() );
23140 23227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23141 23228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Get low-level information about the file that we can used to
23142 23229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** create a unique name for the file.
@@ -23174,126 +23261,39 @@
23174 23261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_IOERR;
23175 23262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23176 23263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23177 23264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
23178 23265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(&lockKey, 0, sizeof(lockKey));
23180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lockKey.fid.dev = statbuf.st_dev;
23266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&fileId, 0, sizeof(fileId));
23267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fileId.dev = statbuf.st_dev;
23181 23268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if OS_VXWORKS
23182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lockKey.fid.pId = pFile->pId;
23183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
23184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lockKey.fid.ino = statbuf.st_ino;
23185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
23186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if SQLITE_THREADSAFE && defined(__linux__)
23187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( threadsOverrideEachOthersLocks<0 ){
23188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- testThreadLockingBehavior(fd);
23189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lockKey.tid = threadsOverrideEachOthersLocks ? 0 : pthread_self();
23191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
23192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fileId = lockKey.fid;
23193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ppLock!=0 ){
23194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock = lockList;
23195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( pLock && memcmp(&lockKey, &pLock->lockKey, sizeof(lockKey)) ){
23196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock = pLock->pNext;
23197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLock==0 ){
23199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock = sqlite3_malloc( sizeof(*pLock) );
23200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLock==0 ){
23201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_NOMEM;
23202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto exit_findlockinfo;
23203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(&pLock->lockKey,&lockKey,sizeof(lockKey));
23205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->nRef = 1;
23206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->cnt = 0;
23207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->locktype = 0;
23208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if defined(SQLITE_ENABLE_LOCKING_STYLE)
23209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->sharedByte = 0;
23210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
23211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->pNext = lockList;
23212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->pPrev = 0;
23213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( lockList ) lockList->pPrev = pLock;
23214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lockList = pLock;
23215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
23216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->nRef++;
23217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *ppLock = pLock;
23219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ppOpen!=0 ){
23221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen = openList;
23222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( pOpen && memcmp(&fileId, &pOpen->fileId, sizeof(fileId)) ){
23223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen = pOpen->pNext;
23224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pOpen==0 ){
23226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen = sqlite3_malloc( sizeof(*pOpen) );
23227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pOpen==0 ){
23228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- releaseLockInfo(pLock);
23229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_NOMEM;
23230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto exit_findlockinfo;
23231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(pOpen, 0, sizeof(*pOpen));
23233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->fileId = fileId;
23234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->nRef = 1;
23235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->pNext = openList;
23236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( openList ) openList->pPrev = pOpen;
23237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- openList = pOpen;
23238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
23239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->nRef++;
23240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *ppOpen = pOpen;
23242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- exit_findlockinfo:
23245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
23246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
23249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If we are currently in a different thread than the thread that the
23250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** unixFile argument belongs to, then transfer ownership of the unixFile
23251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** over to the current thread.
23252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
23253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** A unixFile is only owned by a thread on systems that use LinuxThreads.
23254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
23255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Ownership transfer is only allowed if the unixFile is currently unlocked.
23256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If the unixFile is locked and an ownership is wrong, then return
23257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** SQLITE_MISUSE. SQLITE_OK is returned if everything works.
23258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
23259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if SQLITE_THREADSAFE && defined(__linux__)
23260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int transferOwnership(unixFile *pFile){
23261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc;
23262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pthread_t hSelf;
23263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( threadsOverrideEachOthersLocks ){
23264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Ownership transfers not needed on this system */
23265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
23266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- hSelf = pthread_self();
23268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pthread_equal(pFile->tid, hSelf) ){
23269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* We are still in the same thread */
23270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE1("No-transfer, same thread\n");
23271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
23272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype!=NO_LOCK ){
23274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* We cannot change ownership while we are holding a lock! */
23275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_MISUSE_BKPT;
23276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("Transfer ownership of %d from %d to %d\n",
23278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->h, pFile->tid, hSelf);
23279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->tid = hSelf;
23280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (pFile->pLock != NULL) {
23281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- releaseLockInfo(pFile->pLock);
23282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = findLockInfo(pFile, &pFile->pLock, 0);
23283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE5("LOCK %d is now %s(%s,%d)\n", pFile->h,
23284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- locktypeName(pFile->locktype),
23285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- locktypeName(pFile->pLock->locktype), pFile->pLock->cnt);
23286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
23287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } else {
23288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
23289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else /* if not SQLITE_THREADSAFE */
23292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* On single-threaded builds, ownership transfer is a no-op */
23293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define transferOwnership(X) SQLITE_OK
23294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* SQLITE_THREADSAFE */
23269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fileId.pId = pFile->pId;
23270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
23271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fileId.ino = statbuf.st_ino;
23272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
23273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode = inodeList;
23274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){
23275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode = pInode->pNext;
23276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode==0 ){
23278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode = sqlite3_malloc( sizeof(*pInode) );
23279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode==0 ){
23280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
23281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pInode, 0, sizeof(*pInode));
23283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&pInode->fileId, &fileId, sizeof(fileId));
23284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nRef = 1;
23285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->pNext = inodeList;
23286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->pPrev = 0;
23287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( inodeList ) inodeList->pPrev = pInode;
23288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inodeList = pInode;
23289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
23290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nRef++;
23291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppInode = pInode;
23293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
23294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
23295 23295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23296 23296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23297 23297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
23298 23298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine checks if there is a RESERVED lock held on the specified
23299 23299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file by this or any other process. If such a lock is held, set *pResOut
@@ -23306,14 +23306,14 @@
23306 23306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
23307 23307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23308 23308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
23309 23309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23310 23310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
23311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unixEnterMutex(); /* Because pFile->pLock is shared across threads */
23311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixEnterMutex(); /* Because pFile->pInode is shared across threads */
23312 23312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23313 23313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check if a thread in this process holds such a lock */
23314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->pLock->locktype>SHARED_LOCK ){
23314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->pInode->eFileLock>SHARED_LOCK ){
23315 23315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reserved = 1;
23316 23316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23317 23317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23318 23318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Otherwise see if some other process holds it.
23319 23319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -23333,18 +23333,18 @@
23333 23333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23334 23334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23335 23335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
23336 23336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23337 23337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
23338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("TEST WR-LOCK %d %d %d (unix)\n", pFile->h, rc, reserved);
23338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TEST WR-LOCK %d %d %d (unix)\n", pFile->h, rc, reserved));
23339 23339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23340 23340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pResOut = reserved;
23341 23341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
23342 23342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23343 23343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23344 23344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
23345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lock the file with the lock specified by parameter locktype - one
23345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lock the file with the lock specified by parameter eFileLock - one
23346 23346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of the following:
23347 23347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
23348 23348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) SHARED_LOCK
23349 23349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) RESERVED_LOCK
23350 23350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (3) PENDING_LOCK
@@ -23363,11 +23363,11 @@
23363 23363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PENDING -> EXCLUSIVE
23364 23364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
23365 23365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine will only increase a lock. Use the sqlite3OsUnlock()
23366 23366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** routine to lower a locking level.
23367 23367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int unixLock(sqlite3_file *id, int locktype){
23368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int unixLock(sqlite3_file *id, int eFileLock){
23369 23369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The following describes the implementation of the various locks and
23370 23370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** lock transitions in terms of the POSIX advisory shared and exclusive
23371 23371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** lock primitives (called read-locks and write-locks below, to avoid
23372 23372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** confusion with SQLite lock names). The algorithms are complicated
23373 23373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** slightly in order to be compatible with windows systems simultaneously
@@ -23404,74 +23404,66 @@
23404 23404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** locking a random byte from a range, concurrent SHARED locks may exist
23405 23405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** even if the locking primitive used is always a write-lock.
23406 23406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23407 23407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
23408 23408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
23409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockInfo *pLock = pFile->pLock;
23409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode = pFile->pInode;
23410 23410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct flock lock;
23411 23411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int s = 0;
23412 23412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int tErrno = 0;
23413 23413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23414 23414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
23415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE7("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h,
23416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- locktypeName(locktype), locktypeName(pFile->locktype),
23417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- locktypeName(pLock->locktype), pLock->cnt , getpid());
23415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h,
23416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFileLock(eFileLock), azFileLock(pFile->eFileLock),
23417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFileLock(pInode->eFileLock), pInode->nShared , getpid()));
23418 23418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23419 23419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there is already a lock of this type or more restrictive on the
23420 23420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** unixFile, do nothing. Don't use the end_lock: exit path, as
23421 23421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** unixEnterMutex() hasn't been called yet.
23422 23422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype>=locktype ){
23424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("LOCK %d %s ok (already held) (unix)\n", pFile->h,
23425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- locktypeName(locktype));
23423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock>=eFileLock ){
23424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("LOCK %d %s ok (already held) (unix)\n", pFile->h,
23425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFileLock(eFileLock)));
23426 23426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
23427 23427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23428 23428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23429 23429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Make sure the locking sequence is correct.
23430 23430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) We never move from unlocked to anything higher than shared lock.
23431 23431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) SQLite never explicitly requests a pendig lock.
23432 23432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (3) A shared lock is always held when a reserve lock is requested.
23433 23433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK );
23435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype!=PENDING_LOCK );
23436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK );
23434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK );
23435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock!=PENDING_LOCK );
23436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK );
23437 23437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* This mutex is needed because pFile->pLock is shared across threads
23438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This mutex is needed because pFile->pInode is shared across threads
23439 23439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23440 23440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
23441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Make sure the current thread owns the pFile.
23443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
23444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = transferOwnership(pFile);
23445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ){
23446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unixLeaveMutex();
23447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
23448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock = pFile->pLock;
23441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode = pFile->pInode;
23450 23442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23451 23443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If some thread using this PID has a lock via a different unixFile*
23452 23444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** handle that precludes the requested lock, return BUSY.
23453 23445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (pFile->locktype!=pLock->locktype &&
23455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (pLock->locktype>=PENDING_LOCK || locktype>SHARED_LOCK))
23446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pFile->eFileLock!=pInode->eFileLock &&
23447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK))
23456 23448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
23457 23449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
23458 23450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto end_lock;
23459 23451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23460 23452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23461 23453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If a SHARED lock is requested, and some thread using this PID already
23462 23454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** has a SHARED or RESERVED lock, then increment reference counts and
23463 23455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** return SQLITE_OK.
23464 23456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( locktype==SHARED_LOCK &&
23466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (pLock->locktype==SHARED_LOCK || pLock->locktype==RESERVED_LOCK) ){
23467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype==SHARED_LOCK );
23468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pFile->locktype==0 );
23469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->cnt>0 );
23470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = SHARED_LOCK;
23471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->cnt++;
23472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->pOpen->nLock++;
23457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFileLock==SHARED_LOCK &&
23458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){
23459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock==SHARED_LOCK );
23460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pFile->eFileLock==0 );
23461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->nShared>0 );
23462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = SHARED_LOCK;
23463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nShared++;
23464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nLock++;
23473 23465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto end_lock;
23474 23466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23475 23467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23476 23468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23477 23469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* A PENDING lock is needed before acquiring a SHARED lock and before
@@ -23478,14 +23470,14 @@
23478 23470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will
23479 23471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be released.
23480 23472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23481 23473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_len = 1L;
23482 23474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_whence = SEEK_SET;
23483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( locktype==SHARED_LOCK
23484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || (locktype==EXCLUSIVE_LOCK && pFile->locktype<PENDING_LOCK)
23475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFileLock==SHARED_LOCK
23476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLock<PENDING_LOCK)
23485 23477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
23486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lock.l_type = (locktype==SHARED_LOCK?F_RDLCK:F_WRLCK);
23478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lock.l_type = (eFileLock==SHARED_LOCK?F_RDLCK:F_WRLCK);
23487 23479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_start = PENDING_BYTE;
23488 23480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
s = fcntl(pFile->h, F_SETLK, &lock);
23489 23481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( s==(-1) ){
23490 23482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tErrno = errno;
23491 23483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
@@ -23498,13 +23490,13 @@
23498 23490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23499 23491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23500 23492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If control gets to this point, then actually go ahead and make
23501 23493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** operating system calls for the specified lock.
23502 23494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( locktype==SHARED_LOCK ){
23504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->cnt==0 );
23505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->locktype==0 );
23495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFileLock==SHARED_LOCK ){
23496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->nShared==0 );
23497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->eFileLock==0 );
23506 23498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23507 23499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Now get the read-lock */
23508 23500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_start = SHARED_FIRST;
23509 23501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_len = SHARED_SIZE;
23510 23502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (s = fcntl(pFile->h, F_SETLK, &lock))==(-1) ){
@@ -23529,26 +23521,26 @@
23529 23521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
23530 23522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( IS_LOCK_ERROR(rc) ){
23531 23523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = tErrno;
23532 23524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23533 23525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
23534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = SHARED_LOCK;
23535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->pOpen->nLock++;
23536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->cnt = 1;
23526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = SHARED_LOCK;
23527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nLock++;
23528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nShared = 1;
23537 23529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( locktype==EXCLUSIVE_LOCK && pLock->cnt>1 ){
23530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){
23539 23531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* We are trying for an exclusive lock but another thread in this
23540 23532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** same process is still holding a shared lock. */
23541 23533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
23542 23534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
23543 23535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The request was for a RESERVED or EXCLUSIVE lock. It is
23544 23536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** assumed that there is a SHARED or greater lock on the file
23545 23537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** already.
23546 23538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( 0!=pFile->locktype );
23539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( 0!=pFile->eFileLock );
23548 23540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_type = F_WRLCK;
23549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- switch( locktype ){
23541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( eFileLock ){
23550 23542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case RESERVED_LOCK:
23551 23543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_start = RESERVED_BYTE;
23552 23544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
23553 23545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case EXCLUSIVE_LOCK:
23554 23546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_start = SHARED_FIRST;
@@ -23573,80 +23565,50 @@
23573 23565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** transitioning from a SHARED to a RESERVED lock. The change
23574 23566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** from SHARED to RESERVED marks the beginning of a normal
23575 23567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** write operation (not a hot journal rollback).
23576 23568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23577 23569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK
23578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && pFile->locktype<=SHARED_LOCK
23579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && locktype==RESERVED_LOCK
23570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && pFile->eFileLock<=SHARED_LOCK
23571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && eFileLock==RESERVED_LOCK
23580 23572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
23581 23573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->transCntrChng = 0;
23582 23574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->dbUpdate = 0;
23583 23575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->inNormalWrite = 1;
23584 23576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23585 23577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
23586 23578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23587 23579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23588 23580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
23589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = locktype;
23590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->locktype = locktype;
23591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( locktype==EXCLUSIVE_LOCK ){
23592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = PENDING_LOCK;
23593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->locktype = PENDING_LOCK;
23581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = eFileLock;
23582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->eFileLock = eFileLock;
23583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( eFileLock==EXCLUSIVE_LOCK ){
23584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = PENDING_LOCK;
23585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->eFileLock = PENDING_LOCK;
23594 23586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23595 23587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23596 23588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
end_lock:
23597 23589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
23598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("LOCK %d %s %s (unix)\n", pFile->h, locktypeName(locktype),
23599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc==SQLITE_OK ? "ok" : "failed");
23600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
23601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
23604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Close all file descriptors accumuated in the unixOpenCnt->pUnused list.
23605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If all such file descriptors are closed without error, the list is
23606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** cleared and SQLITE_OK returned.
23607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
23608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Otherwise, if an error occurs, then successfully closed file descriptor
23609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** entries are removed from the list, and SQLITE_IOERR_CLOSE returned.
23610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** not deleted and SQLITE_IOERR_CLOSE returned.
23611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
23612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int closePendingFds(unixFile *pFile){
23613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK;
23614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixOpenCnt *pOpen = pFile->pOpen;
23615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UnixUnusedFd *pError = 0;
23616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UnixUnusedFd *p;
23617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UnixUnusedFd *pNext;
23618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(p=pOpen->pUnused; p; p=pNext){
23619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pNext = p->pNext;
23620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( close(p->fd) ){
23621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->lastErrno = errno;
23622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_IOERR_CLOSE;
23623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pNext = pError;
23624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pError = p;
23625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
23626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(p);
23627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->pUnused = pError;
23590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("LOCK %d %s %s (unix)\n", pFile->h, azFileLock(eFileLock),
23591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc==SQLITE_OK ? "ok" : "failed"));
23630 23592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
23631 23593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23632 23594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23633 23595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
23634 23596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Add the file descriptor used by file handle pFile to the corresponding
23635 23597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pUnused list.
23636 23598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23637 23599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void setPendingFd(unixFile *pFile){
23638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixOpenCnt *pOpen = pFile->pOpen;
23600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode = pFile->pInode;
23639 23601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnixUnusedFd *p = pFile->pUnused;
23640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pNext = pOpen->pUnused;
23641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->pUnused = p;
23602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pNext = pInode->pUnused;
23603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->pUnused = p;
23642 23604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->h = -1;
23643 23605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->pUnused = 0;
23644 23606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23645 23607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23646 23608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
23647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lower the locking level on file descriptor pFile to locktype. locktype
23609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
23648 23610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** must be either NO_LOCK or SHARED_LOCK.
23649 23611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
23650 23612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the locking level of the file descriptor is already at or below
23651 23613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the requested locking level, this routine is a no-op.
23652 23614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -23654,35 +23616,33 @@
23654 23616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the byte range is divided into 2 parts and the first part is unlocked then
23655 23617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** set to a read lock, then the other part is simply unlocked. This works
23656 23618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** around a bug in BSD NFS lockd (also seen on MacOSX 10.3+) that fails to
23657 23619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** remove the write lock on a region when a read lock is set.
23658 23620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int _posixUnlock(sqlite3_file *id, int locktype, int handleNFSUnlock){
23621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int _posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){
23660 23622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
23661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockInfo *pLock;
23623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode;
23662 23624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct flock lock;
23663 23625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
23664 23626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int h;
23665 23627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int tErrno; /* Error code from system call errors */
23666 23628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23667 23629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
23668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE7("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, locktype,
23669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype, pFile->pLock->locktype, pFile->pLock->cnt, getpid());
23670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype<=SHARED_LOCK );
23672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype<=locktype ){
23673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
23674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
23675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( CHECK_THREADID(pFile) ){
23676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_MISUSE_BKPT;
23630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock,
23631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared,
23632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ getpid()));
23633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
23634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock<=SHARED_LOCK );
23635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock<=eFileLock ){
23636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
23677 23637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23678 23638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
23679 23639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
h = pFile->h;
23680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock = pFile->pLock;
23681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->cnt!=0 );
23682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype>SHARED_LOCK ){
23683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->locktype==pFile->locktype );
23640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode = pFile->pInode;
23641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->nShared!=0 );
23642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock>SHARED_LOCK ){
23643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->eFileLock==pFile->eFileLock );
23684 23644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOErrorBenign(1);
23685 23645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( h=(-1) )
23686 23646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOErrorBenign(0);
23687 23647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23688 23648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef NDEBUG
@@ -23692,13 +23652,15 @@
23692 23652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file changed. If the transaction counter is not updated,
23693 23653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** other connections to the same file might not realize that
23694 23654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the file has changed and hence might not know to flush their
23695 23655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** cache. The use of a stale cache can lead to database corruption.
23696 23656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0
23697 23658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile->inNormalWrite==0
23698 23659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| pFile->dbUpdate==0
23699 23660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| pFile->transCntrChng==1 );
23661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
23700 23662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->inNormalWrite = 0;
23701 23663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
23702 23664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23703 23665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* downgrading to a shared lock on NFS involves clearing the write lock
23704 23666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** before establishing the readlock - to avoid a race condition we downgrade
@@ -23707,11 +23669,11 @@
23707 23669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 1: [WWWWW]
23708 23670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 2: [....W]
23709 23671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 3: [RRRRW]
23710 23672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 4: [RRRR.]
23711 23673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( locktype==SHARED_LOCK ){
23674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFileLock==SHARED_LOCK ){
23713 23675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( handleNFSUnlock ){
23714 23676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
off_t divSize = SHARED_SIZE - 1;
23715 23677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23716 23678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_type = F_UNLCK;
23717 23679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_whence = SEEK_SET;
@@ -23767,78 +23729,75 @@
23767 23729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_type = F_UNLCK;
23768 23730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_whence = SEEK_SET;
23769 23731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_start = PENDING_BYTE;
23770 23732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_len = 2L; assert( PENDING_BYTE+1==RESERVED_BYTE );
23771 23733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fcntl(h, F_SETLK, &lock)!=(-1) ){
23772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->locktype = SHARED_LOCK;
23734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->eFileLock = SHARED_LOCK;
23773 23735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
23774 23736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tErrno = errno;
23775 23737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
23776 23738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( IS_LOCK_ERROR(rc) ){
23777 23739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = tErrno;
23778 23740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23779 23741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto end_unlock;
23780 23742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23781 23743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( locktype==NO_LOCK ){
23783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixOpenCnt *pOpen;
23784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
23744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFileLock==NO_LOCK ){
23785 23745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Decrement the shared lock counter. Release the lock using an
23786 23746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** OS call only when all threads in this same process have released
23787 23747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the lock.
23788 23748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->cnt--;
23790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLock->cnt==0 ){
23749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nShared--;
23750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode->nShared==0 ){
23791 23751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_type = F_UNLCK;
23792 23752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_whence = SEEK_SET;
23793 23753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lock.l_start = lock.l_len = 0L;
23794 23754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOErrorBenign(1);
23795 23755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( h=(-1) )
23796 23756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOErrorBenign(0);
23797 23757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fcntl(h, F_SETLK, &lock)!=(-1) ){
23798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->locktype = NO_LOCK;
23758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->eFileLock = NO_LOCK;
23799 23759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
23800 23760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tErrno = errno;
23801 23761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
23802 23762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( IS_LOCK_ERROR(rc) ){
23803 23763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = tErrno;
23804 23764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->locktype = NO_LOCK;
23806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = NO_LOCK;
23765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->eFileLock = NO_LOCK;
23766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = NO_LOCK;
23807 23767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23808 23768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23809 23769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23810 23770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Decrement the count of locks against this same file. When the
23811 23771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** count reaches zero, close any other file descriptors whose close
23812 23772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** was deferred because of outstanding locks.
23813 23773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen = pFile->pOpen;
23815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->nLock--;
23816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pOpen->nLock>=0 );
23817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pOpen->nLock==0 ){
23774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nLock--;
23775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->nLock>=0 );
23776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode->nLock==0 ){
23818 23777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc2 = closePendingFds(pFile);
23819 23778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
23820 23779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = rc2;
23821 23780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23822 23781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23823 23782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23824 23783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23825 23784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
end_unlock:
23826 23785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
23827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ) pFile->locktype = locktype;
23786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ) pFile->eFileLock = eFileLock;
23828 23787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
23829 23788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23830 23789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23831 23790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
23832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lower the locking level on file descriptor pFile to locktype. locktype
23791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
23833 23792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** must be either NO_LOCK or SHARED_LOCK.
23834 23793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
23835 23794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the locking level of the file descriptor is already at or below
23836 23795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the requested locking level, this routine is a no-op.
23837 23796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int unixUnlock(sqlite3_file *id, int locktype){
23839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return _posixUnlock(id, locktype, 0);
23797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int unixUnlock(sqlite3_file *id, int eFileLock){
23798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return _posixUnlock(id, eFileLock, 0);
23840 23799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23841 23800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23842 23801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
23843 23802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function performs the parts of the "close file" operation
23844 23803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** common to all locking schemes. It closes the directory and file
@@ -23875,11 +23834,11 @@
23875 23834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23876 23835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
vxworksReleaseFileId(pFile->pId);
23877 23836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->pId = 0;
23878 23837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23879 23838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
23880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2("CLOSE %-3d\n", pFile->h);
23839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("CLOSE %-3d\n", pFile->h));
23881 23840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
OpenCounter(-1);
23882 23841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pFile->pUnused);
23883 23842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(pFile, 0, sizeof(unixFile));
23884 23843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23885 23844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
@@ -23892,20 +23851,19 @@
23892 23851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
23893 23852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( id ){
23894 23853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile *)id;
23895 23854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixUnlock(id, NO_LOCK);
23896 23855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
23897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->pOpen && pFile->pOpen->nLock ){
23856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->pInode && pFile->pInode->nLock ){
23898 23857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there are outstanding locks, do not actually close the file just
23899 23858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** yet because that would clear those locks. Instead, add the file
23900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** descriptor to pOpen->pUnused list. It will be automatically closed
23859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** descriptor to pInode->pUnused list. It will be automatically closed
23901 23860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** when the last lock is cleared.
23902 23861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23903 23862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setPendingFd(pFile);
23904 23863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- releaseLockInfo(pFile->pLock);
23906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- releaseOpenCnt(pFile->pOpen);
23864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ releaseInodeInfo(pFile);
23907 23865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = closeUnixFile(id);
23908 23866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
23909 23867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
23910 23868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
23911 23869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -24000,26 +23958,26 @@
24000 23958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
24001 23959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24002 23960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
24003 23961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24004 23962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check if a thread in this process holds such a lock */
24005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype>SHARED_LOCK ){
23963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock>SHARED_LOCK ){
24006 23964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Either this connection or some other connection in the same process
24007 23965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** holds a lock on the file. No need to check further. */
24008 23966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reserved = 1;
24009 23967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
24010 23968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The lock is held if and only if the lockfile exists */
24011 23969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zLockFile = (const char*)pFile->lockingContext;
24012 23970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reserved = access(zLockFile, 0)==0;
24013 23971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved);
23972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved));
24015 23973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pResOut = reserved;
24016 23974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24017 23975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24018 23976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24019 23977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lock the file with the lock specified by parameter locktype - one
23978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lock the file with the lock specified by parameter eFileLock - one
24021 23979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of the following:
24022 23980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24023 23981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) SHARED_LOCK
24024 23982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) RESERVED_LOCK
24025 23983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (3) PENDING_LOCK
@@ -24041,22 +23999,22 @@
24041 23999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** routine to lower a locking level.
24042 24000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24043 24001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** With dotfile locking, we really only support state (4): EXCLUSIVE.
24044 24002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** But we track the other locking levels internally.
24045 24003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int dotlockLock(sqlite3_file *id, int locktype) {
24004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int dotlockLock(sqlite3_file *id, int eFileLock) {
24047 24005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
24048 24006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fd;
24049 24007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zLockFile = (char *)pFile->lockingContext;
24050 24008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
24051 24009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24052 24010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24053 24011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If we have any lock, then the lock file already exists. All we have
24054 24012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to do is adjust our internal record of the lock level.
24055 24013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype > NO_LOCK ){
24057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = locktype;
24014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock > NO_LOCK ){
24015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = eFileLock;
24058 24016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if !OS_VXWORKS
24059 24017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Always update the timestamp on the old file */
24060 24018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
utimes(zLockFile, NULL);
24061 24019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
24062 24020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
@@ -24081,47 +24039,47 @@
24081 24039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = errno;
24082 24040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_IOERR_CLOSE;
24083 24041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24084 24042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24085 24043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* got it, set the type and return ok */
24086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = locktype;
24044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = eFileLock;
24087 24045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24088 24046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24089 24047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24090 24048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lower the locking level on file descriptor pFile to locktype. locktype
24049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
24092 24050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** must be either NO_LOCK or SHARED_LOCK.
24093 24051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24094 24052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the locking level of the file descriptor is already at or below
24095 24053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the requested locking level, this routine is a no-op.
24096 24054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24097 24055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When the locking level reaches NO_LOCK, delete the lock file.
24098 24056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int dotlockUnlock(sqlite3_file *id, int locktype) {
24057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int dotlockUnlock(sqlite3_file *id, int eFileLock) {
24100 24058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
24101 24059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zLockFile = (char *)pFile->lockingContext;
24102 24060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24103 24061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
24104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE5("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, locktype,
24105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype, getpid());
24106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype<=SHARED_LOCK );
24062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock,
24063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock, getpid()));
24064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock<=SHARED_LOCK );
24107 24065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24108 24066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* no-op if possible */
24109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype==locktype ){
24067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock==eFileLock ){
24110 24068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24111 24069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24112 24070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24113 24071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* To downgrade to shared, simply update our internal notion of the
24114 24072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** lock state. No need to mess with the file on disk.
24115 24073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( locktype==SHARED_LOCK ){
24117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = SHARED_LOCK;
24074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFileLock==SHARED_LOCK ){
24075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = SHARED_LOCK;
24118 24076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24119 24077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24120 24078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24121 24079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* To fully unlock the database, delete the lock file */
24122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype==NO_LOCK );
24080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock==NO_LOCK );
24123 24081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( unlink(zLockFile) ){
24124 24082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 0;
24125 24083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int tErrno = errno;
24126 24084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( ENOENT != tErrno ){
24127 24085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
@@ -24129,11 +24087,11 @@
24129 24087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( IS_LOCK_ERROR(rc) ){
24130 24088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = tErrno;
24131 24089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24132 24090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24133 24091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = NO_LOCK;
24092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = NO_LOCK;
24135 24093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24136 24094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24137 24095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24138 24096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24139 24097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Close a file. Make sure the lock has been released before closing.
@@ -24182,11 +24140,11 @@
24182 24140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
24183 24141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24184 24142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
24185 24143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24186 24144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check if a thread in this process holds such a lock */
24187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype>SHARED_LOCK ){
24145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock>SHARED_LOCK ){
24188 24146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reserved = 1;
24189 24147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24190 24148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24191 24149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Otherwise see if some other process holds it. */
24192 24150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !reserved ){
@@ -24213,11 +24171,11 @@
24213 24171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = tErrno;
24214 24172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = lrc;
24215 24173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24216 24174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24217 24175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("TEST WR-LOCK %d %d %d (flock)\n", pFile->h, rc, reserved);
24176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TEST WR-LOCK %d %d %d (flock)\n", pFile->h, rc, reserved));
24219 24177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24220 24178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
24221 24179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){
24222 24180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_OK;
24223 24181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reserved=1;
@@ -24226,11 +24184,11 @@
24226 24184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pResOut = reserved;
24227 24185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24228 24186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24229 24187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24230 24188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lock the file with the lock specified by parameter locktype - one
24189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lock the file with the lock specified by parameter eFileLock - one
24232 24190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of the following:
24233 24191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24234 24192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) SHARED_LOCK
24235 24193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) RESERVED_LOCK
24236 24194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (3) PENDING_LOCK
@@ -24254,20 +24212,20 @@
24254 24212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** access the file.
24255 24213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24256 24214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine will only increase a lock. Use the sqlite3OsUnlock()
24257 24215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** routine to lower a locking level.
24258 24216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int flockLock(sqlite3_file *id, int locktype) {
24217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int flockLock(sqlite3_file *id, int eFileLock) {
24260 24218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
24261 24219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
24262 24220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24263 24221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
24264 24222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24265 24223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* if we already have a lock, it is exclusive.
24266 24224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Just adjust level and punt on outta here. */
24267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (pFile->locktype > NO_LOCK) {
24268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = locktype;
24225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (pFile->eFileLock > NO_LOCK) {
24226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = eFileLock;
24269 24227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24270 24228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24271 24229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24272 24230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* grab an exclusive lock */
24273 24231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -24278,14 +24236,14 @@
24278 24236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( IS_LOCK_ERROR(rc) ){
24279 24237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = tErrno;
24280 24238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24281 24239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
24282 24240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* got it, set the type and return ok */
24283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = locktype;
24241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = eFileLock;
24284 24242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("LOCK %d %s %s (flock)\n", pFile->h, locktypeName(locktype),
24286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc==SQLITE_OK ? "ok" : "failed");
24243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("LOCK %d %s %s (flock)\n", pFile->h, azFileLock(eFileLock),
24244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc==SQLITE_OK ? "ok" : "failed"));
24287 24245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
24288 24246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){
24289 24247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
24290 24248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24291 24249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */
@@ -24292,32 +24250,32 @@
24292 24250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24293 24251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24294 24252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24295 24253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24296 24254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lower the locking level on file descriptor pFile to locktype. locktype
24255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
24298 24256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** must be either NO_LOCK or SHARED_LOCK.
24299 24257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24300 24258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the locking level of the file descriptor is already at or below
24301 24259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the requested locking level, this routine is a no-op.
24302 24260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int flockUnlock(sqlite3_file *id, int locktype) {
24261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int flockUnlock(sqlite3_file *id, int eFileLock) {
24304 24262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
24305 24263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24306 24264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
24307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE5("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, locktype,
24308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype, getpid());
24309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype<=SHARED_LOCK );
24265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, eFileLock,
24266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock, getpid()));
24267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock<=SHARED_LOCK );
24310 24268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24311 24269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* no-op if possible */
24312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype==locktype ){
24270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock==eFileLock ){
24313 24271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24314 24272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24315 24273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24316 24274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* shared can just be set because we always have an exclusive */
24317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (locktype==SHARED_LOCK) {
24318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = locktype;
24275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (eFileLock==SHARED_LOCK) {
24276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = eFileLock;
24319 24277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24320 24278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24321 24279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24322 24280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* no, really, unlock. */
24323 24281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = flock(pFile->h, LOCK_UN);
@@ -24333,11 +24291,11 @@
24333 24291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24334 24292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */
24335 24293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24336 24294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return r;
24337 24295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
24338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = NO_LOCK;
24296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = NO_LOCK;
24339 24297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24340 24298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24341 24299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24342 24300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24343 24301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -24381,41 +24339,41 @@
24381 24339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
24382 24340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24383 24341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
24384 24342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24385 24343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check if a thread in this process holds such a lock */
24386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype>SHARED_LOCK ){
24344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock>SHARED_LOCK ){
24387 24345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reserved = 1;
24388 24346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24389 24347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24390 24348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Otherwise see if some other process holds it. */
24391 24349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !reserved ){
24392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sem_t *pSem = pFile->pOpen->pSem;
24350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sem_t *pSem = pFile->pInode->pSem;
24393 24351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct stat statBuf;
24394 24352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24395 24353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sem_trywait(pSem)==-1 ){
24396 24354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int tErrno = errno;
24397 24355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( EAGAIN != tErrno ){
24398 24356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_CHECKRESERVEDLOCK);
24399 24357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = tErrno;
24400 24358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
24401 24359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* someone else has the lock when we are in NO_LOCK */
24402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- reserved = (pFile->locktype < SHARED_LOCK);
24360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reserved = (pFile->eFileLock < SHARED_LOCK);
24403 24361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24404 24362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
24405 24363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* we could have it if we want it */
24406 24364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sem_post(pSem);
24407 24365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24408 24366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("TEST WR-LOCK %d %d %d (sem)\n", pFile->h, rc, reserved);
24367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TEST WR-LOCK %d %d %d (sem)\n", pFile->h, rc, reserved));
24410 24368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24411 24369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pResOut = reserved;
24412 24370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24413 24371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24414 24372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24415 24373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lock the file with the lock specified by parameter locktype - one
24374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lock the file with the lock specified by parameter eFileLock - one
24417 24375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of the following:
24418 24376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24419 24377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) SHARED_LOCK
24420 24378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) RESERVED_LOCK
24421 24379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (3) PENDING_LOCK
@@ -24439,20 +24397,20 @@
24439 24397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** access the file.
24440 24398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24441 24399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine will only increase a lock. Use the sqlite3OsUnlock()
24442 24400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** routine to lower a locking level.
24443 24401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int semLock(sqlite3_file *id, int locktype) {
24402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int semLock(sqlite3_file *id, int eFileLock) {
24445 24403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
24446 24404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fd;
24447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sem_t *pSem = pFile->pOpen->pSem;
24405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sem_t *pSem = pFile->pInode->pSem;
24448 24406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
24449 24407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24450 24408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* if we already have a lock, it is exclusive.
24451 24409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Just adjust level and punt on outta here. */
24452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (pFile->locktype > NO_LOCK) {
24453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = locktype;
24410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (pFile->eFileLock > NO_LOCK) {
24411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = eFileLock;
24454 24412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_OK;
24455 24413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto sem_end_lock;
24456 24414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24457 24415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24458 24416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* lock semaphore now but bail out when already locked. */
@@ -24460,41 +24418,41 @@
24460 24418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
24461 24419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto sem_end_lock;
24462 24420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24463 24421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24464 24422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* got it, set the type and return ok */
24465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = locktype;
24423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = eFileLock;
24466 24424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24467 24425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sem_end_lock:
24468 24426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24469 24427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24470 24428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24471 24429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lower the locking level on file descriptor pFile to locktype. locktype
24430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
24473 24431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** must be either NO_LOCK or SHARED_LOCK.
24474 24432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24475 24433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the locking level of the file descriptor is already at or below
24476 24434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the requested locking level, this routine is a no-op.
24477 24435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int semUnlock(sqlite3_file *id, int locktype) {
24436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int semUnlock(sqlite3_file *id, int eFileLock) {
24479 24437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
24480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sem_t *pSem = pFile->pOpen->pSem;
24438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sem_t *pSem = pFile->pInode->pSem;
24481 24439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24482 24440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
24483 24441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pSem );
24484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE5("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, locktype,
24485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype, getpid());
24486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype<=SHARED_LOCK );
24442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock,
24443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock, getpid()));
24444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock<=SHARED_LOCK );
24487 24445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24488 24446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* no-op if possible */
24489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype==locktype ){
24447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock==eFileLock ){
24490 24448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24491 24449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24492 24450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24493 24451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* shared can just be set because we always have an exclusive */
24494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (locktype==SHARED_LOCK) {
24495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = locktype;
24452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (eFileLock==SHARED_LOCK) {
24453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = eFileLock;
24496 24454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24497 24455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24498 24456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24499 24457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* no, really unlock. */
24500 24458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ( sem_post(pSem)==-1 ) {
@@ -24503,11 +24461,11 @@
24503 24461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( IS_LOCK_ERROR(rc) ){
24504 24462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = tErrno;
24505 24463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24506 24464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24507 24465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = NO_LOCK;
24466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = NO_LOCK;
24509 24467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24510 24468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24511 24469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24512 24470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24513 24471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Close a file.
@@ -24516,12 +24474,11 @@
24516 24474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( id ){
24517 24475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
24518 24476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
semUnlock(id, NO_LOCK);
24519 24477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
24520 24478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
24521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- releaseLockInfo(pFile->pLock);
24522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- releaseOpenCnt(pFile->pOpen);
24479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ releaseInodeInfo(pFile);
24523 24480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
24524 24481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
closeUnixFile(id);
24525 24482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24526 24483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24527 24484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -24586,19 +24543,19 @@
24586 24543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pb.startEndFlag = 0;
24587 24544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pb.offset = offset;
24588 24545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pb.length = length;
24589 24546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pb.fd = pFile->h;
24590 24547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE6("AFPSETLOCK [%s] for %d%s in range %llx:%llx\n",
24548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("AFPSETLOCK [%s] for %d%s in range %llx:%llx\n",
24592 24549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(setLockFlag?"ON":"OFF"), pFile->h, (pb.fd==-1?"[testval-1]":""),
24593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- offset, length);
24550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ offset, length));
24594 24551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
err = fsctl(path, afpfsByteRangeLock2FSCTL, &pb, 0);
24595 24552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ( err==-1 ) {
24596 24553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
24597 24554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int tErrno = errno;
24598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("AFPSETLOCK failed to fsctl() '%s' %d %s\n",
24599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- path, tErrno, strerror(tErrno));
24555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("AFPSETLOCK failed to fsctl() '%s' %d %s\n",
24556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ path, tErrno, strerror(tErrno)));
24600 24557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS
24601 24558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
24602 24559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
24603 24560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqliteErrorFromPosixError(tErrno,
24604 24561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setLockFlag ? SQLITE_IOERR_LOCK : SQLITE_IOERR_UNLOCK);
@@ -24629,14 +24586,14 @@
24629 24586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
24630 24587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( context->reserved ){
24631 24588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pResOut = 1;
24632 24589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24633 24590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unixEnterMutex(); /* Because pFile->pLock is shared across threads */
24591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixEnterMutex(); /* Because pFile->pInode is shared across threads */
24635 24592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24636 24593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check if a thread in this process holds such a lock */
24637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->pLock->locktype>SHARED_LOCK ){
24594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->pInode->eFileLock>SHARED_LOCK ){
24638 24595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reserved = 1;
24639 24596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24640 24597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24641 24598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Otherwise see if some other process holds it.
24642 24599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -24655,18 +24612,18 @@
24655 24612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc=lrc;
24656 24613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24657 24614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24658 24615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24659 24616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
24660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("TEST WR-LOCK %d %d %d (afp)\n", pFile->h, rc, reserved);
24617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TEST WR-LOCK %d %d %d (afp)\n", pFile->h, rc, reserved));
24661 24618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24662 24619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pResOut = reserved;
24663 24620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24664 24621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24665 24622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24666 24623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lock the file with the lock specified by parameter locktype - one
24624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lock the file with the lock specified by parameter eFileLock - one
24668 24625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of the following:
24669 24626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24670 24627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) SHARED_LOCK
24671 24628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) RESERVED_LOCK
24672 24629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (3) PENDING_LOCK
@@ -24685,84 +24642,76 @@
24685 24642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PENDING -> EXCLUSIVE
24686 24643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24687 24644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine will only increase a lock. Use the sqlite3OsUnlock()
24688 24645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** routine to lower a locking level.
24689 24646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int afpLock(sqlite3_file *id, int locktype){
24647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int afpLock(sqlite3_file *id, int eFileLock){
24691 24648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
24692 24649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
24693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockInfo *pLock = pFile->pLock;
24650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode = pFile->pInode;
24694 24651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
24695 24652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24696 24653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
24697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE7("LOCK %d %s was %s(%s,%d) pid=%d (afp)\n", pFile->h,
24698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- locktypeName(locktype), locktypeName(pFile->locktype),
24699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- locktypeName(pLock->locktype), pLock->cnt , getpid());
24654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (afp)\n", pFile->h,
24655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFileLock(eFileLock), azFileLock(pFile->eFileLock),
24656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFileLock(pInode->eFileLock), pInode->nShared , getpid()));
24700 24657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24701 24658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there is already a lock of this type or more restrictive on the
24702 24659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** unixFile, do nothing. Don't use the afp_end_lock: exit path, as
24703 24660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** unixEnterMutex() hasn't been called yet.
24704 24661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype>=locktype ){
24706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("LOCK %d %s ok (already held) (afp)\n", pFile->h,
24707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- locktypeName(locktype));
24662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock>=eFileLock ){
24663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("LOCK %d %s ok (already held) (afp)\n", pFile->h,
24664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFileLock(eFileLock)));
24708 24665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
24709 24666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24710 24667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24711 24668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Make sure the locking sequence is correct
24712 24669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) We never move from unlocked to anything higher than shared lock.
24713 24670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) SQLite never explicitly requests a pendig lock.
24714 24671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (3) A shared lock is always held when a reserve lock is requested.
24715 24672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK );
24717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype!=PENDING_LOCK );
24718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK );
24673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK );
24674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock!=PENDING_LOCK );
24675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK );
24719 24676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* This mutex is needed because pFile->pLock is shared across threads
24677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This mutex is needed because pFile->pInode is shared across threads
24721 24678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24722 24679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
24723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
24724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Make sure the current thread owns the pFile.
24725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
24726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = transferOwnership(pFile);
24727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ){
24728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unixLeaveMutex();
24729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
24730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
24731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock = pFile->pLock;
24680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode = pFile->pInode;
24732 24681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24733 24682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If some thread using this PID has a lock via a different unixFile*
24734 24683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** handle that precludes the requested lock, return BUSY.
24735 24684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (pFile->locktype!=pLock->locktype &&
24737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (pLock->locktype>=PENDING_LOCK || locktype>SHARED_LOCK))
24685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pFile->eFileLock!=pInode->eFileLock &&
24686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK))
24738 24687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
24739 24688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
24740 24689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto afp_end_lock;
24741 24690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24742 24691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24743 24692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If a SHARED lock is requested, and some thread using this PID already
24744 24693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** has a SHARED or RESERVED lock, then increment reference counts and
24745 24694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** return SQLITE_OK.
24746 24695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( locktype==SHARED_LOCK &&
24748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (pLock->locktype==SHARED_LOCK || pLock->locktype==RESERVED_LOCK) ){
24749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype==SHARED_LOCK );
24750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pFile->locktype==0 );
24751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->cnt>0 );
24752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = SHARED_LOCK;
24753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->cnt++;
24754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->pOpen->nLock++;
24696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFileLock==SHARED_LOCK &&
24697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){
24698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock==SHARED_LOCK );
24699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pFile->eFileLock==0 );
24700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->nShared>0 );
24701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = SHARED_LOCK;
24702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nShared++;
24703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nLock++;
24755 24704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto afp_end_lock;
24756 24705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24757 24706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24758 24707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* A PENDING lock is needed before acquiring a SHARED lock and before
24759 24708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will
24760 24709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be released.
24761 24710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( locktype==SHARED_LOCK
24763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || (locktype==EXCLUSIVE_LOCK && pFile->locktype<PENDING_LOCK)
24711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFileLock==SHARED_LOCK
24712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLock<PENDING_LOCK)
24764 24713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
24765 24714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int failed;
24766 24715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
failed = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 1);
24767 24716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if (failed) {
24768 24717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = failed;
@@ -24771,24 +24720,24 @@
24771 24720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24772 24721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24773 24722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If control gets to this point, then actually go ahead and make
24774 24723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** operating system calls for the specified lock.
24775 24724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( locktype==SHARED_LOCK ){
24725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eFileLock==SHARED_LOCK ){
24777 24726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int lrc1, lrc2, lrc1Errno;
24778 24727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
long lk, mask;
24779 24728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->cnt==0 );
24781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->locktype==0 );
24729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->nShared==0 );
24730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->eFileLock==0 );
24782 24731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24783 24732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff;
24784 24733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Now get the read-lock SHARED_LOCK */
24785 24734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* note that the quality of the randomness doesn't matter that much */
24786 24735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lk = random();
24787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->sharedByte = (lk & mask)%(SHARED_SIZE - 1);
24736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->sharedByte = (lk & mask)%(SHARED_SIZE - 1);
24788 24737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lrc1 = afpSetLock(context->dbPath, pFile,
24789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SHARED_FIRST+pLock->sharedByte, 1, 1);
24738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SHARED_FIRST+pInode->sharedByte, 1, 1);
24790 24739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( IS_LOCK_ERROR(lrc1) ){
24791 24740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lrc1Errno = pFile->lastErrno;
24792 24741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24793 24742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Drop the temporary PENDING lock */
24794 24743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lrc2 = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0);
@@ -24801,46 +24750,46 @@
24801 24750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = lrc2;
24802 24751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto afp_end_lock;
24803 24752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else if( lrc1 != SQLITE_OK ) {
24804 24753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = lrc1;
24805 24754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
24806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = SHARED_LOCK;
24807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->pOpen->nLock++;
24808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->cnt = 1;
24755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = SHARED_LOCK;
24756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nLock++;
24757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nShared = 1;
24809 24758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( locktype==EXCLUSIVE_LOCK && pLock->cnt>1 ){
24759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){
24811 24760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* We are trying for an exclusive lock but another thread in this
24812 24761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** same process is still holding a shared lock. */
24813 24762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
24814 24763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
24815 24764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The request was for a RESERVED or EXCLUSIVE lock. It is
24816 24765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** assumed that there is a SHARED or greater lock on the file
24817 24766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** already.
24818 24767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24819 24768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int failed = 0;
24820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( 0!=pFile->locktype );
24821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (locktype >= RESERVED_LOCK && pFile->locktype < RESERVED_LOCK) {
24769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( 0!=pFile->eFileLock );
24770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (eFileLock >= RESERVED_LOCK && pFile->eFileLock < RESERVED_LOCK) {
24822 24771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Acquire a RESERVED lock */
24823 24772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
failed = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1);
24824 24773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !failed ){
24825 24774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
context->reserved = 1;
24826 24775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24827 24776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (!failed && locktype == EXCLUSIVE_LOCK) {
24777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (!failed && eFileLock == EXCLUSIVE_LOCK) {
24829 24778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Acquire an EXCLUSIVE lock */
24830 24779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24831 24780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Remove the shared lock before trying the range. we'll need to
24832 24781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** reestablish the shared lock if we can't get the afpUnlock
24833 24782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24834 24783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !(failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST +
24835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->sharedByte, 1, 0)) ){
24784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->sharedByte, 1, 0)) ){
24836 24785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int failed2 = SQLITE_OK;
24837 24786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* now attemmpt to get the exclusive lock range */
24838 24787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST,
24839 24788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SHARED_SIZE, 1);
24840 24789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( failed && (failed2 = afpSetLock(context->dbPath, pFile,
24841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SHARED_FIRST + pLock->sharedByte, 1, 1)) ){
24790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SHARED_FIRST + pInode->sharedByte, 1, 1)) ){
24842 24791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Can't reestablish the shared lock. Sqlite can't deal, this is
24843 24792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a critical I/O error
24844 24793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24845 24794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = ((failed & SQLITE_IOERR) == SQLITE_IOERR) ? failed2 :
24846 24795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_IOERR_LOCK;
@@ -24854,57 +24803,55 @@
24854 24803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = failed;
24855 24804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24856 24805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24857 24806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24858 24807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
24859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = locktype;
24860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->locktype = locktype;
24861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( locktype==EXCLUSIVE_LOCK ){
24862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = PENDING_LOCK;
24863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->locktype = PENDING_LOCK;
24808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = eFileLock;
24809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->eFileLock = eFileLock;
24810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( eFileLock==EXCLUSIVE_LOCK ){
24811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = PENDING_LOCK;
24812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->eFileLock = PENDING_LOCK;
24864 24813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24865 24814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24866 24815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afp_end_lock:
24867 24816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
24868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("LOCK %d %s %s (afp)\n", pFile->h, locktypeName(locktype),
24869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc==SQLITE_OK ? "ok" : "failed");
24817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("LOCK %d %s %s (afp)\n", pFile->h, azFileLock(eFileLock),
24818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc==SQLITE_OK ? "ok" : "failed"));
24870 24819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24871 24820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24872 24821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24873 24822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lower the locking level on file descriptor pFile to locktype. locktype
24823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
24875 24824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** must be either NO_LOCK or SHARED_LOCK.
24876 24825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24877 24826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the locking level of the file descriptor is already at or below
24878 24827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the requested locking level, this routine is a no-op.
24879 24828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int afpUnlock(sqlite3_file *id, int locktype) {
24829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int afpUnlock(sqlite3_file *id, int eFileLock) {
24881 24830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
24882 24831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
24883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixLockInfo *pLock;
24832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode;
24884 24833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
24885 24834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int skipShared = 0;
24886 24835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_TEST
24887 24836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int h = pFile->h;
24888 24837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
24889 24838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24890 24839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
24891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE7("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, locktype,
24892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype, pFile->pLock->locktype, pFile->pLock->cnt, getpid());
24893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
24894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( locktype<=SHARED_LOCK );
24895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype<=locktype ){
24896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
24897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
24898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( CHECK_THREADID(pFile) ){
24899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_MISUSE_BKPT;
24840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, eFileLock,
24841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared,
24842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ getpid()));
24843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
24844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eFileLock<=SHARED_LOCK );
24845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock<=eFileLock ){
24846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
24900 24847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24901 24848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
24902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock = pFile->pLock;
24903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->cnt!=0 );
24904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype>SHARED_LOCK ){
24905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLock->locktype==pFile->locktype );
24849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode = pFile->pInode;
24850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->nShared!=0 );
24851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock>SHARED_LOCK ){
24852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->eFileLock==pFile->eFileLock );
24906 24853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOErrorBenign(1);
24907 24854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( h=(-1) )
24908 24855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOErrorBenign(0);
24909 24856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24910 24857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef NDEBUG
@@ -24920,66 +24867,64 @@
24920 24867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| pFile->dbUpdate==0
24921 24868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| pFile->transCntrChng==1 );
24922 24869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->inNormalWrite = 0;
24923 24870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
24924 24871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype==EXCLUSIVE_LOCK ){
24872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock==EXCLUSIVE_LOCK ){
24926 24873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = afpSetLock(context->dbPath, pFile, SHARED_FIRST, SHARED_SIZE, 0);
24927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && (locktype==SHARED_LOCK || pLock->cnt>1) ){
24874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1) ){
24928 24875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* only re-establish the shared lock if necessary */
24929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int sharedLockByte = SHARED_FIRST+pLock->sharedByte;
24876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sharedLockByte = SHARED_FIRST+pInode->sharedByte;
24930 24877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 1);
24931 24878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
24932 24879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
skipShared = 1;
24933 24880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24934 24881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && pFile->locktype>=PENDING_LOCK ){
24882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && pFile->eFileLock>=PENDING_LOCK ){
24936 24883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0);
24937 24884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && pFile->locktype>=RESERVED_LOCK && context->reserved ){
24885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && pFile->eFileLock>=RESERVED_LOCK && context->reserved ){
24939 24886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0);
24940 24887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !rc ){
24941 24888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
context->reserved = 0;
24942 24889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24943 24890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && (locktype==SHARED_LOCK || pLock->cnt>1)){
24945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->locktype = SHARED_LOCK;
24891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1)){
24892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->eFileLock = SHARED_LOCK;
24946 24893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24947 24894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && locktype==NO_LOCK ){
24895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && eFileLock==NO_LOCK ){
24949 24896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24950 24897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Decrement the shared lock counter. Release the lock using an
24951 24898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** OS call only when all threads in this same process have released
24952 24899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the lock.
24953 24900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned long long sharedLockByte = SHARED_FIRST+pLock->sharedByte;
24955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->cnt--;
24956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLock->cnt==0 ){
24901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned long long sharedLockByte = SHARED_FIRST+pInode->sharedByte;
24902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nShared--;
24903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode->nShared==0 ){
24957 24904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOErrorBenign(1);
24958 24905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( h=(-1) )
24959 24906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOErrorBenign(0);
24960 24907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !skipShared ){
24961 24908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 0);
24962 24909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24963 24910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !rc ){
24964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLock->locktype = NO_LOCK;
24965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = NO_LOCK;
24911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->eFileLock = NO_LOCK;
24912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = NO_LOCK;
24966 24913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24967 24914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24968 24915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
24969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixOpenCnt *pOpen = pFile->pOpen;
24970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
24971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen->nLock--;
24972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pOpen->nLock>=0 );
24973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pOpen->nLock==0 ){
24916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode->nLock--;
24917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInode->nLock>=0 );
24918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode->nLock==0 ){
24974 24919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = closePendingFds(pFile);
24975 24920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24976 24921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24977 24922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24978 24923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24979 24924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
24980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ) pFile->locktype = locktype;
24925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ) pFile->eFileLock = eFileLock;
24981 24926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
24982 24927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24983 24928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24984 24929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24985 24930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Close a file & cleanup AFP specific locking context
@@ -24988,20 +24933,19 @@
24988 24933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
24989 24934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( id ){
24990 24935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
24991 24936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpUnlock(id, NO_LOCK);
24992 24937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
24993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->pOpen && pFile->pOpen->nLock ){
24938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->pInode && pFile->pInode->nLock ){
24994 24939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there are outstanding locks, do not actually close the file just
24995 24940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** yet because that would clear those locks. Instead, add the file
24996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** descriptor to pOpen->aPending. It will be automatically closed when
24941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** descriptor to pInode->aPending. It will be automatically closed when
24997 24942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the last lock is cleared.
24998 24943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24999 24944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setPendingFd(pFile);
25000 24945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- releaseLockInfo(pFile->pLock);
25002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- releaseOpenCnt(pFile->pOpen);
24946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ releaseInodeInfo(pFile);
25003 24947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pFile->lockingContext);
25004 24948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = closeUnixFile(id);
25005 24949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
25006 24950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25007 24951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
@@ -25020,18 +24964,18 @@
25020 24964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/******************************************************************************
25021 24965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*************************** Begin NFS Locking ********************************/
25022 24966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25023 24967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
25024 24968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
25025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lower the locking level on file descriptor pFile to locktype. locktype
24969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
25026 24970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** must be either NO_LOCK or SHARED_LOCK.
25027 24971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
25028 24972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the locking level of the file descriptor is already at or below
25029 24973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the requested locking level, this routine is a no-op.
25030 24974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
25031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int nfsUnlock(sqlite3_file *id, int locktype){
25032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return _posixUnlock(id, locktype, 1);
24975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int nfsUnlock(sqlite3_file *id, int eFileLock){
24976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return _posixUnlock(id, eFileLock, 1);
25033 24977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25034 24978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25035 24979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */
25036 24980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
25037 24981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The code above is the NFS lock implementation. The code is specific
@@ -25091,11 +25035,11 @@
25091 25035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
25092 25036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TIMER_END;
25093 25037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( got<0 ){
25094 25038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
((unixFile*)id)->lastErrno = errno;
25095 25039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE5("READ %-3d %5d %7lld %llu\n", id->h, got, offset, TIMER_ELAPSED);
25040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("READ %-3d %5d %7lld %llu\n", id->h, got, offset, TIMER_ELAPSED));
25097 25041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return got;
25098 25042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25099 25043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25100 25044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
25101 25045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Read data from a file into a buffer. Return SQLITE_OK if all
@@ -25112,14 +25056,16 @@
25112 25056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int got;
25113 25057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id );
25114 25058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25115 25059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If this is a database file (not a journal, master-journal or temp
25116 25060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file), the bytes in the locking range should never be read or written. */
25061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0
25117 25062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile->pUnused==0
25118 25063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| offset>=PENDING_BYTE+512
25119 25064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| offset+amt<=PENDING_BYTE
25120 25065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
25066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
25121 25067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25122 25068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
got = seekAndRead(pFile, offset, pBuf, amt);
25123 25069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( got==amt ){
25124 25070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
25125 25071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( got<0 ){
@@ -25165,11 +25111,11 @@
25165 25111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TIMER_END;
25166 25112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( got<0 ){
25167 25113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
((unixFile*)id)->lastErrno = errno;
25168 25114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25169 25115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE5("WRITE %-3d %5d %7lld %llu\n", id->h, got, offset, TIMER_ELAPSED);
25116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("WRITE %-3d %5d %7lld %llu\n", id->h, got, offset, TIMER_ELAPSED));
25171 25117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return got;
25172 25118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25173 25119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25174 25120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25175 25121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -25187,14 +25133,16 @@
25187 25133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id );
25188 25134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( amt>0 );
25189 25135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25190 25136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If this is a database file (not a journal, master-journal or temp
25191 25137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file), the bytes in the locking range should never be read or written. */
25138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0
25192 25139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile->pUnused==0
25193 25140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| offset>=PENDING_BYTE+512
25194 25141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| offset+amt<=PENDING_BYTE
25195 25142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
25143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
25196 25144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25197 25145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef NDEBUG
25198 25146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If we are doing a normal write to a database file (as opposed to
25199 25147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** doing a hot-journal rollback or a write to some file other than a
25200 25148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** normal database file) then record the fact that the database
@@ -25389,21 +25337,21 @@
25389 25337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** line is to test that doing so does not cause any problems.
25390 25338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
25391 25339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateDiskfullError( return SQLITE_FULL );
25392 25340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25393 25341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
25394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2("SYNC %-3d\n", pFile->h);
25342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("SYNC %-3d\n", pFile->h));
25395 25343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = full_fsync(pFile->h, isFullsync, isDataOnly);
25396 25344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( rc=1 );
25397 25345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ){
25398 25346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = errno;
25399 25347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_IOERR_FSYNC;
25400 25348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25401 25349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->dirfd>=0 ){
25402 25350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int err;
25403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd,
25404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- HAVE_FULLFSYNC, isFullsync);
25351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd,
25352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ HAVE_FULLFSYNC, isFullsync));
25405 25353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_DISABLE_DIRSYNC
25406 25354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The directory sync is only attempted if full_fsync is
25407 25355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** turned off or unavailable. If a full_fsync occurred above,
25408 25356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** then the directory sync is superfluous.
25409 25357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -25471,11 +25419,11 @@
25471 25419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
((unixFile*)id)->lastErrno = errno;
25472 25420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_IOERR_FSTAT;
25473 25421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25474 25422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pSize = buf.st_size;
25475 25423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* When opening a zero-size database, the findLockInfo() procedure
25424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* When opening a zero-size database, the findInodeInfo() procedure
25477 25425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** writes a single byte into that file in order to work around a bug
25478 25426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in the OS-X msdos filesystem. In order to avoid problems with upper
25479 25427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** layers, we need to report this file size as zero even though it is
25480 25428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** really 1. Ticket #3260.
25481 25429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -25498,16 +25446,24 @@
25498 25446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Information and control of an open file handle.
25499 25447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
25500 25448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int unixFileControl(sqlite3_file *id, int op, void *pArg){
25501 25449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
switch( op ){
25502 25450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_FCNTL_LOCKSTATE: {
25503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *(int*)pArg = ((unixFile*)id)->locktype;
25451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *(int*)pArg = ((unixFile*)id)->eFileLock;
25504 25452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
25505 25453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25506 25454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_LAST_ERRNO: {
25507 25455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*(int*)pArg = ((unixFile*)id)->lastErrno;
25508 25456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
25457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_FCNTL_SIZE_HINT: {
25459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* No performance advantage seen on Linux */
25460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 szFile = *(sqlite3_int64*)pArg;
25461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixFile *pFile = (unixFile*)id;
25462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ftruncate(pFile->h, szFile);
25463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
25464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
25509 25465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25510 25466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef NDEBUG
25511 25467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The pager calls this method to signal that it has done
25512 25468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a rollback and that the database is therefore unchanged and
25513 25469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** it hence it is OK for the transaction change counter to be
@@ -25549,10 +25505,571 @@
25549 25505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int unixDeviceCharacteristics(sqlite3_file *NotUsed){
25550 25506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(NotUsed);
25551 25507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
25552 25508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25553 25509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
25511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
25514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Object used to represent an shared memory buffer.
25515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When multiple threads all reference the same wal-index, each thread
25517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** has its own unixShm object, but they all point to a single instance
25518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of this unixShmNode object. In other words, each wal-index is opened
25519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** only once per process.
25520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Each unixShmNode object is connected to a single unixInodeInfo object.
25522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** We could coalesce this object into unixInodeInfo, but that would mean
25523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** every open file that does not use shared memory (in other words, most
25524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** open files) would have to carry around this extra information. So
25525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the unixInodeInfo object contains a pointer to this unixShmNode object
25526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and the unixShmNode object is created only when needed.
25527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** unixMutexHeld() must be true when creating or destroying
25529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this object or while reading or writing the following fields:
25530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** nRef
25532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The following fields are read-only after the object is created:
25534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fid
25536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zFilename
25537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Either unixShmNode.mutex must be held or unixShmNode.nRef==0 and
25539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** unixMutexHeld() is true when reading or writing any other field
25540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in this structure.
25541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct unixShmNode {
25543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */
25544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex *mutex; /* Mutex to access this object */
25545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zFilename; /* Name of the mmapped file */
25546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int h; /* Open file descriptor */
25547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int szRegion; /* Size of shared-memory regions */
25548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRegion; /* Size of array apRegion */
25549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **apRegion; /* Array of mapped shared-memory regions */
25550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRef; /* Number of unixShm objects pointing to this */
25551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShm *pFirst; /* All unixShm objects pointing to this */
25552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
25553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 exclMask; /* Mask of exclusive locks held */
25554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 sharedMask; /* Mask of shared locks held */
25555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 nextShmId; /* Next available unixShm.id value */
25556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
25557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
25558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
25560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Structure used internally by this VFS to record the state of an
25561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** open shared memory connection.
25562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The following fields are initialized when this object is created and
25564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are read-only thereafter:
25565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** unixShm.pFile
25567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** unixShm.id
25568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** All other fields are read/write. The unixShm.pFile->mutex must be held
25570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** while accessing any read/write fields.
25571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct unixShm {
25573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmNode *pShmNode; /* The underlying unixShmNode object */
25574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShm *pNext; /* Next unixShm with the same unixShmNode */
25575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 hasMutex; /* True if holding the unixShmNode mutex */
25576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 sharedMask; /* Mask of shared locks held */
25577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 exclMask; /* Mask of exclusive locks held */
25578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
25579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 id; /* Id of this connection within its unixShmNode */
25580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
25581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
25582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
25584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Constants used for locking
25585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define UNIX_SHM_BASE ((18+SQLITE_SHM_NLOCK)*4) /* first lock byte */
25587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define UNIX_SHM_DMS (UNIX_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */
25588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
25590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Apply posix advisory locks for all bytes from ofst through ofst+n-1.
25591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Locks block if the mask is exactly UNIX_SHM_C and are non-blocking
25593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** otherwise.
25594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int unixShmSystemLock(
25596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmNode *pShmNode, /* Apply locks to this open shared-memory segment */
25597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int lockType, /* F_UNLCK, F_RDLCK, or F_WRLCK */
25598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst, /* First byte of the locking range */
25599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n /* Number of bytes to lock */
25600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
25601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct flock f; /* The posix advisory locking structure */
25602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Result code form fcntl() */
25603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Access to the unixShmNode object is serialized by the caller */
25605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( sqlite3_mutex_held(pShmNode->mutex) || pShmNode->nRef==0 );
25606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Shared locks never span more than one byte */
25608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( n==1 || lockType!=F_RDLCK );
25609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Locks are within range */
25611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( n>=1 && n<SQLITE_SHM_NLOCK );
25612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Initialize the locking parameters */
25614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&f, 0, sizeof(f));
25615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.l_type = lockType;
25616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.l_whence = SEEK_SET;
25617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.l_start = ofst;
25618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.l_len = n;
25619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fcntl(pShmNode->h, F_SETLK, &f);
25621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY;
25622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Update the global lock state and do debug tracing */
25624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
25625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { u16 mask;
25626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("SHM-LOCK "));
25627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mask = (1<<(ofst+n)) - (1<<ofst);
25628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
25629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( lockType==F_UNLCK ){
25630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("unlock %d ok", ofst));
25631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->exclMask &= ~mask;
25632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->sharedMask &= ~mask;
25633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( lockType==F_RDLCK ){
25634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("read-lock %d ok", ofst));
25635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->exclMask &= ~mask;
25636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->sharedMask |= mask;
25637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
25638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( lockType==F_WRLCK );
25639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("write-lock %d ok", ofst));
25640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->exclMask |= mask;
25641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->sharedMask &= ~mask;
25642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
25644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( lockType==F_UNLCK ){
25645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("unlock %d failed", ofst));
25646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( lockType==F_RDLCK ){
25647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("read-lock failed"));
25648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
25649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( lockType==F_WRLCK );
25650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("write-lock %d failed", ofst));
25651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE((" - afterwards %03x,%03x\n",
25654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->sharedMask, pShmNode->exclMask));
25655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
25657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
25659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
25663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Purge the unixShmNodeList list of all entries with unixShmNode.nRef==0.
25664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is not a VFS shared-memory method; it is a utility function called
25666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by VFS shared-memory methods.
25667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void unixShmPurge(unixFile *pFd){
25669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmNode *p = pFd->pInode->pShmNode;
25670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( unixMutexHeld() );
25671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p && p->nRef==0 ){
25672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
25673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->pInode==pFd->pInode );
25674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->mutex ) sqlite3_mutex_free(p->mutex);
25675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->nRegion; i++){
25676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ munmap(p->apRegion[i], p->szRegion);
25677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p->apRegion);
25679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->h>=0 ) close(p->h);
25680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pInode->pShmNode = 0;
25681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p);
25682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Forward reference */
25686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *unixTempFileDir(int);
25687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
25689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Open a shared-memory area. This particular implementation uses
25690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mmapped files.
25691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zName is a filename used to identify the shared-memory area. The
25693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** implementation does not (and perhaps should not) use this name
25694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** directly, but rather use it as a template for finding an appropriate
25695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** name for the shared-memory storage. In this implementation, the
25696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** string "-index" is appended to zName and used as the name of the
25697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mmapped file.
25698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When opening a new shared-memory file, if no other instances of that
25700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file are currently open, in this process or in other processes, then
25701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the file must be truncated to zero length or have its header cleared.
25702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int unixShmOpen(
25704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *fd /* The file descriptor of the associated database */
25705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
25706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct unixShm *p = 0; /* The connection to be opened */
25707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct unixShmNode *pShmNode = 0; /* The underlying mmapped file */
25708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Result code */
25709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct unixFile *pDbFd; /* Underlying database file */
25710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode; /* The inode of fd */
25711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTempDir; /* Directory for temporary files */
25712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nTempDir; /* Size of the zTempDir string */
25713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Allocate space for the new sqlite3_shm object.
25715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = sqlite3_malloc( sizeof(*p) );
25717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p==0 ) return SQLITE_NOMEM;
25718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(p, 0, sizeof(*p));
25719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDbFd = (struct unixFile*)fd;
25720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pDbFd->pShm==0 );
25721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Check to see if a unixShmNode object already exists. Reuse an existing
25723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** one if present. Create a new one if necessary.
25724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixEnterMutex();
25726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode = pDbFd->pInode;
25727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode = pInode->pShmNode;
25728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode==0 ){
25729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTempDir = unixTempFileDir(1);
25730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zTempDir==0 ){
25731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixLeaveMutex();
25732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p);
25733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_CANTOPEN_NOTEMPDIR;
25734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nTempDir = strlen(zTempDir);
25736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode = sqlite3_malloc( sizeof(*pShmNode) + nTempDir + 50 );
25737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode==0 ){
25738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_NOMEM;
25739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shm_open_err;
25740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pShmNode, 0, sizeof(*pShmNode));
25742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->zFilename = (char*)&pShmNode[1];
25743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_snprintf(nTempDir+50, pShmNode->zFilename,
25744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "%s/sqlite-wi-%x-%x", zTempDir,
25745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (u32)pInode->fileId.dev, (u32)pInode->fileId.ino);
25746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->h = -1;
25747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDbFd->pInode->pShmNode = pShmNode;
25748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->pInode = pDbFd->pInode;
25749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
25750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode->mutex==0 ){
25751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_NOMEM;
25752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shm_open_err;
25753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->h = open(pShmNode->zFilename, O_RDWR|O_CREAT, 0664);
25756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode->h<0 ){
25757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_CANTOPEN_BKPT;
25758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shm_open_err;
25759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Check to see if another process is holding the dead-man switch.
25762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If not, truncate the file to zero length.
25763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
25765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( unixShmSystemLock(pShmNode, F_WRLCK, UNIX_SHM_DMS, 1)==SQLITE_OK ){
25766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ftruncate(pShmNode->h, 0) ){
25767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_IOERR_SHMOPEN;
25768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
25771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = unixShmSystemLock(pShmNode, F_RDLCK, UNIX_SHM_DMS, 1);
25772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ) goto shm_open_err;
25774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Make the new connection a child of the unixShmNode */
25777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pShmNode = pShmNode;
25778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pNext = pShmNode->pFirst;
25779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
25780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->id = pShmNode->nextShmId++;
25781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
25782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->pFirst = p;
25783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->nRef++;
25784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDbFd->pShm = p;
25785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixLeaveMutex();
25786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
25787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Jump here on any error */
25789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shm_open_err:
25790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmPurge(pDbFd); /* This call frees pShmNode if required */
25791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p);
25792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixLeaveMutex();
25793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
25794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
25797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Close a connection to shared-memory. Delete the underlying
25798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** storage if deleteFlag is true.
25799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int unixShmClose(
25801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *fd, /* The underlying database file */
25802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int deleteFlag /* Delete shared-memory if true */
25803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
25804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShm *p; /* The connection to be closed */
25805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmNode *pShmNode; /* The underlying shared-memory file */
25806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShm **pp; /* For looping over sibling connections */
25807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixFile *pDbFd; /* The underlying database file */
25808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDbFd = (unixFile*)fd;
25810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = pDbFd->pShm;
25811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p==0 ) return SQLITE_OK;
25812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode = p->pShmNode;
25813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pShmNode==pDbFd->pInode->pShmNode );
25815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pShmNode->pInode==pDbFd->pInode );
25816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Remove connection p from the set of connections associated
25818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** with pShmNode */
25819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_enter(pShmNode->mutex);
25820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){}
25821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp = p->pNext;
25822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Free the connection p */
25824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p);
25825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDbFd->pShm = 0;
25826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_leave(pShmNode->mutex);
25827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If pShmNode->nRef has reached 0, then close the underlying
25829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** shared-memory file, too */
25830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixEnterMutex();
25831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pShmNode->nRef>0 );
25832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->nRef--;
25833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode->nRef==0 ){
25834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( deleteFlag ) unlink(pShmNode->zFilename);
25835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmPurge(pDbFd);
25836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixLeaveMutex();
25838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
25840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
25843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Change the lock state for a shared-memory segment.
25844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Note that the relationship between SHAREd and EXCLUSIVE locks is a little
25846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** different here than in posix. In xShmLock(), one can go from unlocked
25847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to shared and back or from unlocked to exclusive and back. But one may
25848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** not go from shared to exclusive or from exclusive to shared.
25849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int unixShmLock(
25851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *fd, /* Database file holding the shared memory */
25852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst, /* First lock to acquire or release */
25853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n, /* Number of locks to acquire or release */
25854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int flags /* What to do with the lock */
25855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
25856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixFile *pDbFd = (unixFile*)fd; /* Connection holding shared memory */
25857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShm *p = pDbFd->pShm; /* The shared memory being locked */
25858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShm *pX; /* For looping over all siblings */
25859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmNode *pShmNode = p->pShmNode; /* The underlying file iNode */
25860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Result code */
25861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 mask; /* Mask of locks to take or release */
25862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pShmNode==pDbFd->pInode->pShmNode );
25864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pShmNode->pInode==pDbFd->pInode );
25865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK );
25866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( n>=1 );
25867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED)
25868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE)
25869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED)
25870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) );
25871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 );
25872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mask = (1<<(ofst+n)) - (1<<ofst);
25874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( n>1 || mask==(1<<ofst) );
25875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_enter(pShmNode->mutex);
25876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( flags & SQLITE_SHM_UNLOCK ){
25877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 allMask = 0; /* Mask of locks held by siblings */
25878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* See if any siblings hold this same lock */
25880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
25881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pX==p ) continue;
25882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 );
25883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ allMask |= pX->sharedMask;
25884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Unlock the system-level locks */
25887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (mask & allMask)==0 ){
25888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = unixShmSystemLock(pShmNode, F_UNLCK, ofst+UNIX_SHM_BASE, n);
25889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
25890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
25891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Undo the local locks */
25894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
25895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->exclMask &= ~mask;
25896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->sharedMask &= ~mask;
25897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( flags & SQLITE_SHM_SHARED ){
25899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 allShared = 0; /* Union of locks held by connections other than "p" */
25900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Find out which shared locks are already held by sibling connections.
25902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If any sibling already holds an exclusive lock, go ahead and return
25903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_BUSY.
25904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
25906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pX->exclMask & mask)!=0 ){
25907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_BUSY;
25908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
25909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ allShared |= pX->sharedMask;
25911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Get shared locks at the system level, if necessary */
25914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
25915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (allShared & mask)==0 ){
25916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = unixShmSystemLock(pShmNode, F_RDLCK, ofst+UNIX_SHM_BASE, n);
25917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
25918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
25919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Get the local shared locks */
25923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
25924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->sharedMask |= mask;
25925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
25927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Make sure no sibling connections hold locks that will block this
25928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** lock. If any do, return SQLITE_BUSY right away.
25929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
25931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){
25932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_BUSY;
25933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
25934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Get the exclusive locks at the system level. Then if successful
25938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** also mark the local connection as being locked.
25939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
25941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = unixShmSystemLock(pShmNode, F_WRLCK, ofst+UNIX_SHM_BASE, n);
25942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
25943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (p->sharedMask & mask)==0 );
25944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->exclMask |= mask;
25945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_leave(pShmNode->mutex);
25949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n",
25950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->id, getpid(), p->sharedMask, p->exclMask));
25951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
25952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
25955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Implement a memory barrier or memory fence on shared memory.
25956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** All loads and stores begun before the barrier must complete before
25958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** any load or store begun after the barrier.
25959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void unixShmBarrier(
25961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *fd /* Database file holding the shared memory */
25962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
25963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixEnterMutex();
25964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixLeaveMutex();
25965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
25968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called to obtain a pointer to region iRegion of the
25969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** shared-memory associated with the database file fd. Shared-memory regions
25970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are numbered starting from zero. Each shared-memory region is szRegion
25971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bytes in size.
25972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an error occurs, an error code is returned and *pp is set to NULL.
25974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, if the isWrite parameter is 0 and the requested shared-memory
25976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** region has not been allocated (by any client, including one running in a
25977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** separate process), then *pp is set to NULL and SQLITE_OK returned. If
25978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** isWrite is non-zero and the requested shared-memory region has not yet
25979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** been allocated, it is allocated by this function.
25980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
25981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the shared-memory region has already been allocated or is allocated by
25982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this call as described above, then it is mapped into this processes
25983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** address space (if it is not already), *pp is set to point to the mapped
25984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** memory and SQLITE_OK returned.
25985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
25986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int unixShmMap(
25987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *fd, /* Handle open on database file */
25988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iRegion, /* Region to retrieve */
25989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int szRegion, /* Size of regions */
25990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isWrite, /* True to extend file if necessary */
25991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void volatile **pp /* OUT: Mapped memory */
25992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
25993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixFile *pDbFd = (unixFile*)fd;
25994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShm *p = pDbFd->pShm;
25995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmNode *pShmNode = p->pShmNode;
25996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
25997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_enter(pShmNode->mutex);
25999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
26000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode->nRegion<=iRegion ){
26002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **apNew; /* New apRegion[] array */
26003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nByte = (iRegion+1)*szRegion; /* Minimum required file size */
26004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct stat sStat; /* Used by fstat() */
26005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->szRegion = szRegion;
26007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The requested region is not mapped into this processes address space.
26009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Check to see if it has been allocated (i.e. if the wal-index file is
26010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** large enough to contain the requested region).
26011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
26012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fstat(pShmNode->h, &sStat) ){
26013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_IOERR_SHMSIZE;
26014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shmpage_out;
26015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sStat.st_size<nByte ){
26018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The requested memory region does not exist. If isWrite is set to
26019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zero, exit early. *pp will be set to NULL and SQLITE_OK returned.
26020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
26021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Alternatively, if isWrite is non-zero, use ftruncate() to allocate
26022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the requested memory region.
26023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
26024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !isWrite ) goto shmpage_out;
26025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ftruncate(pShmNode->h, nByte) ){
26026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_IOERR_SHMSIZE;
26027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shmpage_out;
26028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Map the requested memory region into this processes address space. */
26032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ apNew = (char **)sqlite3_realloc(
26033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->apRegion, (iRegion+1)*sizeof(char *)
26034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
26035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !apNew ){
26036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_IOERR_NOMEM;
26037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shmpage_out;
26038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->apRegion = apNew;
26040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while(pShmNode->nRegion<=iRegion){
26041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pMem = mmap(0, szRegion, PROT_READ|PROT_WRITE,
26042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MAP_SHARED, pShmNode->h, iRegion*szRegion
26043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
26044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pMem==MAP_FAILED ){
26045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_IOERR;
26046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shmpage_out;
26047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->apRegion[pShmNode->nRegion] = pMem;
26049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->nRegion++;
26050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shmpage_out:
26054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode->nRegion>iRegion ){
26055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp = pShmNode->apRegion[iRegion];
26056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
26057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp = 0;
26058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_leave(pShmNode->mutex);
26060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
26061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
26064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define unixShmOpen 0
26065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define unixShmLock 0
26066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define unixShmMap 0
26067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define unixShmBarrier 0
26068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define unixShmClose 0
26069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* #ifndef SQLITE_OMIT_WAL */
26070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25554 26071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
25555 26072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Here ends the implementation of all sqlite3_file methods.
25556 26073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
25557 26074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
********************** End sqlite3_file Methods *******************************
25558 26075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
******************************************************************************/
@@ -25589,13 +26106,13 @@
25589 26106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** methods CLOSE, LOCK, UNLOCK, CKRESLOCK.
25590 26107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
25591 26108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** * An I/O method finder function called FINDER that returns a pointer
25592 26109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to the METHOD object in the previous bullet.
25593 26110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
25594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define IOMETHODS(FINDER, METHOD, CLOSE, LOCK, UNLOCK, CKLOCK) \
26111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define IOMETHODS(FINDER, METHOD, VERSION, CLOSE, LOCK, UNLOCK, CKLOCK) \
25595 26112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const sqlite3_io_methods METHOD = { \
25596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 1, /* iVersion */ \
26113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ VERSION, /* iVersion */ \
25597 26114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CLOSE, /* xClose */ \
25598 26115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixRead, /* xRead */ \
25599 26116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixWrite, /* xWrite */ \
25600 26117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixTruncate, /* xTruncate */ \
25601 26118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixSync, /* xSync */ \
@@ -25603,11 +26120,16 @@
25603 26120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LOCK, /* xLock */ \
25604 26121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNLOCK, /* xUnlock */ \
25605 26122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CKLOCK, /* xCheckReservedLock */ \
25606 26123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFileControl, /* xFileControl */ \
25607 26124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixSectorSize, /* xSectorSize */ \
25608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unixDeviceCharacteristics /* xDeviceCapabilities */ \
26125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixDeviceCharacteristics, /* xDeviceCapabilities */ \
26126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmOpen, /* xShmOpen */ \
26127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmLock, /* xShmLock */ \
26128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmMap, /* xShmMap */ \
26129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmBarrier, /* xShmBarrier */ \
26130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixShmClose /* xShmClose */ \
25609 26131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}; \
25610 26132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const sqlite3_io_methods *FINDER##Impl(const char *z, unixFile *p){ \
25611 26133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(z); UNUSED_PARAMETER(p); \
25612 26134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return &METHOD; \
25613 26135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} \
@@ -25620,26 +26142,29 @@
25620 26142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** are also created.
25621 26143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
25622 26144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOMETHODS(
25623 26145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
posixIoFinder, /* Finder function name */
25624 26146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
posixIoMethods, /* sqlite3_io_methods object name */
26147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 2, /* ShmOpen is enabled */
25625 26148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixClose, /* xClose method */
25626 26149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLock, /* xLock method */
25627 26150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixUnlock, /* xUnlock method */
25628 26151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixCheckReservedLock /* xCheckReservedLock method */
25629 26152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
25630 26153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOMETHODS(
25631 26154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nolockIoFinder, /* Finder function name */
25632 26155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nolockIoMethods, /* sqlite3_io_methods object name */
26156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1, /* ShmOpen is disabled */
25633 26157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nolockClose, /* xClose method */
25634 26158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nolockLock, /* xLock method */
25635 26159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nolockUnlock, /* xUnlock method */
25636 26160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nolockCheckReservedLock /* xCheckReservedLock method */
25637 26161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
25638 26162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOMETHODS(
25639 26163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dotlockIoFinder, /* Finder function name */
25640 26164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dotlockIoMethods, /* sqlite3_io_methods object name */
26165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1, /* ShmOpen is disabled */
25641 26166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dotlockClose, /* xClose method */
25642 26167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dotlockLock, /* xLock method */
25643 26168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dotlockUnlock, /* xUnlock method */
25644 26169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dotlockCheckReservedLock /* xCheckReservedLock method */
25645 26170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
@@ -25646,10 +26171,11 @@
25646 26171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25647 26172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS
25648 26173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOMETHODS(
25649 26174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flockIoFinder, /* Finder function name */
25650 26175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flockIoMethods, /* sqlite3_io_methods object name */
26176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1, /* ShmOpen is disabled */
25651 26177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flockClose, /* xClose method */
25652 26178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flockLock, /* xLock method */
25653 26179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flockUnlock, /* xUnlock method */
25654 26180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flockCheckReservedLock /* xCheckReservedLock method */
25655 26181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
@@ -25657,10 +26183,11 @@
25657 26183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25658 26184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if OS_VXWORKS
25659 26185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOMETHODS(
25660 26186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
semIoFinder, /* Finder function name */
25661 26187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
semIoMethods, /* sqlite3_io_methods object name */
26188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1, /* ShmOpen is disabled */
25662 26189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
semClose, /* xClose method */
25663 26190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
semLock, /* xLock method */
25664 26191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
semUnlock, /* xUnlock method */
25665 26192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
semCheckReservedLock /* xCheckReservedLock method */
25666 26193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
@@ -25668,10 +26195,11 @@
25668 26195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25669 26196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
25670 26197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOMETHODS(
25671 26198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpIoFinder, /* Finder function name */
25672 26199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpIoMethods, /* sqlite3_io_methods object name */
26200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1, /* ShmOpen is disabled */
25673 26201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpClose, /* xClose method */
25674 26202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpLock, /* xLock method */
25675 26203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpUnlock, /* xUnlock method */
25676 26204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpCheckReservedLock /* xCheckReservedLock method */
25677 26205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
@@ -25692,10 +26220,11 @@
25692 26220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int proxyUnlock(sqlite3_file*, int);
25693 26221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int proxyCheckReservedLock(sqlite3_file*, int*);
25694 26222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOMETHODS(
25695 26223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyIoFinder, /* Finder function name */
25696 26224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyIoMethods, /* sqlite3_io_methods object name */
26225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1, /* ShmOpen is disabled */
25697 26226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyClose, /* xClose method */
25698 26227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyLock, /* xLock method */
25699 26228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyUnlock, /* xUnlock method */
25700 26229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyCheckReservedLock /* xCheckReservedLock method */
25701 26230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
@@ -25704,10 +26233,11 @@
25704 26233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* nfs lockd on OSX 10.3+ doesn't clear write locks when a read lock is set */
25705 26234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
25706 26235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOMETHODS(
25707 26236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nfsIoFinder, /* Finder function name */
25708 26237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nfsIoMethods, /* sqlite3_io_methods object name */
26238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1, /* ShmOpen is disabled */
25709 26239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixClose, /* xClose method */
25710 26240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLock, /* xLock method */
25711 26241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nfsUnlock, /* xUnlock method */
25712 26242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixCheckReservedLock /* xCheckReservedLock method */
25713 26243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
@@ -25844,23 +26374,23 @@
25844 26374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
25845 26375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const sqlite3_io_methods *pLockingStyle;
25846 26376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pNew = (unixFile *)pId;
25847 26377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
25848 26378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pNew->pLock==NULL );
25850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pNew->pOpen==NULL );
26379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pNew->pInode==NULL );
25851 26380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25852 26381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Parameter isDelete is only used on vxworks. Express this explicitly
25853 26382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** here to prevent compiler warnings about unused parameters.
25854 26383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
25855 26384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(isDelete);
25856 26385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("OPEN %-3d %s\n", h, zFilename);
26386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("OPEN %-3d %s\n", h, zFilename));
25858 26387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->h = h;
25859 26388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->dirfd = dirfd;
25860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SET_THREADID(pNew);
25861 26389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->fileFlags = 0;
26390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( zFilename==0 || zFilename[0]=='/' ); /* Never a relative pathname */
26391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNew->zPath = zFilename;
25862 26392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25863 26393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if OS_VXWORKS
25864 26394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->pId = vxworksFindFileId(zFilename);
25865 26395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pNew->pId==0 ){
25866 26396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
noLock = 1;
@@ -25884,23 +26414,23 @@
25884 26414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
25885 26415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| pLockingStyle == &nfsIoMethods
25886 26416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
25887 26417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
25888 26418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
25889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = findLockInfo(pNew, &pNew->pLock, &pNew->pOpen);
26419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = findInodeInfo(pNew, &pNew->pInode);
25890 26420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
25891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If an error occured in findLockInfo(), close the file descriptor
25892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** immediately, before releasing the mutex. findLockInfo() may fail
26421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If an error occured in findInodeInfo(), close the file descriptor
26422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** immediately, before releasing the mutex. findInodeInfo() may fail
25893 26423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in two scenarios:
25894 26424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
25895 26425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (a) A call to fstat() failed.
25896 26426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (b) A malloc failed.
25897 26427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
25898 26428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Scenario (b) may only occur if the process is holding no other
25899 26429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file descriptors open on the same file. If there were other file
25900 26430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** descriptors on this file, then no malloc would be required by
25901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** findLockInfo(). If this is the case, it is quite safe to close
26431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** findInodeInfo(). If this is the case, it is quite safe to close
25902 26432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** handle h - as it is guaranteed that no posix locks will be released
25903 26433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by doing so.
25904 26434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
25905 26435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If scenario (a) caused the error then things are not so safe. The
25906 26436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** implicit assumption here is that if fstat() fails, things are in
@@ -25927,11 +26457,11 @@
25927 26457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** copy of the filename. */
25928 26458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCtx->dbPath = zFilename;
25929 26459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCtx->reserved = 0;
25930 26460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
srandomdev();
25931 26461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
25932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = findLockInfo(pNew, &pNew->pLock, &pNew->pOpen);
26462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = findInodeInfo(pNew, &pNew->pInode);
25933 26463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
25934 26464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pNew->lockingContext);
25935 26465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
close(h);
25936 26466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
h = -1;
25937 26467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -25960,22 +26490,22 @@
25960 26490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else if( pLockingStyle == &semIoMethods ){
25961 26491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Named semaphore locking uses the file path so it needs to be
25962 26492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** included in the semLockingContext
25963 26493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
25964 26494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
25965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = findLockInfo(pNew, &pNew->pLock, &pNew->pOpen);
25966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (rc==SQLITE_OK) && (pNew->pOpen->pSem==NULL) ){
25967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zSemName = pNew->pOpen->aSemName;
26495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = findInodeInfo(pNew, &pNew->pInode);
26496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (rc==SQLITE_OK) && (pNew->pInode->pSem==NULL) ){
26497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zSemName = pNew->pInode->aSemName;
25968 26498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n;
25969 26499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem",
25970 26500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->pId->zCanonicalName);
25971 26501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for( n=1; zSemName[n]; n++ )
25972 26502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zSemName[n]=='/' ) zSemName[n] = '_';
25973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pNew->pOpen->pSem = sem_open(zSemName, O_CREAT, 0666, 1);
25974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pNew->pOpen->pSem == SEM_FAILED ){
26503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNew->pInode->pSem = sem_open(zSemName, O_CREAT, 0666, 1);
26504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pNew->pInode->pSem == SEM_FAILED ){
25975 26505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_NOMEM;
25976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pNew->pOpen->aSemName[0] = '\0';
26506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNew->pInode->aSemName[0] = '\0';
25977 26507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25978 26508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25979 26509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
25980 26510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
25981 26511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
@@ -26022,58 +26552,75 @@
26022 26552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fd = open(zDirname, O_RDONLY|O_BINARY, 0);
26023 26553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fd>=0 ){
26024 26554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef FD_CLOEXEC
26025 26555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fcntl(fd, F_SETFD, fcntl(fd, F_GETFD, 0) | FD_CLOEXEC);
26026 26556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
26027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("OPENDIR %-3d %s\n", fd, zDirname);
26557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname));
26028 26558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26029 26559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26030 26560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pFd = fd;
26031 26561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return (fd>=0?SQLITE_OK:SQLITE_CANTOPEN_BKPT);
26032 26562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26033 26563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26034 26564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
26035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Create a temporary file name in zBuf. zBuf must be allocated
26036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** by the calling process and must be big enough to hold at least
26037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** pVfs->mxPathname bytes.
26565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the name of a directory in which to put temporary files.
26566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If no suitable temporary file directory can be found, return NULL.
26038 26567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
26039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int getTempname(int nBuf, char *zBuf){
26568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *unixTempFileDir(int allowShm){
26040 26569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const char *azDirs[] = {
26041 26570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0,
26042 26571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0,
26043 26572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"/var/tmp",
26044 26573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"/usr/tmp",
26045 26574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"/tmp",
26046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ".",
26575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0 /* List terminator */
26047 26576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
26577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int i;
26578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct stat buf;
26579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zDir = 0;
26580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azDirs[0] = sqlite3_temp_directory;
26582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR");
26583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( allowShm ){
26585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDir = "/dev/shm";
26586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = 2; /* Skip the app-defined temp locations for shared-memory */
26587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
26588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDir = azDirs[0];
26589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = 1;
26590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(; i<sizeof(azDirs)/sizeof(azDirs[0]); zDir=azDirs[i++]){
26592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zDir==0 ) continue;
26593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( stat(zDir, &buf) ) continue;
26594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !S_ISDIR(buf.st_mode) ) continue;
26595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !allowShm && access(zDir, 07) ) continue;
26596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
26597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return zDir;
26599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
26602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Create a temporary file name in zBuf. zBuf must be allocated
26603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by the calling process and must be big enough to hold at least
26604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pVfs->mxPathname bytes.
26605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
26606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int unixGetTempname(int nBuf, char *zBuf){
26048 26607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const unsigned char zChars[] =
26049 26608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"abcdefghijklmnopqrstuvwxyz"
26050 26609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
26051 26610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"0123456789";
26052 26611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int i, j;
26053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct stat buf;
26054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zDir = ".";
26612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zDir;
26055 26613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26056 26614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* It's odd to simulate an io-error here, but really this is just
26057 26615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** using the io-error infrastructure to test that SQLite handles this
26058 26616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** function failing.
26059 26617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
26060 26618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( return SQLITE_IOERR );
26061 26619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- azDirs[0] = sqlite3_temp_directory;
26063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (NULL == azDirs[1]) {
26064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- azDirs[1] = getenv("TMPDIR");
26065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
26066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
26067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); i++){
26068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( azDirs[i]==0 ) continue;
26069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( stat(azDirs[i], &buf) ) continue;
26070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !S_ISDIR(buf.st_mode) ) continue;
26071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( access(azDirs[i], 07) ) continue;
26072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zDir = azDirs[i];
26073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
26074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
26620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDir = unixTempFileDir(0);
26621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zDir==0 ) zDir = ".";
26075 26622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26076 26623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check that the output buffer is large enough for the temporary file
26077 26624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** name. If it is not, return SQLITE_ERROR.
26078 26625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
26079 26626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (strlen(zDir) + strlen(SQLITE_TEMP_FILE_PREFIX) + 17) >= (size_t)nBuf ){
@@ -26135,21 +26682,21 @@
26135 26682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** descriptor on the same path, fail, and return an error to SQLite.
26136 26683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
26137 26684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Even if a subsequent open() call does succeed, the consequences of
26138 26685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** not searching for a resusable file descriptor are not dire. */
26139 26686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( 0==stat(zPath, &sStat) ){
26140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct unixOpenCnt *pOpen;
26687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixInodeInfo *pInode;
26141 26688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26142 26689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
26143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen = openList;
26144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( pOpen && (pOpen->fileId.dev!=sStat.st_dev
26145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || pOpen->fileId.ino!=sStat.st_ino) ){
26146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOpen = pOpen->pNext;
26690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode = inodeList;
26691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pInode && (pInode->fileId.dev!=sStat.st_dev
26692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || pInode->fileId.ino!=sStat.st_ino) ){
26693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInode = pInode->pNext;
26147 26694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pOpen ){
26695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInode ){
26149 26696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnixUnusedFd **pp;
26150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(pp=&pOpen->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext));
26697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext));
26151 26698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pUnused = *pp;
26152 26699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pUnused ){
26153 26700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pp = pUnused->pNext;
26154 26701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26155 26702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -26259,11 +26806,11 @@
26259 26806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26260 26807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pUnused = pUnused;
26261 26808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( !zName ){
26262 26809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If zName is NULL, the upper layer is requesting a temp file. */
26263 26810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert(isDelete && !isOpenDirectory);
26264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = getTempname(MAX_PATHNAME+1, zTmpname);
26811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = unixGetTempname(MAX_PATHNAME+1, zTmpname);
26265 26812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
26266 26813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
26267 26814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26268 26815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zName = zTmpname;
26269 26816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -26279,11 +26826,11 @@
26279 26826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
openFlags |= (O_LARGEFILE|O_BINARY);
26280 26827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26281 26828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fd<0 ){
26282 26829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mode_t openMode = (isDelete?0600:SQLITE_DEFAULT_FILE_PERMISSIONS);
26283 26830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fd = open(zName, openFlags, openMode);
26284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("OPENX %-3d %s 0%o\n", fd, zName, openFlags);
26831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("OPENX %-3d %s 0%o\n", fd, zName, openFlags));
26285 26832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fd<0 && errno!=EISDIR && isReadWrite && !isExclusive ){
26286 26833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Failed to open the file for read/write access. Try read-only. */
26287 26834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
26288 26835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
openFlags &= ~(O_RDWR|O_CREAT);
26289 26836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= SQLITE_OPEN_READONLY;
@@ -26663,41 +27210,54 @@
26663 27210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3OsCurrentTime() during testing.
26664 27211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
26665 27212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_TEST
26666 27213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */
26667 27214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
27215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
27216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
27217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Find the current time (in Universal Coordinated Time). Write into *piNow
27218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the current time and date as a Julian Day number times 86_400_000. In
27219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** other words, write into *piNow the number of milliseconds since the Julian
27220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** epoch of noon in Greenwich on November 24, 4714 B.C according to the
27221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** proleptic Gregorian calendar.
27222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
27223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On success, return 0. Return 1 if the time and date cannot be found.
27224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
27225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){
27226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000;
27227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(NO_GETTOD)
27228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ time_t t;
27229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ time(&t);
27230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piNow = ((sqlite3_int64)i)*1000 + unixEpoch;
27231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #elif OS_VXWORKS
27232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct timespec sNow;
27233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ clock_gettime(CLOCK_REALTIME, &sNow);
27234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000;
27235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
27236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct timeval sNow;
27237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ gettimeofday(&sNow, 0);
27238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000;
27239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
27240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
27241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_TEST
27242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3_current_time ){
27243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch;
27244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
27245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
27246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UNUSED_PARAMETER(NotUsed);
27247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
27248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26668 27249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26669 27250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
26670 27251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Find the current time (in Universal Coordinated Time). Write the
26671 27252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** current time and date as a Julian Day number into *prNow and
26672 27253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** return 0. Return 1 if the time and date cannot be found.
26673 27254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
26674 27255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){
26675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if defined(SQLITE_OMIT_FLOATING_POINT)
26676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- time_t t;
26677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- time(&t);
26678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *prNow = (((sqlite3_int64)t)/8640 + 24405875)/10;
26679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #elif defined(NO_GETTOD)
26680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- time_t t;
26681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- time(&t);
26682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *prNow = t/86400.0 + 2440587.5;
26683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #elif OS_VXWORKS
26684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct timespec sNow;
26685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- clock_gettime(CLOCK_REALTIME, &sNow);
26686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *prNow = 2440587.5 + sNow.tv_sec/86400.0 + sNow.tv_nsec/86400000000000.0;
26687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
26688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct timeval sNow;
26689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- gettimeofday(&sNow, 0);
26690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *prNow = 2440587.5 + sNow.tv_sec/86400.0 + sNow.tv_usec/86400000000.0;
26691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
26692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
26693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_TEST
26694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3_current_time ){
26695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *prNow = sqlite3_current_time/86400.0 + 2440587.5;
26696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
26697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
26698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UNUSED_PARAMETER(NotUsed);
27256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 i;
27257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixCurrentTimeInt64(0, &i);
27258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *prNow = i/86400000.0;
26699 27259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
26700 27260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26701 27261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26702 27262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
26703 27263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** We added the xGetLastError() method with the intention of providing
@@ -26710,10 +27270,11 @@
26710 27270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(NotUsed);
26711 27271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(NotUsed2);
26712 27272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(NotUsed3);
26713 27273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
26714 27274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26715 27276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26716 27277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
26717 27278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
************************ End of sqlite3_vfs methods ***************************
26718 27279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
******************************************************************************/
26719 27280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -26901,12 +27462,12 @@
26901 27462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
len = strlcpy(lPath, LOCKPROXYDIR, maxLen);
26902 27463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
26903 27464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# ifdef _CS_DARWIN_USER_TEMP_DIR
26904 27465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{
26905 27466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !confstr(_CS_DARWIN_USER_TEMP_DIR, lPath, maxLen) ){
26906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("GETLOCKPATH failed %s errno=%d pid=%d\n",
26907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lPath, errno, getpid());
27467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("GETLOCKPATH failed %s errno=%d pid=%d\n",
27468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lPath, errno, getpid()));
26908 27469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_IOERR_LOCK;
26909 27470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26910 27471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
len = strlcat(lPath, "sqliteplocks", maxLen);
26911 27472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26912 27473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# else
@@ -26924,11 +27485,11 @@
26924 27485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char c = dbPath[i];
26925 27486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lPath[i+len] = (c=='/')?'_':c;
26926 27487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26927 27488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lPath[i+len]='\0';
26928 27489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
strlcat(lPath, ":auto:", maxLen);
26929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("GETLOCKPATH proxy lock path=%s pid=%d\n", lPath, getpid());
27490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("GETLOCKPATH proxy lock path=%s pid=%d\n", lPath, getpid()));
26930 27491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
26931 27492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26932 27493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26933 27494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
26934 27495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Creates the lock file and any missing directories in lockPath
@@ -26949,22 +27510,22 @@
26949 27510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| (i-start==2 && buf[start] != '.' && buf[start+1] != '.') ){
26950 27511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
buf[i]='\0';
26951 27512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( mkdir(buf, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){
26952 27513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int err=errno;
26953 27514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( err!=EEXIST ) {
26954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE5("CREATELOCKPATH FAILED creating %s, "
27515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("CREATELOCKPATH FAILED creating %s, "
26955 27516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"'%s' proxy lock path=%s pid=%d\n",
26956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- buf, strerror(err), lockPath, getpid());
27517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ buf, strerror(err), lockPath, getpid()));
26957 27518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return err;
26958 27519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26959 27520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26960 27521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26961 27522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
start=i+1;
26962 27523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26963 27524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
buf[i] = lockPath[i];
26964 27525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("CREATELOCKPATH proxy lock path=%s pid=%d\n", lockPath, getpid());
27526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n", lockPath, getpid()));
26966 27527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
26967 27528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26968 27529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26969 27530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
26970 27531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Create a new VFS file descriptor (stored in memory obtained from
@@ -27252,12 +27813,12 @@
27252 27813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int hostIdMatch = 0;
27253 27814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int readLen = 0;
27254 27815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int tryOldLockPath = 0;
27255 27816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int forceNewLockPath = 0;
27256 27817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("TAKECONCH %d for %s pid=%d\n", conchFile->h,
27258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), getpid());
27818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TAKECONCH %d for %s pid=%d\n", conchFile->h,
27819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), getpid()));
27259 27820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27260 27821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = proxyGetHostID(myHostID, &pError);
27261 27822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (rc&0xff)==SQLITE_IOERR ){
27262 27823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = pError;
27263 27824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto end_takeconch;
@@ -27333,11 +27894,11 @@
27333 27894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** has a shared lock already), if the host id matches, use the big
27334 27895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** stick.
27335 27896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
27336 27897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
futimes(conchFile->h, NULL);
27337 27898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( hostIdMatch && !createConch ){
27338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( conchFile->pLock && conchFile->pLock->cnt>1 ){
27899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( conchFile->pInode && conchFile->pInode->nShared>1 ){
27339 27900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* We are trying for an exclusive lock but another thread in this
27340 27901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** same process is still holding a shared lock. */
27341 27902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
27342 27903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
27343 27904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK);
@@ -27389,11 +27950,11 @@
27389 27950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27390 27951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27391 27952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, SHARED_LOCK);
27392 27953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27393 27954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
end_takeconch:
27394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2("TRANSPROXY: CLOSE %d\n", pFile->h);
27955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TRANSPROXY: CLOSE %d\n", pFile->h));
27395 27956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK && pFile->openFlags ){
27396 27957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->h>=0 ){
27397 27958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef STRICT_CLOSE_ERROR
27398 27959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( close(pFile->h) ){
27399 27960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = errno;
@@ -27404,11 +27965,11 @@
27404 27965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
27405 27966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27406 27967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->h = -1;
27407 27968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fd = open(pCtx->dbPath, pFile->openFlags,
27408 27969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_DEFAULT_FILE_PERMISSIONS);
27409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2("TRANSPROXY: OPEN %d\n", fd);
27970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TRANSPROXY: OPEN %d\n", fd));
27410 27971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fd>=0 ){
27411 27972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->h = fd;
27412 27973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
27413 27974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc=SQLITE_CANTOPEN_BKPT; /* SQLITE_BUSY? proxyTakeConch called
27414 27975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
during locking */
@@ -27446,35 +28007,37 @@
27446 28007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afpCtx->dbPath = pCtx->lockProxyPath;
27447 28008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27448 28009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
27449 28010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK);
27450 28011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("TAKECONCH %d %s\n", conchFile->h, rc==SQLITE_OK?"ok":"failed");
28012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TAKECONCH %d %s\n", conchFile->h,
28013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc==SQLITE_OK?"ok":"failed"));
27452 28014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
27453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } while (1); /* in case we need to retry the :auto: lock file - we should never get here except via the 'continue' call. */
28015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } while (1); /* in case we need to retry the :auto: lock file -
28016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** we should never get here except via the 'continue' call. */
27454 28017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27455 28018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27456 28019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27457 28020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
27458 28021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If pFile holds a lock on a conch file, then release that lock.
27459 28022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
27460 28023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int proxyReleaseConch(unixFile *pFile){
27461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc; /* Subroutine return code */
28024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Subroutine return code */
27462 28025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyLockingContext *pCtx; /* The locking context for the proxy lock */
27463 28026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *conchFile; /* Name of the conch file */
27464 28027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27465 28028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCtx = (proxyLockingContext *)pFile->lockingContext;
27466 28029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
conchFile = pCtx->conchFile;
27467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("RELEASECONCH %d for %s pid=%d\n", conchFile->h,
28030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("RELEASECONCH %d for %s pid=%d\n", conchFile->h,
27468 28031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"),
27469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- getpid());
28032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ getpid()));
27470 28033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCtx->conchHeld>0 ){
27471 28034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK);
27472 28035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27473 28036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCtx->conchHeld = 0;
27474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("RELEASECONCH %d %s\n", conchFile->h,
27475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (rc==SQLITE_OK ? "ok" : "failed"));
28037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("RELEASECONCH %d %s\n", conchFile->h,
28038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (rc==SQLITE_OK ? "ok" : "failed")));
27476 28039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
27477 28040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27478 28041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27479 28042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
27480 28043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Given the name of a database file, compute the name of its conch file.
@@ -27527,11 +28090,11 @@
27527 28090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int switchLockProxyPath(unixFile *pFile, const char *path) {
27528 28091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext;
27529 28092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *oldPath = pCtx->lockProxyPath;
27530 28093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
27531 28094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype!=NO_LOCK ){
28095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock!=NO_LOCK ){
27533 28096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_BUSY;
27534 28097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27535 28098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27536 28099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* nothing to do if the path is NULL, :auto: or matches the existing path */
27537 28100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !path || path[0]=='\0' || !strcmp(path, ":auto:") ||
@@ -27594,22 +28157,22 @@
27594 28157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyLockingContext *pCtx;
27595 28158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char dbPath[MAXPATHLEN+1]; /* Name of the database file */
27596 28159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *lockPath=NULL;
27597 28160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
27598 28161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->locktype!=NO_LOCK ){
28162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->eFileLock!=NO_LOCK ){
27600 28163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_BUSY;
27601 28164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27602 28165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyGetDbPathForUnixFile(pFile, dbPath);
27603 28166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !path || path[0]=='\0' || !strcmp(path, ":auto:") ){
27604 28167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lockPath=NULL;
27605 28168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
27606 28169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lockPath=(char *)path;
27607 28170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27608 28171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("TRANSPROXY %d for %s pid=%d\n", pFile->h,
27610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (lockPath ? lockPath : ":auto:"), getpid());
28172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h,
28173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (lockPath ? lockPath : ":auto:"), getpid()));
27611 28174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27612 28175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCtx = sqlite3_malloc( sizeof(*pCtx) );
27613 28176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCtx==0 ){
27614 28177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
27615 28178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -27665,12 +28228,12 @@
27665 28228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27666 28229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pCtx->lockProxyPath);
27667 28230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pCtx->conchFilePath);
27668 28231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pCtx);
27669 28232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("TRANSPROXY %d %s\n", pFile->h,
27671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (rc==SQLITE_OK ? "ok" : "failed"));
28233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TRANSPROXY %d %s\n", pFile->h,
28234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (rc==SQLITE_OK ? "ok" : "failed")));
27672 28235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
27673 28236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27674 28237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27675 28238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27676 28239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -27761,11 +28324,11 @@
27761 28324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27762 28325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
27763 28326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27764 28327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27765 28328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
27766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lock the file with the lock specified by parameter locktype - one
28329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lock the file with the lock specified by parameter eFileLock - one
27767 28330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of the following:
27768 28331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
27769 28332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) SHARED_LOCK
27770 28333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) RESERVED_LOCK
27771 28334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (3) PENDING_LOCK
@@ -27784,43 +28347,43 @@
27784 28347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PENDING -> EXCLUSIVE
27785 28348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
27786 28349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine will only increase a lock. Use the sqlite3OsUnlock()
27787 28350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** routine to lower a locking level.
27788 28351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
27789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int proxyLock(sqlite3_file *id, int locktype) {
28352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int proxyLock(sqlite3_file *id, int eFileLock) {
27790 28353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
27791 28354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = proxyTakeConch(pFile);
27792 28355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
27793 28356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
27794 28357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCtx->conchHeld>0 ){
27795 28358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *proxy = pCtx->lockProxy;
27796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = proxy->pMethod->xLock((sqlite3_file*)proxy, locktype);
27797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = proxy->locktype;
28359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = proxy->pMethod->xLock((sqlite3_file*)proxy, eFileLock);
28360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = proxy->eFileLock;
27798 28361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
27799 28362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* conchHeld < 0 is lockless */
27800 28363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27801 28364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27802 28365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
27803 28366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27804 28367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27805 28368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27806 28369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
27807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Lower the locking level on file descriptor pFile to locktype. locktype
28370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
27808 28371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** must be either NO_LOCK or SHARED_LOCK.
27809 28372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
27810 28373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the locking level of the file descriptor is already at or below
27811 28374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the requested locking level, this routine is a no-op.
27812 28375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
27813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int proxyUnlock(sqlite3_file *id, int locktype) {
28376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int proxyUnlock(sqlite3_file *id, int eFileLock) {
27814 28377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
27815 28378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = proxyTakeConch(pFile);
27816 28379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
27817 28380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
27818 28381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCtx->conchHeld>0 ){
27819 28382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *proxy = pCtx->lockProxy;
27820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = proxy->pMethod->xUnlock((sqlite3_file*)proxy, locktype);
27821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype = proxy->locktype;
28383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = proxy->pMethod->xUnlock((sqlite3_file*)proxy, eFileLock);
28384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->eFileLock = proxy->eFileLock;
27822 28385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
27823 28386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* conchHeld < 0 is lockless */
27824 28387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27825 28388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27826 28389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
@@ -27911,11 +28474,11 @@
27911 28474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** more than that; it looks at the filesystem type that hosts the
27912 28475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** database file and tries to choose an locking method appropriate for
27913 28476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that filesystem time.
27914 28477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
27915 28478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define UNIXVFS(VFSNAME, FINDER) { \
27916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 1, /* iVersion */ \
28479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 2, /* iVersion */ \
27917 28480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sizeof(unixFile), /* szOsFile */ \
27918 28481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
MAX_PATHNAME, /* mxPathname */ \
27919 28482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* pNext */ \
27920 28483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VFSNAME, /* zName */ \
27921 28484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(void*)&FINDER, /* pAppData */ \
@@ -27928,11 +28491,13 @@
27928 28491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixDlSym, /* xDlSym */ \
27929 28492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixDlClose, /* xDlClose */ \
27930 28493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixRandomness, /* xRandomness */ \
27931 28494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixSleep, /* xSleep */ \
27932 28495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixCurrentTime, /* xCurrentTime */ \
27933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unixGetLastError /* xGetLastError */ \
28496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixGetLastError, /* xGetLastError */ \
28497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* xRename */ \
28498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixCurrentTimeInt64, /* xCurrentTimeInt64 */ \
27934 28499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27935 28500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27936 28501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
27937 28502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** All default VFSes for unix are contained in the following array.
27938 28503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -28079,27 +28644,13 @@
28079 28644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
28080 28645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
28081 28646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28082 28647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
28083 28648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OSTrace = 0;
28084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE1(X) if( sqlite3OSTrace ) sqlite3DebugPrintf(X)
28085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE2(X,Y) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y)
28086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE3(X,Y,Z) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z)
28087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE4(X,Y,Z,A) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z,A)
28088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE5(X,Y,Z,A,B) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z,A,B)
28089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE6(X,Y,Z,A,B,C) \
28090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(sqlite3OSTrace) sqlite3DebugPrintf(X,Y,Z,A,B,C)
28091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE7(X,Y,Z,A,B,C,D) \
28092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(sqlite3OSTrace) sqlite3DebugPrintf(X,Y,Z,A,B,C,D)
28649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
28093 28650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
28094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE1(X)
28095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE2(X,Y)
28096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE3(X,Y,Z)
28097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE4(X,Y,Z,A)
28098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE5(X,Y,Z,A,B)
28099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE6(X,Y,Z,A,B,C)
28100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE7(X,Y,Z,A,B,C,D)
28651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define OSTRACE(X)
28101 28652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
28102 28653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28103 28654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
28104 28655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Macros for performance tracing. Normally turned off. Only works
28105 28656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** on i486 hardware.
@@ -28281,10 +28832,14 @@
28281 28832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE
28282 28833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define AreFileApisANSI() 1
28283 28834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define FormatMessageW(a,b,c,d,e,f,g) 0
28284 28835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
28285 28836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Forward references */
28838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct winShm winShm; /* A connection to shared-memory */
28839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct winShmNode winShmNode; /* A region of shared-memory */
28840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
28286 28841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
28287 28842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** WinCE lacks native support for file locking so we have to fake it
28288 28843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** with some code of our own.
28289 28844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
28290 28845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE
@@ -28300,16 +28855,19 @@
28300 28855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The winFile structure is a subclass of sqlite3_file* specific to the win32
28301 28856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** portability layer.
28302 28857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
28303 28858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct winFile winFile;
28304 28859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct winFile {
28305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const sqlite3_io_methods *pMethod;/* Must be first */
28860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const sqlite3_io_methods *pMethod; /*** Must be first ***/
28861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_vfs *pVfs; /* The VFS used to open this file */
28306 28862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HANDLE h; /* Handle for accessing the file */
28307 28863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned char locktype; /* Type of lock currently held on this file */
28308 28864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
short sharedLockByte; /* Randomly chosen byte used as a shared lock */
28309 28865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD lastErrno; /* The Windows errno from the last I/O error */
28310 28866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD sectorSize; /* Sector size of the device file is on */
28867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShm *pShm; /* Instance of shared memory on this file */
28868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zPath; /* Full pathname of this file */
28311 28869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE
28312 28870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WCHAR *zDeleteOnClose; /* Name of file to delete when closing */
28313 28871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HANDLE hMutex; /* Mutex used to control access to shared lock */
28314 28872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HANDLE hShared; /* Shared memory segment used for locking */
28315 28873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winceLock local; /* Locks obtained by this instance of winFile */
@@ -28833,11 +29391,12 @@
28833 29391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int winClose(sqlite3_file *id){
28834 29392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc, cnt = 0;
28835 29393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winFile *pFile = (winFile*)id;
28836 29394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28837 29395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
28838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2("CLOSE %d\n", pFile->h);
29396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pFile->pShm==0 );
29397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("CLOSE %d\n", pFile->h));
28839 29398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
do{
28840 29399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = CloseHandle(pFile->h);
28841 29400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (Sleep(100), 1) );
28842 29401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE
28843 29402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WINCE_DELETION_ATTEMPTS 3
@@ -28852,10 +29411,11 @@
28852 29411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Sleep(100); /* Wait a little before trying again */
28853 29412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
28854 29413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(pFile->zDeleteOnClose);
28855 29414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
28856 29415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
29416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("CLOSE %d %s\n", pFile->h, rc ? "ok" : "failed"));
28857 29417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
OpenCounter(-1);
28858 29418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc ? SQLITE_OK : SQLITE_IOERR;
28859 29419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
28860 29420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28861 29421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -28883,11 +29443,11 @@
28883 29443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD error;
28884 29444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD got;
28885 29445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28886 29446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
28887 29447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError(return SQLITE_IOERR_READ);
28888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("READ %d lock=%d\n", pFile->h, pFile->locktype);
29448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("READ %d lock=%d\n", pFile->h, pFile->locktype));
28889 29449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
28890 29450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==INVALID_SET_FILE_POINTER && (error=GetLastError())!=NO_ERROR ){
28891 29451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = error;
28892 29452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_FULL;
28893 29453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -28922,11 +29482,11 @@
28922 29482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD wrote = 0;
28923 29483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28924 29484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
28925 29485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError(return SQLITE_IOERR_WRITE);
28926 29486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateDiskfullError(return SQLITE_FULL);
28927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("WRITE %d lock=%d\n", pFile->h, pFile->locktype);
29487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("WRITE %d lock=%d\n", pFile->h, pFile->locktype));
28928 29488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
28929 29489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==INVALID_SET_FILE_POINTER && (error=GetLastError())!=NO_ERROR ){
28930 29490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = error;
28931 29491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_FULL;
28932 29492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -28950,28 +29510,29 @@
28950 29510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Truncate an open file to a specified size
28951 29511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
28952 29512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){
28953 29513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LONG upperBits = (LONG)((nByte>>32) & 0x7fffffff);
28954 29514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LONG lowerBits = (LONG)(nByte & 0xffffffff);
28955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DWORD rc;
29515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DWORD dwRet;
28956 29516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winFile *pFile = (winFile*)id;
28957 29517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD error;
29518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
28958 29519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28959 29520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
28960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("TRUNCATE %d %lld\n", pFile->h, nByte);
29521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TRUNCATE %d %lld\n", pFile->h, nByte));
28961 29522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError(return SQLITE_IOERR_TRUNCATE);
28962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
28963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==INVALID_SET_FILE_POINTER && (error=GetLastError())!=NO_ERROR ){
29523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwRet = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
29524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( dwRet==INVALID_SET_FILE_POINTER && (error=GetLastError())!=NO_ERROR ){
28964 29525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = error;
28965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_IOERR_TRUNCATE;
28966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
29526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_IOERR_TRUNCATE;
28967 29527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SetEndOfFile will fail if nByte is negative */
28968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !SetEndOfFile(pFile->h) ){
29528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( !SetEndOfFile(pFile->h) ){
28969 29529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = GetLastError();
28970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_IOERR_TRUNCATE;
29530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_IOERR_TRUNCATE;
28971 29531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
28972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
29532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TRUNCATE %d %lld %s\n", pFile->h, nByte, rc==SQLITE_OK ? "ok" : "failed"));
29533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
28973 29534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
28974 29535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28975 29536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_TEST
28976 29537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
28977 29538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Count the number of fullsyncs and normal syncs. This is used to test
@@ -28987,11 +29548,11 @@
28987 29548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int winSync(sqlite3_file *id, int flags){
28988 29549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_NO_SYNC
28989 29550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winFile *pFile = (winFile*)id;
28990 29551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28991 29552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
28992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("SYNC %d lock=%d\n", pFile->h, pFile->locktype);
29553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("SYNC %d lock=%d\n", pFile->h, pFile->locktype));
28993 29554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
28994 29555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(id);
28995 29556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
28996 29557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_TEST
28997 29558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(flags);
@@ -29128,12 +29689,12 @@
29128 29689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */
29129 29690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winFile *pFile = (winFile*)id;
29130 29691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD error = NO_ERROR;
29131 29692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29132 29693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
29133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE5("LOCK %d %d was %d(%d)\n",
29134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->h, locktype, pFile->locktype, pFile->sharedLockByte);
29694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("LOCK %d %d was %d(%d)\n",
29695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->h, locktype, pFile->locktype, pFile->sharedLockByte));
29135 29696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29136 29697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there is already a lock of this type or more restrictive on the
29137 29698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** OsFile, do nothing. Don't use the end_lock: exit path, as
29138 29699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3OsEnterMutex() hasn't been called yet.
29139 29700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -29159,11 +29720,11 @@
29159 29720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int cnt = 3;
29160 29721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( cnt-->0 && (res = LockFile(pFile->h, PENDING_BYTE, 0, 1, 0))==0 ){
29161 29722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Try 3 times to get the pending lock. The pending lock might be
29162 29723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** held by another reader process who will release it momentarily.
29163 29724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
29164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2("could not get a PENDING lock. cnt=%d\n", cnt);
29725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("could not get a PENDING lock. cnt=%d\n", cnt));
29165 29726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Sleep(1);
29166 29727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29167 29728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
gotPendingLock = res;
29168 29729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !res ){
29169 29730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
error = GetLastError();
@@ -29204,17 +29765,17 @@
29204 29765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Acquire an EXCLUSIVE lock
29205 29766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
29206 29767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( locktype==EXCLUSIVE_LOCK && res ){
29207 29768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile->locktype>=SHARED_LOCK );
29208 29769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = unlockReadLock(pFile);
29209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2("unreadlock = %d\n", res);
29770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("unreadlock = %d\n", res));
29210 29771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = LockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0);
29211 29772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( res ){
29212 29773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
newLocktype = EXCLUSIVE_LOCK;
29213 29774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
29214 29775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
error = GetLastError();
29215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2("error-code = %d\n", error);
29776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("error-code = %d\n", error));
29216 29777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
getReadLock(pFile);
29217 29778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29218 29779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29219 29780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29220 29781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If we are holding a PENDING lock that ought to be released, then
@@ -29228,12 +29789,12 @@
29228 29789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** return the appropriate result code.
29229 29790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
29230 29791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( res ){
29231 29792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_OK;
29232 29793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
29233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE4("LOCK FAILED %d trying for %d but got %d\n", pFile->h,
29234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- locktype, newLocktype);
29794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("LOCK FAILED %d trying for %d but got %d\n", pFile->h,
29795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ locktype, newLocktype));
29235 29796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = error;
29236 29797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_BUSY;
29237 29798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29238 29799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->locktype = (u8)newLocktype;
29239 29800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
@@ -29249,18 +29810,18 @@
29249 29810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winFile *pFile = (winFile*)id;
29250 29811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29251 29812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
29252 29813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->locktype>=RESERVED_LOCK ){
29253 29814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = 1;
29254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("TEST WR-LOCK %d %d (local)\n", pFile->h, rc);
29815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TEST WR-LOCK %d %d (local)\n", pFile->h, rc));
29255 29816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
29256 29817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = LockFile(pFile->h, RESERVED_BYTE, 0, 1, 0);
29257 29818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ){
29258 29819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0);
29259 29820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29260 29821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = !rc;
29261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE3("TEST WR-LOCK %d %d (remote)\n", pFile->h, rc);
29822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TEST WR-LOCK %d %d (remote)\n", pFile->h, rc));
29262 29823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29263 29824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pResOut = rc;
29264 29825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
29265 29826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29266 29827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -29279,12 +29840,12 @@
29279 29840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int type;
29280 29841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winFile *pFile = (winFile*)id;
29281 29842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
29282 29843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile!=0 );
29283 29844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( locktype<=SHARED_LOCK );
29284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE5("UNLOCK %d to %d was %d(%d)\n", pFile->h, locktype,
29285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->locktype, pFile->sharedLockByte);
29845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("UNLOCK %d to %d was %d(%d)\n", pFile->h, locktype,
29846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->locktype, pFile->sharedLockByte));
29286 29847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
type = pFile->locktype;
29287 29848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( type>=EXCLUSIVE_LOCK ){
29288 29849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0);
29289 29850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( locktype==SHARED_LOCK && !getReadLock(pFile) ){
29290 29851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* This should never happen. We should always be able to
@@ -29316,10 +29877,15 @@
29316 29877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29317 29878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_LAST_ERRNO: {
29318 29879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*(int*)pArg = (int)((winFile*)id)->lastErrno;
29319 29880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
29320 29881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_FCNTL_SIZE_HINT: {
29883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 sz = *(sqlite3_int64*)pArg;
29884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winTruncate(id, sz);
29885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
29886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
29321 29887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29322 29888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_ERROR;
29323 29889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29324 29890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29325 29891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -29343,16 +29909,535 @@
29343 29909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int winDeviceCharacteristics(sqlite3_file *id){
29344 29910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(id);
29345 29911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
29346 29912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29347 29913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /****************************************************************************
29915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ********************************* Shared Memory *****************************
29916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
29917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The next subdivision of code manages the shared-memory primitives.
29918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
29919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
29920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
29922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Helper functions to obtain and relinquish the global mutex. The
29923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** global mutex is used to protect the winLockInfo objects used by
29924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this file, all of which may be shared by multiple threads.
29925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
29926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Function winShmMutexHeld() is used to assert() that the global mutex
29927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is held when required. This function is only used as part of assert()
29928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** statements. e.g.
29929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
29930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** winShmEnterMutex()
29931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** assert( winShmMutexHeld() );
29932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** winEnterLeave()
29933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
29934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void winShmEnterMutex(void){
29935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
29936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
29937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void winShmLeaveMutex(void){
29938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
29939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
29940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
29941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int winShmMutexHeld(void) {
29942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
29943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
29944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
29945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
29947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Object used to represent a single file opened and mmapped to provide
29948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** shared memory. When multiple threads all reference the same
29949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** log-summary, each thread has its own winFile object, but they all
29950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** point to a single instance of this object. In other words, each
29951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** log-summary is opened only once per process.
29952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
29953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** winShmMutexHeld() must be true when creating or destroying
29954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this object or while reading or writing the following fields:
29955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
29956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** nRef
29957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pNext
29958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
29959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The following fields are read-only after the object is created:
29960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
29961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fid
29962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zFilename
29963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
29964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Either winShmNode.mutex must be held or winShmNode.nRef==0 and
29965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** winShmMutexHeld() is true when reading or writing any other field
29966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in this structure.
29967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
29968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** To avoid deadlocks, mutex and mutexBuf are always released in the
29969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** reverse order that they are acquired. mutexBuf is always acquired
29970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** first and released last. This invariant is check by asserting
29971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3_mutex_notheld() on mutex whenever mutexBuf is acquired or
29972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** released.
29973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
29974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct winShmNode {
29975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex *mutex; /* Mutex to access this object */
29976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zFilename; /* Name of the file */
29977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winFile hFile; /* File handle from winOpen */
29978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int szRegion; /* Size of shared-memory regions */
29980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRegion; /* Size of array apRegion */
29981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct ShmRegion {
29982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ HANDLE hMap; /* File handle from CreateFileMapping */
29983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pMap;
29984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } *aRegion;
29985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DWORD lastErrno; /* The Windows errno from the last I/O error */
29986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRef; /* Number of winShm objects pointing to this */
29988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShm *pFirst; /* All winShm objects pointing to this */
29989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmNode *pNext; /* Next in list of all winShmNode objects */
29990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
29991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 nextShmId; /* Next available winShm.id value */
29992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
29993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
29994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
29996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A global array of all winShmNode objects.
29997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
29998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The winShmMutexHeld() must be true while reading or writing this list.
29999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static winShmNode *winShmNodeList = 0;
30001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
30003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Structure used internally by this VFS to record the state of an
30004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** open shared memory connection.
30005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
30006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** winShm.pFile->mutex must be held while reading or writing the
30007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** winShm.pNext and winShm.locks[] elements.
30008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
30009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The winShm.pFile element is initialized when the object is created
30010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and is read-only thereafter.
30011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct winShm {
30013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmNode *pShmNode; /* The underlying winShmNode object */
30014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShm *pNext; /* Next winShm with the same winShmNode */
30015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 hasMutex; /* True if holding the winShmNode mutex */
30016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 hasMutexBuf; /* True if holding pFile->mutexBuf */
30017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
30018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 id; /* Id of this connection with its winShmNode */
30019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
30020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
30021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
30023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Constants used for locking
30024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WIN_SHM_BASE ((18+SQLITE_SHM_NLOCK)*4) /* first lock byte */
30026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WIN_SHM_DMS (WIN_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */
30027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
30029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Apply advisory locks for all n bytes beginning at ofst.
30030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define _SHM_UNLCK 1
30032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define _SHM_RDLCK 2
30033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define _SHM_WRLCK 3
30034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int winShmSystemLock(
30035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmNode *pFile, /* Apply locks to this open shared-memory segment */
30036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int lockType, /* _SHM_UNLCK, _SHM_RDLCK, or _SHM_WRLCK */
30037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst, /* Offset to first byte to be locked/unlocked */
30038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nByte /* Number of bytes to lock or unlock */
30039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
30040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OVERLAPPED ovlp;
30041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DWORD dwFlags;
30042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = 0; /* Result code form Lock/UnlockFileEx() */
30043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Access to the winShmNode object is serialized by the caller */
30045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( sqlite3_mutex_held(pFile->mutex) || pFile->nRef==0 );
30046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Initialize the locking parameters */
30048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwFlags = LOCKFILE_FAIL_IMMEDIATELY;
30049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( lockType == _SHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK;
30050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Find the first bit in lockMask that is set */
30052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&ovlp, 0, sizeof(OVERLAPPED));
30053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ovlp.Offset = ofst;
30054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Release/Acquire the system-level lock */
30056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( lockType==_SHM_UNLCK ){
30057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = UnlockFileEx(pFile->hFile.h, 0, nByte, 0, &ovlp);
30058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
30059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = LockFileEx(pFile->hFile.h, dwFlags, 0, nByte, 0, &ovlp);
30060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !rc ){
30062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("SHM-LOCK %d %s ERROR 0x%08lx\n",
30063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->hFile.h,
30064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lockType==_SHM_UNLCK ? "UnlockFileEx" : "LockFileEx",
30065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ GetLastError()));
30066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = (rc!=0) ? SQLITE_OK : SQLITE_BUSY;
30068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
30070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Forward references to VFS methods */
30073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int winOpen(sqlite3_vfs*,const char*,sqlite3_file*,int,int*);
30074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int winDelete(sqlite3_vfs *,const char*,int);
30075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
30077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Purge the winShmNodeList list of all entries with winShmNode.nRef==0.
30078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
30079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is not a VFS shared-memory method; it is a utility function called
30080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by VFS shared-memory methods.
30081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){
30083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmNode **pp;
30084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmNode *p;
30085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( winShmMutexHeld() );
30086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pp = &winShmNodeList;
30087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( (p = *pp)!=0 ){
30088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->nRef==0 ){
30089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
30090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->mutex ) sqlite3_mutex_free(p->mutex);
30091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->nRegion; i++){
30092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UnmapViewOfFile(p->aRegion[i].pMap);
30093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CloseHandle(p->aRegion[i].hMap);
30094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->hFile.h != INVALID_HANDLE_VALUE ) {
30096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winClose((sqlite3_file *)&p->hFile);
30097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( deleteFlag ) winDelete(pVfs, p->zFilename, 0);
30099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp = p->pNext;
30100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p->aRegion);
30101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p);
30102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
30103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pp = &p->pNext;
30104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
30109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Open a shared-memory area. This particular implementation uses
30110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mmapped files.
30111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
30112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zName is a filename used to identify the shared-memory area. The
30113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** implementation does not (and perhaps should not) use this name
30114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** directly, but rather use it as a template for finding an appropriate
30115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** name for the shared-memory storage. In this implementation, the
30116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** string "-index" is appended to zName and used as the name of the
30117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mmapped file.
30118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
30119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When opening a new shared-memory file, if no other instances of that
30120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file are currently open, in this process or in other processes, then
30121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the file must be truncated to zero length or have its header cleared.
30122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int winShmOpen(
30124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *fd /* The file to which to attach shared memory */
30125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
30126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct winFile *pDbFd; /* Database to which to attach SHM */
30127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct winShm *p; /* The connection to be opened */
30128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct winShmNode *pShmNode = 0; /* The underlying mmapped file */
30129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Result code */
30130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct winShmNode *pNew; /* Newly allocated winShmNode */
30131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nName; /* Size of zName in bytes */
30132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDbFd = (winFile*)fd;
30134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pDbFd->pShm==0 ); /* Not previously opened */
30135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Allocate space for the new sqlite3_shm object. Also speculatively
30137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** allocate space for a new winShmNode and filename.
30138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = sqlite3_malloc( sizeof(*p) );
30140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p==0 ) return SQLITE_NOMEM;
30141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(p, 0, sizeof(*p));
30142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nName = sqlite3Strlen30(pDbFd->zPath);
30143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNew = sqlite3_malloc( sizeof(*pShmNode) + nName + 15 );
30144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pNew==0 ){
30145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p);
30146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
30147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pNew, 0, sizeof(*pNew));
30149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNew->zFilename = (char*)&pNew[1];
30150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_snprintf(nName+15, pNew->zFilename, "%s-wal-index", pDbFd->zPath);
30151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Look to see if there is an existing winShmNode that can be used.
30153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If no matching winShmNode currently exists, create a new one.
30154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmEnterMutex();
30156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pShmNode = winShmNodeList; pShmNode; pShmNode=pShmNode->pNext){
30157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* TBD need to come up with better match here. Perhaps
30158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** use FILE_ID_BOTH_DIR_INFO Structure.
30159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3StrICmp(pShmNode->zFilename, pNew->zFilename)==0 ) break;
30161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode ){
30163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pNew);
30164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
30165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode = pNew;
30166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNew = 0;
30167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE;
30168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->pNext = winShmNodeList;
30169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmNodeList = pShmNode;
30170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
30172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode->mutex==0 ){
30173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_NOMEM;
30174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shm_open_err;
30175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = winOpen(pDbFd->pVfs,
30177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->zFilename, /* Name of the file (UTF-8) */
30178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (sqlite3_file*)&pShmNode->hFile, /* File handle here */
30179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, /* Mode flags */
30180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0);
30181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SQLITE_OK!=rc ){
30182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_CANTOPEN_BKPT;
30183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shm_open_err;
30184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Check to see if another process is holding the dead-man switch.
30187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If not, truncate the file to zero length.
30188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( winShmSystemLock(pShmNode, _SHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){
30190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0);
30191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
30193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1);
30194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = winShmSystemLock(pShmNode, _SHM_RDLCK, WIN_SHM_DMS, 1);
30195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ) goto shm_open_err;
30197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Make the new connection a child of the winShmNode */
30200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pShmNode = pShmNode;
30201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pNext = pShmNode->pFirst;
30202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
30203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->id = pShmNode->nextShmId++;
30204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
30205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->pFirst = p;
30206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->nRef++;
30207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDbFd->pShm = p;
30208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmLeaveMutex();
30209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
30210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Jump here on any error */
30212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shm_open_err:
30213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1);
30214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmPurge(pDbFd->pVfs, 0); /* This call frees pShmNode if required */
30215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p);
30216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pNew);
30217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmLeaveMutex();
30218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
30219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
30222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Close a connection to shared-memory. Delete the underlying
30223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** storage if deleteFlag is true.
30224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int winShmClose(
30226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *fd, /* Database holding shared memory */
30227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int deleteFlag /* Delete after closing if true */
30228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
30229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winFile *pDbFd; /* Database holding shared-memory */
30230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShm *p; /* The connection to be closed */
30231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmNode *pShmNode; /* The underlying shared-memory file */
30232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShm **pp; /* For looping over sibling connections */
30233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDbFd = (winFile*)fd;
30235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = pDbFd->pShm;
30236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode = p->pShmNode;
30237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Remove connection p from the set of connections associated
30239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** with pShmNode */
30240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_enter(pShmNode->mutex);
30241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){}
30242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp = p->pNext;
30243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Free the connection p */
30245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p);
30246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDbFd->pShm = 0;
30247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_leave(pShmNode->mutex);
30248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If pShmNode->nRef has reached 0, then close the underlying
30250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** shared-memory file, too */
30251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmEnterMutex();
30252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pShmNode->nRef>0 );
30253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->nRef--;
30254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode->nRef==0 ){
30255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmPurge(pDbFd->pVfs, deleteFlag);
30256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmLeaveMutex();
30258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
30260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
30263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called to obtain a pointer to region iRegion of the
30264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** shared-memory associated with the database file fd. Shared-memory regions
30265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are numbered starting from zero. Each shared-memory region is szRegion
30266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bytes in size.
30267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
30268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an error occurs, an error code is returned and *pp is set to NULL.
30269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
30270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, if the isWrite parameter is 0 and the requested shared-memory
30271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** region has not been allocated (by any client, including one running in a
30272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** separate process), then *pp is set to NULL and SQLITE_OK returned. If
30273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** isWrite is non-zero and the requested shared-memory region has not yet
30274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** been allocated, it is allocated by this function.
30275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
30276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the shared-memory region has already been allocated or is allocated by
30277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this call as described above, then it is mapped into this processes
30278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** address space (if it is not already), *pp is set to point to the mapped
30279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** memory and SQLITE_OK returned.
30280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int winShmMap(
30282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *fd, /* Handle open on database file */
30283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iRegion, /* Region to retrieve */
30284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int szRegion, /* Size of regions */
30285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isWrite, /* True to extend file if necessary */
30286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void volatile **pp /* OUT: Mapped memory */
30287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
30288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winFile *pDbFd = (winFile*)fd;
30289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShm *p = pDbFd->pShm;
30290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmNode *pShmNode = p->pShmNode;
30291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
30292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_enter(pShmNode->mutex);
30294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
30295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode->nRegion<=iRegion ){
30297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct ShmRegion *apNew; /* New aRegion[] array */
30298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nByte = (iRegion+1)*szRegion; /* Minimum required file size */
30299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 sz; /* Current size of wal-index file */
30300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->szRegion = szRegion;
30302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The requested region is not mapped into this processes address space.
30304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Check to see if it has been allocated (i.e. if the wal-index file is
30305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** large enough to contain the requested region).
30306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = winFileSize((sqlite3_file *)&pShmNode->hFile, &sz);
30308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
30309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shmpage_out;
30310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sz<nByte ){
30313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The requested memory region does not exist. If isWrite is set to
30314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zero, exit early. *pp will be set to NULL and SQLITE_OK returned.
30315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
30316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Alternatively, if isWrite is non-zero, use ftruncate() to allocate
30317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the requested memory region.
30318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !isWrite ) goto shmpage_out;
30320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = winTruncate((sqlite3_file *)&pShmNode->hFile, nByte);
30321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
30322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shmpage_out;
30323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Map the requested memory region into this processes address space. */
30327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ apNew = (struct ShmRegion *)sqlite3_realloc(
30328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0])
30329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
30330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !apNew ){
30331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_IOERR_NOMEM;
30332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shmpage_out;
30333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->aRegion = apNew;
30335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pShmNode->nRegion<=iRegion ){
30337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ HANDLE hMap; /* file-mapping handle */
30338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pMap = 0; /* Mapped memory region */
30339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ hMap = CreateFileMapping(pShmNode->hFile.h,
30341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ NULL, PAGE_READWRITE, 0, nByte, NULL
30342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
30343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( hMap ){
30344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pMap = MapViewOfFile(hMap, FILE_MAP_WRITE | FILE_MAP_READ,
30345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, 0, nByte
30346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
30347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pMap ){
30349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->lastErrno = GetLastError();
30350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_IOERR;
30351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( hMap ) CloseHandle(hMap);
30352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto shmpage_out;
30353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->aRegion[pShmNode->nRegion].pMap = pMap;
30356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->aRegion[pShmNode->nRegion].hMap = hMap;
30357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pShmNode->nRegion++;
30358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shmpage_out:
30362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pShmNode->nRegion>iRegion ){
30363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p = (char *)pShmNode->aRegion[iRegion].pMap;
30364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp = (void *)&p[iRegion*szRegion];
30365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
30366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp = 0;
30367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_leave(pShmNode->mutex);
30369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
30370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
30373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Change the lock state for a shared-memory segment.
30374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int winShmLock(
30376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *fd, /* Database file holding the shared memory */
30377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ofst, /* First lock to acquire or release */
30378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n, /* Number of locks to acquire or release */
30379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int flags /* What to do with the lock */
30380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
30381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winFile *pDbFd = (winFile*)fd;
30382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShm *p = pDbFd->pShm;
30383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmNode *pShmNode = p->pShmNode;
30384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_PROTOCOL;
30385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK );
30387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( n>=1 );
30388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED)
30389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE)
30390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED)
30391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) );
30392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 );
30393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_enter(pShmNode->mutex);
30395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( flags & SQLITE_SHM_UNLOCK ){
30396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = winShmSystemLock(pShmNode, _SHM_UNLCK, ofst+WIN_SHM_BASE, n);
30397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( flags & SQLITE_SHM_SHARED ){
30398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = winShmSystemLock(pShmNode, _SHM_RDLCK, ofst+WIN_SHM_BASE, n);
30399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
30400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = winShmSystemLock(pShmNode, _SHM_WRLCK, ofst+WIN_SHM_BASE, n);
30401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_leave(pShmNode->mutex);
30403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("SHM-LOCK shmid-%d, pid-%d %s\n",
30404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->id, (int)GetCurrentProcessId(), rc ? "failed" : "ok"));
30405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
30406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
30409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Implement a memory barrier or memory fence on shared memory.
30410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
30411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** All loads and stores begun before the barrier must complete before
30412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** any load or store begun after the barrier.
30413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
30414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void winShmBarrier(
30415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *fd /* Database holding the shared memory */
30416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
30417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* MemoryBarrier(); // does not work -- do not know why not */
30418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmEnterMutex();
30419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmLeaveMutex();
30420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
30423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define winShmOpen 0
30424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define winShmMap 0
30425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define winShmLock 0
30426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define winShmBarrier 0
30427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define winShmClose 0
30428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* #ifndef SQLITE_OMIT_WAL */
30429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
30430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ***************************** End Shared Memory *****************************
30431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ****************************************************************************/
30432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29348 30433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
29349 30434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This vector defines all the methods that can operate on an
29350 30435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3_file for win32.
29351 30436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
29352 30437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const sqlite3_io_methods winIoMethod = {
29353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 1, /* iVersion */
30438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 2, /* iVersion */
29354 30439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winClose,
29355 30440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winRead,
29356 30441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winWrite,
29357 30442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winTruncate,
29358 30443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winSync,
@@ -29360,11 +30445,16 @@
29360 30445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winLock,
29361 30446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winUnlock,
29362 30447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winCheckReservedLock,
29363 30448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winFileControl,
29364 30449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winSectorSize,
29365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winDeviceCharacteristics
30450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winDeviceCharacteristics,
30451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmOpen, /* xShmOpen */
30452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmLock, /* xShmLock */
30453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmMap, /* xShmMap */
30454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmBarrier, /* xShmBarrier */
30455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winShmClose /* xShmClose */
29366 30456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
29367 30457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29368 30458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/***************************************************************************
29369 30459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Here ends the I/O methods that form the sqlite3_io_methods object.
29370 30460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -29442,11 +30532,11 @@
29442 30532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_randomness(20, &zBuf[j]);
29443 30533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<20; i++, j++){
29444 30534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
29445 30535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29446 30536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBuf[j] = 0;
29447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2("TEMP FILENAME: %s\n", zBuf);
30537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("TEMP FILENAME: %s\n", zBuf));
29448 30538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
29449 30539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29450 30540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29451 30541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
29452 30542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The return value of getLastErrorMsg
@@ -29533,10 +30623,12 @@
29533 30623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */
29534 30624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char zTmpname[MAX_PATH+1]; /* Buffer used to create temp filename */
29535 30625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29536 30626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
29537 30627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(pVfs);
30628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->h = INVALID_HANDLE_VALUE;
29538 30630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29539 30631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the second argument to this function is NULL, generate a
29540 30632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** temporary file name to use
29541 30633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
29542 30634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !zUtf8Name ){
@@ -29615,10 +30707,13 @@
29615 30707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dwFlagsAndAttributes,
29616 30708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
NULL
29617 30709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
29618 30710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
29619 30711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("OPEN %d %s 0x%lx %s\n",
30713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ h, zName, dwDesiredAccess,
30714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ h==INVALID_HANDLE_VALUE ? "failed" : "ok"));
29620 30715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( h==INVALID_HANDLE_VALUE ){
29621 30716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(zConverted);
29622 30717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags & SQLITE_OPEN_READWRITE ){
29623 30718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return winOpen(pVfs, zName, id,
29624 30719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
((flags|SQLITE_OPEN_READONLY)&~SQLITE_OPEN_READWRITE), pOutFlags);
@@ -29635,10 +30730,13 @@
29635 30730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29636 30731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(pFile, 0, sizeof(*pFile));
29637 30732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->pMethod = &winIoMethod;
29638 30733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->h = h;
29639 30734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = NO_ERROR;
30735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->pVfs = pVfs;
30736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->pShm = 0;
30737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->zPath = zName;
29640 30738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->sectorSize = getSectorSize(pVfs, zUtf8Name);
29641 30739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE
29642 30740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (flags & (SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB)) ==
29643 30741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB)
29644 30742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& !winceCreateLock(zName, pFile)
@@ -29706,11 +30804,14 @@
29706 30804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& (++cnt < MX_DELETION_ATTEMPTS)
29707 30805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& (Sleep(100), 1) );
29708 30806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
29709 30807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29710 30808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(zConverted);
29711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE2("DELETE \"%s\"\n", zFilename);
30809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("DELETE \"%s\" %s\n", zFilename,
30810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ( (rc==INVALID_FILE_ATTRIBUTES) && (error==ERROR_FILE_NOT_FOUND)) ?
30811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ok" : "failed" ));
30812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29712 30813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return ( (rc == INVALID_FILE_ATTRIBUTES)
29713 30814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& (error == ERROR_FILE_NOT_FOUND)) ? SQLITE_OK : SQLITE_IOERR_DELETE;
29714 30815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29715 30816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29716 30817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -29999,38 +31100,36 @@
29999 31100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(pVfs);
30000 31101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return ((microsec+999)/1000)*1000;
30001 31102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30002 31103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30003 31104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
30004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The following variable, if set to a non-zero value, becomes the result
30005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** returned from sqlite3OsCurrentTime(). This is used for testing.
31105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The following variable, if set to a non-zero value, is interpreted as
31106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the number of seconds since 1970 and is used to set the result of
31107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3OsCurrentTime() during testing.
30006 31108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
30007 31109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_TEST
30008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_API int sqlite3_current_time = 0;
31110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */
30009 31111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
30010 31112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30011 31113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
30012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Find the current time (in Universal Coordinated Time). Write the
30013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** current time and date as a Julian Day number into *prNow and
30014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** return 0. Return 1 if the time and date cannot be found.
31114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Find the current time (in Universal Coordinated Time). Write into *piNow
31115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the current time and date as a Julian Day number times 86_400_000. In
31116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** other words, write into *piNow the number of milliseconds since the Julian
31117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** epoch of noon in Greenwich on November 24, 4714 B.C according to the
31118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** proleptic Gregorian calendar.
31119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
31120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On success, return 0. Return 1 if the time and date cannot be found.
30015 31121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
30016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){
30017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FILETIME ft;
31122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){
30018 31123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* FILETIME structure is a 64-bit value representing the number of
30019 31124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100-nanosecond intervals since January 1, 1601 (= JD 2305813.5).
30020 31125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
30021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 timeW; /* Whole days */
30022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 timeF; /* Fractional Days */
30023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
30024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Number of 100-nanosecond intervals in a single day */
30025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const sqlite3_int64 ntuPerDay =
30026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 10000000*(sqlite3_int64)86400;
30027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
30028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Number of 100-nanosecond intervals in half of a day */
30029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const sqlite3_int64 ntuPerHalfDay =
30030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 10000000*(sqlite3_int64)43200;
30031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
31126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FILETIME ft;
31127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const sqlite3_int64 winFiletimeEpoch = 23058135*(sqlite3_int64)8640000;
31128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_TEST
31129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000;
31130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
30032 31131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 2^32 - to avoid use of LL and warnings in gcc */
30033 31132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const sqlite3_int64 max32BitValue =
30034 31133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(sqlite3_int64)2000000000 + (sqlite3_int64)2000000000 + (sqlite3_int64)294967296;
30035 31134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30036 31135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE
@@ -30041,26 +31140,38 @@
30041 31140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
30042 31141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30043 31142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
30044 31143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
GetSystemTimeAsFileTime( &ft );
30045 31144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
30046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UNUSED_PARAMETER(pVfs);
30047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- timeW = (((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) + (sqlite3_int64)ft.dwLowDateTime;
30048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- timeF = timeW % ntuPerDay; /* fractional days (100-nanoseconds) */
30049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- timeW = timeW / ntuPerDay; /* whole days */
30050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- timeW = timeW + 2305813; /* add whole days (from 2305813.5) */
30051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- timeF = timeF + ntuPerHalfDay; /* add half a day (from 2305813.5) */
30052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- timeW = timeW + (timeF/ntuPerDay); /* add whole day if half day made one */
30053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- timeF = timeF % ntuPerDay; /* compute new fractional days */
30054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *prNow = (double)timeW + ((double)timeF / (double)ntuPerDay);
31145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
31146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piNow = winFiletimeEpoch +
31147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ((((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) +
31148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (sqlite3_int64)ft.dwLowDateTime)/(sqlite3_int64)1000;
31149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30055 31150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_TEST
30056 31151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3_current_time ){
30057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *prNow = ((double)sqlite3_current_time + (double)43200) / (double)86400 + (double)2440587;
31152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch;
30058 31153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30059 31154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
31155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UNUSED_PARAMETER(pVfs);
30060 31156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
30061 31157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
31158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
31159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
31160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Find the current time (in Universal Coordinated Time). Write the
31161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current time and date as a Julian Day number into *prNow and
31162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** return 0. Return 1 if the time and date cannot be found.
31163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
31164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){
31165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
31166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 i;
31167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = winCurrentTimeInt64(pVfs, &i);
31168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !rc ){
31169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *prNow = i/86400000.0;
31170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
31171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
31172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
30062 31173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30063 31174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
30064 31175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The idea is that this function works like a combination of
30065 31176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** GetLastError() and FormatMessage() on windows (or errno and
30066 31177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** strerror_r() on unix). After an error is returned by an OS
@@ -30092,35 +31203,38 @@
30092 31203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
30093 31204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
30094 31205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(pVfs);
30095 31206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return getLastErrorMsg(nBuf, zBuf);
30096 31207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
31208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
31209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30097 31210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30098 31211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
30099 31212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Initialize and deinitialize the operating system interface.
30100 31213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
30101 31214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_API int sqlite3_os_init(void){
30102 31215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static sqlite3_vfs winVfs = {
30103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 1, /* iVersion */
30104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sizeof(winFile), /* szOsFile */
30105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- MAX_PATH, /* mxPathname */
30106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 0, /* pNext */
30107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "win32", /* zName */
30108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 0, /* pAppData */
30109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
30110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winOpen, /* xOpen */
30111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winDelete, /* xDelete */
30112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winAccess, /* xAccess */
30113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winFullPathname, /* xFullPathname */
30114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winDlOpen, /* xDlOpen */
30115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winDlError, /* xDlError */
30116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winDlSym, /* xDlSym */
30117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winDlClose, /* xDlClose */
30118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winRandomness, /* xRandomness */
30119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winSleep, /* xSleep */
30120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winCurrentTime, /* xCurrentTime */
30121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winGetLastError /* xGetLastError */
31216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 2, /* iVersion */
31217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sizeof(winFile), /* szOsFile */
31218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MAX_PATH, /* mxPathname */
31219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pNext */
31220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "win32", /* zName */
31221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pAppData */
31222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winOpen, /* xOpen */
31223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winDelete, /* xDelete */
31224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winAccess, /* xAccess */
31225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winFullPathname, /* xFullPathname */
31226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winDlOpen, /* xDlOpen */
31227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winDlError, /* xDlError */
31228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winDlSym, /* xDlSym */
31229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winDlClose, /* xDlClose */
31230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winRandomness, /* xRandomness */
31231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winSleep, /* xSleep */
31232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winCurrentTime, /* xCurrentTime */
31233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winGetLastError, /* xGetLastError */
31234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* xRename */
31235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winCurrentTimeInt64, /* xCurrentTimeInt64 */
30122 31236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
30123 31237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30124 31238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vfs_register(&winVfs, 1);
30125 31239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
30126 31240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -30801,19 +31915,21 @@
30801 31915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPage = sqlite3GlobalConfig.pcache.xFetch(pCache->pCache, pgno, 2);
30802 31916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30803 31917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30804 31918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPage ){
30805 31919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !pPage->pData ){
30806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(pPage, 0, sizeof(PgHdr) + pCache->szExtra);
30807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPage->pExtra = (void*)&pPage[1];
30808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPage->pData = (void *)&((char *)pPage)[sizeof(PgHdr) + pCache->szExtra];
31920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pPage, 0, sizeof(PgHdr));
31921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPage->pData = (void *)&pPage[1];
31922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPage->pExtra = (void*)&((char *)pPage->pData)[pCache->szPage];
31923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pPage->pExtra, 0, pCache->szExtra);
30809 31924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPage->pCache = pCache;
30810 31925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPage->pgno = pgno;
30811 31926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30812 31927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPage->pCache==pCache );
30813 31928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPage->pgno==pgno );
30814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pPage->pExtra==(void *)&pPage[1] );
31929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPage->pData==(void *)&pPage[1] );
31930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPage->pExtra==(void *)&((char *)&pPage[1])[pCache->szPage] );
30815 31931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30816 31932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( 0==pPage->nRef ){
30817 31933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCache->nRef++;
30818 31934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30819 31935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPage->nRef++;
@@ -31840,11 +32956,11 @@
31840 32956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is called during initialization (sqlite3_initialize()) to
31841 32957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** install the default pluggable cache module, assuming the user has not
31842 32958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** already provided an alternative.
31843 32959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
31844 32960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3PCacheSetDefault(void){
31845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static sqlite3_pcache_methods defaultMethods = {
32961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const sqlite3_pcache_methods defaultMethods = {
31846 32962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* pArg */
31847 32963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pcache1Init, /* xInit */
31848 32964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pcache1Shutdown, /* xShutdown */
31849 32965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pcache1Create, /* xCreate */
31850 32966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pcache1Cachesize, /* xCachesize */
@@ -32353,10 +33469,120 @@
32353 33469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** locking to prevent two processes from writing the same database
32354 33470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file simultaneously, or one process from reading the database while
32355 33471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** another is writing.
32356 33472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
32357 33473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_DISKIO
33474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************** Include wal.h in the middle of pager.c ***********************/
33475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************** Begin file wal.h *********************************************/
33476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
33477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2010 February 1
33478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
33479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The author disclaims copyright to this source code. In place of
33480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a legal notice, here is a blessing:
33481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
33482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** May you do good and not evil.
33483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** May you find forgiveness for yourself and forgive others.
33484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** May you share freely, never taking more than you give.
33485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
33486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *************************************************************************
33487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This header file defines the interface to the write-ahead logging
33488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** system. Refer to the comments below and the header comment attached to
33489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the implementation of each function in log.c for further details.
33490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
33491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef _WAL_H_
33493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define _WAL_H_
33494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_OMIT_WAL
33497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalOpen(x,y,z) 0
33498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalClose(w,x,y,z) 0
33499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalBeginReadTransaction(y,z) 0
33500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalEndReadTransaction(z)
33501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalRead(v,w,x,y,z) 0
33502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalDbsize(y,z)
33503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalBeginWriteTransaction(y) 0
33504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalEndWRiteTransaction(x) 0
33505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalUndo(x,y,z) 0
33506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalSavepoint(y,z)
33507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalSavepointUndo(y,z) 0
33508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalFrames(u,v,w,x,y,z) 0
33509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalCheckpoint(u,v,w,x) 0
33510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3WalCallback(z) 0
33511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
33512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_SAVEPOINT_NDATA 4
33514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Connection to a write-ahead log (WAL) file.
33516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** There is one object of this type for each pager.
33517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
33518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct Wal Wal;
33519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Open and close a connection to a write-ahead log. */
33521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *zName, Wal**);
33522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalClose(Wal *pWal, int sync_flags, int, u8 *);
33523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Used by readers to open (lock) and close (unlock) a snapshot. A
33525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** snapshot is like a read-transaction. It is the state of the database
33526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** at an instant in time. sqlite3WalOpenSnapshot gets a read lock and
33527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** preserves the current state even if the other threads or processes
33528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** write to or checkpoint the WAL. sqlite3WalCloseSnapshot() closes the
33529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** transaction and releases the lock.
33530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
33531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *);
33532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal);
33533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Read a page from the write-ahead log, if it is present. */
33535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalRead(Wal *pWal, Pgno pgno, int *pInWal, int nOut, u8 *pOut);
33536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Return the size of the database as it existed at the beginning
33538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the snapshot */
33539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3WalDbsize(Wal *pWal, Pgno *pPgno);
33540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Obtain or release the WRITER lock. */
33542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal);
33543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal);
33544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Undo any frames written (but not committed) to the log */
33546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx);
33547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Return an integer that records the current (uncommitted) write
33549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** position in the WAL */
33550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData);
33551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Move the write position of the WAL back to iFrame. Called in
33553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** response to a ROLLBACK TO command. */
33554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData);
33555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Write a frame or frames to the log. */
33557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalFrames(Wal *pWal, int, PgHdr *, Pgno, int, int);
33558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Copy pages from the log to the database file */
33560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalCheckpoint(
33561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pWal, /* Write-ahead log connection */
33562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sync_flags, /* Flags to sync db file with (or 0) */
33563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nBuf, /* Size of buffer nBuf */
33564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *zBuf /* Temporary buffer to use */
33565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
33566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Return the value to pass to a sqlite3_wal_hook callback, the
33568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** number of frames in the WAL at the point of the last commit since
33569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3WalCallback() was called. If no commits have occurred since
33570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the last call, then return 0.
33571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
33572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal);
33573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Tell the wal layer that an EXCLUSIVE lock has been obtained (or released)
33575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by the pager layer on the database file.
33576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
33577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op);
33578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* ifndef SQLITE_OMIT_WAL */
33580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* _WAL_H_ */
33581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************** End of wal.h *************************************************/
33583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************** Continuing where we left off in pager.c **********************/
32358 33584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32359 33585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
32360 33586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
******************** NOTES ON THE DESIGN OF THE PAGER ************************
32361 33587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
32362 33588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Within this comment block, a page is deemed to have been synced
@@ -32553,10 +33779,11 @@
32553 33779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i64 iOffset; /* Starting offset in main journal */
32554 33780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i64 iHdrOffset; /* See above */
32555 33781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Bitvec *pInSavepoint; /* Set of pages in this savepoint */
32556 33782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Pgno nOrig; /* Original number of pages in file */
32557 33783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Pgno iSubRec; /* Index of first record in sub-journal */
33784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 aWalData[WAL_SAVEPOINT_NDATA]; /* WAL savepoint context */
32558 33785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
32559 33786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32560 33787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
32561 33788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A open page cache is an instance of the following structure.
32562 33789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -32730,10 +33957,13 @@
32730 33957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pCodec; /* First argument to xCodec... methods */
32731 33958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
32732 33959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */
32733 33960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PCache *pPCache; /* Pointer to page cache object */
32734 33961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_backup *pBackup; /* Pointer to list of ongoing backup processes */
33962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
33963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pWal; /* Write-ahead log used by "journal_mode=wal" */
33964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
32735 33965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
32736 33966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32737 33967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
32738 33968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The following global variables hold counters used for
32739 33969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** testing purposes only. These variables do not exist in
@@ -33518,10 +34748,26 @@
33518 34748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33519 34749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33520 34750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
33521 34751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33522 34752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
34753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
34754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return true if this pager uses a write-ahead log instead of the usual
34755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** rollback journal. Otherwise false.
34756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
34757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
34758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int pagerUseWal(Pager *pPager){
34759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (pPager->pWal!=0);
34760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
34761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
34762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define pagerUseWal(x) 0
34763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define pagerRollbackWal(x) 0
34764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define pagerWalFrames(v,w,x,y,z) 0
34765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define pagerOpenWalIfPresent(z) SQLITE_OK
34766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define pagerBeginReadTransaction(z) SQLITE_OK
34767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
34768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33523 34769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
33524 34770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Unlock the database file. This function is a no-op if the pager
33525 34771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is in exclusive mode.
33526 34772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
33527 34773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the pager is currently in error state, discard the contents of
@@ -33530,11 +34776,11 @@
33530 34776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** on the pager file (by this or any other process), it will be
33531 34777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** treated as a hot-journal and rolled back.
33532 34778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
33533 34779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void pager_unlock(Pager *pPager){
33534 34780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !pPager->exclusiveMode ){
33535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc; /* Return code */
34781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Return code */
33536 34782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33537 34783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Always close the journal file when dropping the database lock.
33538 34784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Otherwise, another connection with journal_mode=delete might
33539 34785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** delete the file out from under us.
33540 34786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -33549,11 +34795,15 @@
33549 34795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** until the change-counter check fails in PagerSharedLock().
33550 34796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Clearing the page size cache here is being conservative.
33551 34797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
33552 34798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->dbSizeValid = 0;
33553 34799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = osUnlock(pPager->fd, NO_LOCK);
34800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
34801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3WalEndReadTransaction(pPager->pWal);
34802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
34803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = osUnlock(pPager->fd, NO_LOCK);
34804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
33555 34805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ){
33556 34806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->errCode = rc;
33557 34807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33558 34808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOTRACE(("UNLOCK %p\n", pPager))
33559 34809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -33698,10 +34948,11 @@
33698 34948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33699 34949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
releaseAllSavepoints(pPager);
33700 34950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33701 34951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( isOpen(pPager->jfd) || pPager->pInJournal==0 );
33702 34952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isOpen(pPager->jfd) ){
34953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !pagerUseWal(pPager) );
33703 34954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33704 34955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Finalize the journal file. */
33705 34956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3IsMemJournal(pPager->jfd) ){
33706 34957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY );
33707 34958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3OsClose(pPager->jfd);
@@ -33711,24 +34962,26 @@
33711 34962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
33712 34963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3OsTruncate(pPager->jfd, 0);
33713 34964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33714 34965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalOff = 0;
33715 34966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalStarted = 0;
33716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( pPager->exclusiveMode
33717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || pPager->journalMode==PAGER_JOURNALMODE_PERSIST
34967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST
34968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL)
33718 34969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
33719 34970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = zeroJournalHdr(pPager, hasMaster);
33720 34971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pager_error(pPager, rc);
33721 34972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalOff = 0;
33722 34973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalStarted = 0;
33723 34974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
33724 34975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* This branch may be executed with Pager.journalMode==MEMORY if
33725 34976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a hot-journal was just rolled back. In this case the journal
33726 34977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file should be closed and deleted. If this connection writes to
33727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the database file, it will do so using an in-memory journal. */
34978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the database file, it will do so using an in-memory journal.
34979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
33728 34980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE
33729 34981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| pPager->journalMode==PAGER_JOURNALMODE_MEMORY
34982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || pPager->journalMode==PAGER_JOURNALMODE_WAL
33730 34983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
33731 34984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3OsClose(pPager->jfd);
33732 34985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !pPager->tempFile ){
33733 34986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
33734 34987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -33741,11 +34994,22 @@
33741 34994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BitvecDestroy(pPager->pInJournal);
33742 34995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->pInJournal = 0;
33743 34996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->nRec = 0;
33744 34997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3PcacheCleanAll(pPager->pPCache);
33745 34998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !pPager->exclusiveMode ){
34999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
35000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc2 = sqlite3WalEndWriteTransaction(pPager->pWal);
35001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rc2==SQLITE_OK );
35002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->state = PAGER_SHARED;
35003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the connection was in locking_mode=exclusive mode but is no longer,
35005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** drop the EXCLUSIVE lock held on the database file.
35006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, 0) ){
35008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc2 = osUnlock(pPager->fd, SHARED_LOCK);
35009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( !pPager->exclusiveMode ){
33747 35011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc2 = osUnlock(pPager->fd, SHARED_LOCK);
33748 35012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->state = PAGER_SHARED;
33749 35013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->changeCountDone = 0;
33750 35014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( pPager->state==PAGER_SYNCED ){
33751 35015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->state = PAGER_EXCLUSIVE;
@@ -33852,10 +35116,11 @@
33852 35116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( isMainJrnl || pDone ); /* pDone always used on sub-journals */
33853 35117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( isSavepnt || pDone==0 ); /* pDone never used on non-savepoint */
33854 35118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33855 35119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aData = pPager->pTmpSpace;
33856 35120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( aData ); /* Temp storage must have already been allocated */
35121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pagerUseWal(pPager)==0 || (!isMainJrnl && isSavepnt) );
33857 35122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33858 35123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Read the page number and page data from the journal or sub-journal
33859 35124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file. Return an error code to the caller if an IO error occurs.
33860 35125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
33861 35126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
jfd = isMainJrnl ? pPager->jfd : pPager->sjfd;
@@ -33921,11 +35186,15 @@
33921 35186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
33922 35187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 2008-04-14: When attempting to vacuum a corrupt database file, it
33923 35188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is possible to fail a statement on a database that does not yet exist.
33924 35189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Do not attempt to write if database file has never been opened.
33925 35190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
33926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPg = pager_lookup(pPager, pgno);
35191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
35192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPg = 0;
35193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
35194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPg = pager_lookup(pPager, pgno);
35195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
33927 35196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPg || !MEMDB );
33928 35197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n",
33929 35198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData),
33930 35199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(isMainJrnl?"main-journal":"sub-journal")
33931 35200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
));
@@ -33938,10 +35207,11 @@
33938 35207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& isOpen(pPager->fd)
33939 35208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& isSynced
33940 35209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
33941 35210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i64 ofst = (pgno-1)*(i64)pPager->pageSize;
33942 35211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( !isSavepnt && pPg!=0 && (pPg->flags&PGHDR_NEED_SYNC)!=0 );
35212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !pagerUseWal(pPager) );
33943 35213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3OsWrite(pPager->fd, (u8*)aData, pPager->pageSize, ofst);
33944 35214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pgno>pPager->dbFileSize ){
33945 35215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->dbFileSize = pgno;
33946 35216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33947 35217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPager->pBackup ){
@@ -34002,10 +35272,11 @@
34002 35272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the PGHDR_NEED_SYNC flag will not be set. It could then potentially
34003 35273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be written out into the database file before its journal file
34004 35274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** segment is synced. If a crash occurs during or following this,
34005 35275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** database corruption may ensue.
34006 35276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
35277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !pagerUseWal(pPager) );
34007 35278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3PcacheMakeClean(pPg);
34008 35279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
34009 35280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_CHECK_PAGES
34010 35281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPg->pageHash = pager_pagehash(pPg);
34011 35282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
@@ -34453,10 +35724,13 @@
34453 35724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( rc!=SQLITE_OK );
34454 35725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
34455 35726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK && pPager->noSync==0 && pPager->state>=PAGER_EXCLUSIVE ){
34456 35727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3OsSync(pPager->fd, pPager->sync_flags);
34457 35728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && pPager->noSync==0 && pPager->state>=PAGER_EXCLUSIVE ){
35730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsSync(pPager->fd, pPager->sync_flags);
35731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
34458 35732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
34459 35733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pager_end_transaction(pPager, zMaster[0]!='\0');
34460 35734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( rc!=SQLITE_OK );
34461 35735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
34462 35736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK && zMaster[0] && res ){
@@ -34473,10 +35747,269 @@
34473 35747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
34474 35748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setSectorSize(pPager);
34475 35749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
34476 35750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
34477 35751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
35754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read the content for page pPg out of the database file and into
35755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pPg->pData. A shared lock or greater must be held on the database
35756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file before this function is called.
35757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
35758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If page 1 is read, then the value of Pager.dbFileVers[] is set to
35759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the value read from the database file.
35760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
35761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an IO error occurs, then the IO error is returned to the caller.
35762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, SQLITE_OK is returned.
35763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int readDbPage(PgHdr *pPg){
35765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */
35766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pgno pgno = pPg->pgno; /* Page number to read */
35767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Return code */
35768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isInWal = 0; /* True if page is in log file */
35769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int pgsz = pPager->pageSize; /* Number of bytes to read */
35770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPager->state>=PAGER_SHARED && !MEMDB );
35772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( isOpen(pPager->fd) );
35773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( NEVER(!isOpen(pPager->fd)) ){
35775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPager->tempFile );
35776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pPg->pData, 0, pPager->pageSize);
35777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
35778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
35781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Try to pull the page from the write-ahead log. */
35782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalRead(pPager->pWal, pgno, &isInWal, pgsz, pPg->pData);
35783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && !isInWal ){
35785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 iOffset = (pgno-1)*(i64)pPager->pageSize;
35786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsRead(pPager->fd, pPg->pData, pgsz, iOffset);
35787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_IOERR_SHORT_READ ){
35788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
35789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pgno==1 ){
35793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ){
35794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the read is unsuccessful, set the dbFileVers[] to something
35795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that will never be a valid file version. dbFileVers[] is a copy
35796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of bytes 24..39 of the database. Bytes 28..31 should always be
35797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zero or the size of the database in page. Bytes 32..35 and 35..39
35798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** should be page numbers which are never 0xffffffff. So filling
35799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pPager->dbFileVers[] with all 0xff bytes should suffice.
35800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
35801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For an encrypted database, the situation is more complex: bytes
35802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 24..39 of the database are white noise. But the probability of
35803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** white noising equaling 16 bytes of 0xff is vanishingly small so
35804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** we should still be ok.
35805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers));
35807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
35808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *dbFileVers = &((u8*)pPg->pData)[24];
35809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers));
35810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CODEC1(pPager, pPg->pData, pgno, 3, rc = SQLITE_NOMEM);
35813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PAGER_INCR(sqlite3_pager_readdb_count);
35815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PAGER_INCR(pPager->nRead);
35816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ IOTRACE(("PGIN %p %d\n", pPager, pgno));
35817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PAGERTRACE(("FETCH %d page %d hash(%08x)\n",
35818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PAGERID(pPager), pgno, pager_pagehash(pPg)));
35819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
35821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
35824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
35825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is invoked once for each page that has already been
35826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** written into the log file when a WAL transaction is rolled back.
35827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Parameter iPg is the page number of said page. The pCtx argument
35828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is actually a pointer to the Pager structure.
35829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
35830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If page iPg is present in the cache, and has no outstanding references,
35831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it is discarded. Otherwise, if there are one or more outstanding
35832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** references, the page content is reloaded from the database. If the
35833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** attempt to reload content from the database is required and fails,
35834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** return an SQLite error code. Otherwise, SQLITE_OK.
35835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int pagerUndoCallback(void *pCtx, Pgno iPg){
35837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
35838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pager *pPager = (Pager *)pCtx;
35839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *pPg;
35840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPg = sqlite3PagerLookup(pPager, iPg);
35842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPg ){
35843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3PcachePageRefcount(pPg)==1 ){
35844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3PcacheDrop(pPg);
35845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
35846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = readDbPage(pPg);
35847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
35848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->xReiniter(pPg);
35849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3PagerUnref(pPg);
35851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Normally, if a transaction is rolled back, any backup processes are
35855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** updated as data is copied out of the rollback journal and into the
35856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** database. This is not generally possible with a WAL database, as
35857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** rollback involves simply truncating the log file. Therefore, if one
35858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or more frames have already been written to the log (and therefore
35859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** also copied into the backup databases) as part of this transaction,
35860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the backups must be restarted.
35861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3BackupRestart(pPager->pBackup);
35863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
35865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
35868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called to rollback a transaction on a WAL database.
35869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int pagerRollbackWal(Pager *pPager){
35871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return Code */
35872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *pList; /* List of dirty pages to revert */
35873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* For all pages in the cache that are currently dirty or have already
35875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** been written (but not committed) to the log file, do one of the
35876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** following:
35877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
35878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** + Discard the cached page (if refcount==0), or
35879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** + Reload page content from the database (if refcount>0).
35880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->dbSize = pPager->dbOrigSize;
35882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager);
35883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pList = sqlite3PcacheDirtyList(pPager->pPCache);
35884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pList && rc==SQLITE_OK ){
35885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *pNext = pList->pDirty;
35886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pagerUndoCallback((void *)pPager, pList->pgno);
35887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pList = pNext;
35888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
35891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
35894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is a wrapper around sqlite3WalFrames(). As well as logging
35895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the contents of the list of pages headed by pList (connected by pDirty),
35896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this function notifies any active backup processes that the pages have
35897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** changed.
35898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int pagerWalFrames(
35900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pager *pPager, /* Pager object */
35901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *pList, /* List of frames to log */
35902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pgno nTruncate, /* Database size after this commit */
35903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isCommit, /* True if this is a commit */
35904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sync_flags /* Flags to pass to OsSync() (or 0) */
35905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
35906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
35907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPager->pWal );
35909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalFrames(pPager->pWal,
35910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->pageSize, pList, nTruncate, isCommit, sync_flags
35911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
35912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && pPager->pBackup ){
35913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *p;
35914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=pList; p; p=p->pDirty){
35915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData);
35916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
35919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
35922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Begin a read transaction on the WAL.
35923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
35924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine used to be called "pagerOpenSnapshot()" because it essentially
35925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** makes a snapshot of the database at the current point in time and preserves
35926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that snapshot for use by the reader in spite of concurrently changes by
35927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** other writers or checkpointers.
35928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int pagerBeginReadTransaction(Pager *pPager){
35930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
35931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int changed = 0; /* True if cache must be reset */
35932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pagerUseWal(pPager) );
35934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* sqlite3WalEndReadTransaction() was not called for the previous
35936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** transaction in locking_mode=EXCLUSIVE. So call it now. If we
35937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are in locking_mode=NORMAL and EndRead() was previously called,
35938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the duplicate call is harmless.
35939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3WalEndReadTransaction(pPager->pWal);
35941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed);
35943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
35944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int dummy;
35945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( changed ){
35946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pager_reset(pPager);
35947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPager->errCode || pPager->dbSizeValid==0 );
35948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3PagerPagecount(pPager, &dummy);
35950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->state = PAGER_SHARED;
35952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
35954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
35957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Check if the *-wal file that corresponds to the database opened by pPager
35958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** exists. Assuming no error occurs, set *pExists to 1 if the file exists,
35959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or 0 otherwise and return SQLITE_OK. If an IO or OOM error occurs, return
35960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an SQLite error code.
35961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int pagerHasWAL(Pager *pPager, int *pExists){
35963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
35964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zWal; /* Name of the WAL file */
35965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !pPager->tempFile );
35967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zWal = sqlite3_mprintf("%s-wal", pPager->zFilename);
35968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !zWal ){
35969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_NOMEM;
35970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
35971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsAccess(pPager->pVfs, zWal, SQLITE_ACCESS_EXISTS, pExists);
35972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(zWal);
35973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
35975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
35978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Check if the *-wal file that corresponds to the database opened by pPager
35979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** exists. If it does, open the pager in WAL mode. Otherwise, if no error
35980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** occurs, make sure Pager.journalMode is not set to PAGER_JOURNALMODE_WAL.
35981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an IO or OOM error occurs, return an SQLite error code.
35982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
35983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the WAL file is opened, also open a snapshot (read transaction).
35984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
35985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The caller must hold a SHARED lock on the database file to call this
35986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function. Because an EXCLUSIVE lock on the db file is required to delete
35987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a WAL, this ensures there is no race condition between the xAccess()
35988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** below and an xDelete() being executed by some other connection.
35989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
35990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int pagerOpenWalIfPresent(Pager *pPager){
35991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
35992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pPager->tempFile ){
35993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isWal; /* True if WAL file exists */
35994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pagerHasWAL(pPager, &isWal);
35995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
35996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isWal ){
35997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pager_reset(pPager);
35998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3PagerOpenWal(pPager, 0);
35999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
36000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pagerBeginReadTransaction(pPager);
36001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( pPager->journalMode==PAGER_JOURNALMODE_WAL ){
36003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->journalMode = PAGER_JOURNALMODE_DELETE;
36004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
36008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
36010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
34478 36011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
34479 36012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Playback savepoint pSavepoint. Or, if pSavepoint==NULL, then playback
34480 36013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the entire master journal file. The case pSavepoint==NULL occurs when
34481 36014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a ROLLBACK TO command is invoked on a SAVEPOINT that is a transaction
34482 36015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** savepoint.
@@ -34529,26 +36062,31 @@
34529 36062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
34530 36063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Set the database size back to the value it was before the savepoint
34531 36064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** being reverted was opened.
34532 36065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
34533 36066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->dbSize = pSavepoint ? pSavepoint->nOrig : pPager->dbOrigSize;
36067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pSavepoint && pagerUseWal(pPager) ){
36069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return pagerRollbackWal(pPager);
36070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
34534 36071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
34535 36072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Use pPager->journalOff as the effective size of the main rollback
34536 36073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** journal. The actual file might be larger than this in
34537 36074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PAGER_JOURNALMODE_TRUNCATE or PAGER_JOURNALMODE_PERSIST. But anything
34538 36075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** past pPager->journalOff is off-limits to us.
34539 36076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
34540 36077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
szJ = pPager->journalOff;
36078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pagerUseWal(pPager)==0 || szJ==0 );
34541 36079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
34542 36080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Begin by rolling back records from the main journal starting at
34543 36081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PagerSavepoint.iOffset and continuing to the next journal header.
34544 36082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** There might be records in the main journal that have a page number
34545 36083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** greater than the current database size (pPager->dbSize) but those
34546 36084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will be skipped automatically. Pages are added to pDone as they
34547 36085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** are played back.
34548 36086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
34549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pSavepoint ){
36087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSavepoint && !pagerUseWal(pPager) ){
34550 36088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iHdrOff = pSavepoint->iHdrOffset ? pSavepoint->iHdrOffset : szJ;
34551 36089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalOff = pSavepoint->iOffset;
34552 36090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( rc==SQLITE_OK && pPager->journalOff<iHdrOff ){
34553 36091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pager_playback_one_page(pPager, &pPager->journalOff, pDone, 1, 1);
34554 36092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -34591,10 +36129,14 @@
34591 36129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will be skipped. Out-of-range pages are also skipped.
34592 36130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
34593 36131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pSavepoint ){
34594 36132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u32 ii; /* Loop counter */
34595 36133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i64 offset = pSavepoint->iSubRec*(4+pPager->pageSize);
36134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
36136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData);
36137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
34596 36138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && ii<pPager->nSubRec; ii++){
34597 36139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( offset==ii*(4+pPager->pageSize) );
34598 36140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1);
34599 36141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
34600 36142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( rc!=SQLITE_DONE );
@@ -34602,10 +36144,11 @@
34602 36144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
34603 36145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BitvecDestroy(pDone);
34604 36146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
34605 36147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalOff = szJ;
34606 36148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
34607 36150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
34608 36151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
34609 36152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
34610 36153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
34611 36154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Change the maximum number of in-memory pages that are allowed.
@@ -34818,12 +36361,14 @@
34818 36361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){
34819 36362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nPage;
34820 36363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( mxPage>0 ){
34821 36364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->mxPgno = mxPage;
34822 36365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
34823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3PagerPagecount(pPager, &nPage);
34824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pPager->mxPgno>=nPage );
36366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPager->state!=PAGER_UNLOCK ){
36367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3PagerPagecount(pPager, &nPage);
36368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPager->mxPgno>=nPage );
36369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
34825 36370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return pPager->mxPgno;
34826 36371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
34827 36372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
34828 36373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
34829 36374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The following set of routines are used to disable the simulated
@@ -34865,10 +36410,26 @@
34865 36410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
34866 36411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned char *pDest){
34867 36412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
34868 36413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(pDest, 0, N);
34869 36414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( isOpen(pPager->fd) || pPager->tempFile );
36415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This routine is only called by btree immediately after creating
36417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the Pager object. There has not been an opportunity to transition
36418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to WAL mode yet.
36419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
36420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !pagerUseWal(pPager) );
36421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0
36422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
36423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isInWal = 0;
36424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalRead(pPager->pWal, 1, &isInWal, N, pDest);
36425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK || isInWal ){
36426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
36427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
36430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
34870 36431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isOpen(pPager->fd) ){
34871 36432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOTRACE(("DBHDR %p 0 %d\n", pPager, N))
34872 36433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3OsRead(pPager->fd, pDest, N, 0);
34873 36434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_IOERR_SHORT_READ ){
34874 36435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_OK;
@@ -34891,28 +36452,36 @@
34891 36452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
34892 36453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Otherwise, if everything is successful, then SQLITE_OK is returned
34893 36454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and *pnPage is set to the number of pages in the database.
34894 36455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
34895 36456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerPagecount(Pager *pPager, int *pnPage){
34896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Pgno nPage; /* Value to return via *pnPage */
36457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pgno nPage = 0; /* Value to return via *pnPage */
34897 36458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
34898 36459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Determine the number of pages in the file. Store this in nPage. */
34899 36460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPager->dbSizeValid ){
34900 36461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nPage = pPager->dbSize;
34901 36462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
34902 36463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc; /* Error returned by OsFileSize() */
34903 36464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i64 n = 0; /* File size in bytes returned by OsFileSize() */
34904 36465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
34905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( isOpen(pPager->fd) || pPager->tempFile );
34906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( isOpen(pPager->fd) && (0 != (rc = sqlite3OsFileSize(pPager->fd, &n))) ){
34907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pager_error(pPager, rc);
34908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
34909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
34910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( n>0 && n<pPager->pageSize ){
34911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nPage = 1;
34912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
34913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nPage = (Pgno)(n / pPager->pageSize);
36466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) && pPager->state!=PAGER_UNLOCK ){
36467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3WalDbsize(pPager->pWal, &nPage);
36468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nPage==0 ){
36471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( isOpen(pPager->fd) || pPager->tempFile );
36472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isOpen(pPager->fd) ){
36473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SQLITE_OK!=(rc = sqlite3OsFileSize(pPager->fd, &n)) ){
36474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pager_error(pPager, rc);
36475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
36476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n>0 && n<pPager->pageSize ){
36479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nPage = 1;
36480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
36481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nPage = (Pgno)(n / pPager->pageSize);
36482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
34914 36483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
34915 36484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPager->state!=PAGER_UNLOCK ){
34916 36485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->dbSize = nPage;
34917 36486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->dbFileSize = nPage;
34918 36487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->dbSizeValid = 1;
@@ -35030,10 +36599,11 @@
35030 36599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->dbSize>=nPage );
35031 36600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->state>=PAGER_RESERVED );
35032 36601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->dbSize = nPage;
35033 36602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assertTruncateConstraint(pPager);
35034 36603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35035 36605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35036 36606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
35037 36607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is called before attempting a hot-journal rollback. It
35038 36608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** syncs the journal file to disk, then sets pPager->journalHdr to the
35039 36609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** size of the journal file so that the pager_playback() routine knows
@@ -35071,14 +36641,23 @@
35071 36641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is made to roll it back. If an error occurs during the rollback
35072 36642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a hot journal may be left in the filesystem but no error is returned
35073 36643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to the caller.
35074 36644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
35075 36645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager){
36646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *pTmp = (u8 *)pPager->pTmpSpace;
36647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35076 36648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
disable_simulated_io_errors();
35077 36649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BeginBenignMalloc();
35078 36650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->errCode = 0;
35079 36651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->exclusiveMode = 0;
36652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
36653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3WalClose(pPager->pWal,
36654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (pPager->noSync ? 0 : pPager->sync_flags),
36655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->pageSize, pTmp
36656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
36657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->pWal = 0;
36658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
35080 36659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pager_reset(pPager);
35081 36660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( MEMDB ){
35082 36661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pager_unlock(pPager);
35083 36662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
35084 36663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Set Pager.journalHdr to -1 for the benefit of the pager_playback()
@@ -35095,11 +36674,11 @@
35095 36674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3EndBenignMalloc();
35096 36675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
enable_simulated_io_errors();
35097 36676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PAGERTRACE(("CLOSE %d\n", PAGERID(pPager)));
35098 36677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOTRACE(("CLOSE %p\n", pPager))
35099 36678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3OsClose(pPager->fd);
35100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3PageFree(pPager->pTmpSpace);
36679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3PageFree(pTmp);
35101 36680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3PcacheClose(pPager->pPCache);
35102 36681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35103 36682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_HAS_CODEC
35104 36683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec);
35105 36684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
@@ -35196,14 +36775,14 @@
35196 36775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** as a temporary buffer to inspect the first couple of bytes of
35197 36776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the potential journal header.
35198 36777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
35199 36778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i64 iNextHdrOffset;
35200 36779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 aMagic[8];
35201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u8 zHeader[sizeof(aJournalMagic)+4];
36780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 zHeader[sizeof(aJournalMagic)+4];
35202 36781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic));
35204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- put32bits(&zHeader[sizeof(aJournalMagic)], pPager->nRec);
36782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic));
36783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ put32bits(&zHeader[sizeof(aJournalMagic)], pPager->nRec);
35205 36784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35206 36785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iNextHdrOffset = journalHdrOffset(pPager);
35207 36786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3OsRead(pPager->jfd, aMagic, 8, iNextHdrOffset);
35208 36787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK && 0==memcmp(aMagic, aJournalMagic, 8) ){
35209 36788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const u8 zerobyte = 0;
@@ -35231,11 +36810,11 @@
35231 36810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) return rc;
35232 36811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35233 36812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOTRACE(("JHDR %p %lld\n", pPager, pPager->journalHdr));
35234 36813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3OsWrite(
35235 36814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->jfd, zHeader, sizeof(zHeader), pPager->journalHdr
35236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
36815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
35237 36816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) return rc;
35238 36817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35239 36818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){
35240 36819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager)));
35241 36820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IOTRACE(("JSYNC %p\n", pPager))
@@ -35311,10 +36890,11 @@
35311 36890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is unchanged and we can rollback without having to playback the
35312 36891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** journal into the original database file. Once we transition to
35313 36892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** EXCLUSIVE, it means the database file has been changed and any rollback
35314 36893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will require a journal playback.
35315 36894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
36895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !pagerUseWal(pList->pPager) );
35316 36896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->state>=PAGER_RESERVED );
35317 36897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
35318 36898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35319 36899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the file is a temp-file has not yet been opened, open it now. It
35320 36900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is not possible for rc to be other than SQLITE_OK if this branch
@@ -35322,10 +36902,18 @@
35322 36902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
35323 36903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !isOpen(pPager->fd) ){
35324 36904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->tempFile && rc==SQLITE_OK );
35325 36905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags);
35326 36906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Before the first write, give the VFS a hint of what the final
36909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file size will be.
36910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
36911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPager->dbSize > (pPager->dbOrigSize+1) && isOpen(pPager->fd) ){
36912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize;
36913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile);
36914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35327 36915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35328 36916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( rc==SQLITE_OK && pList ){
35329 36917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Pgno pgno = pList->pgno;
35330 36918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35331 36919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there are dirty pages in the page cache with page numbers greater
@@ -35374,10 +36962,30 @@
35374 36962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pList = pList->pDirty;
35375 36963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35376 36964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35377 36965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
35378 36966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
36969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Ensure that the sub-journal file is open. If it is already open, this
36970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function is a no-op.
36971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
36972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_OK is returned if everything goes according to plan. An
36973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_IOERR_XXX error code is returned if a call to sqlite3OsOpen()
36974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fails.
36975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
36976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int openSubJournal(Pager *pPager){
36977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
36978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !isOpen(pPager->sjfd) ){
36979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){
36980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3MemJournalOpen(pPager->sjfd);
36981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
36982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pagerOpentemp(pPager, pPager->sjfd, SQLITE_OPEN_SUBJOURNAL);
36983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
36986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35379 36987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35380 36988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
35381 36989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Append a record of the current state of page pPg to the sub-journal.
35382 36990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** It is the callers responsibility to use subjRequiresPage() to check
35383 36991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that it is really required before calling this function.
@@ -35391,32 +36999,44 @@
35391 36999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** bitvec.
35392 37000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
35393 37001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int subjournalPage(PgHdr *pPg){
35394 37002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
35395 37003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Pager *pPager = pPg->pPager;
35396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( isOpen(pPager->sjfd) ){
35397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void *pData = pPg->pData;
35398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i64 offset = pPager->nSubRec*(4+pPager->pageSize);
35399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pData2;
35400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2);
35402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno));
35403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize );
35405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = write32bits(pPager->sjfd, offset, pPg->pgno);
37004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
37005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Open the sub-journal, if it has not already been opened */
37007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPager->useJournal );
37008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( isOpen(pPager->jfd) || pagerUseWal(pPager) );
37009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 );
37010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pagerUseWal(pPager)
37011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || pageInJournal(pPg)
37012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || pPg->pgno>pPager->dbOrigSize
37013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
37014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = openSubJournal(pPager);
37015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the sub-journal was opened successfully (or was already open),
37017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** write the journal record into the file. */
35406 37018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
35407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4);
37019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pData = pPg->pData;
37020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 offset = pPager->nSubRec*(4+pPager->pageSize);
37021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pData2;
37022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2);
37024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno));
37025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = write32bits(pPager->sjfd, offset, pPg->pgno);
37026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
37027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4);
37028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35408 37029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35409 37030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35410 37031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
35411 37032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->nSubRec++;
35412 37033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->nSavepoint>0 );
35413 37034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = addToSavepointBitvecs(pPager, pPg->pgno);
35414 37035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35415 37036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
35416 37037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35418 37038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35419 37039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
35420 37040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is called by the pcache layer when it has reached some
35421 37041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** soft memory limit. The first argument is a pointer to a Pager object
35422 37042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (cast as a void*). The pager is always 'purgeable' (not an in-memory
@@ -35440,78 +37060,88 @@
35440 37060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
35441 37061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35442 37062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPg->pPager==pPager );
35443 37063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPg->flags&PGHDR_DIRTY );
35444 37064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The doNotSync flag is set by the sqlite3PagerWrite() function while it
35446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is journalling a set of two or more database pages that are stored
35447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** on the same disk sector. Syncing the journal is not allowed while
35448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** this is happening as it is important that all members of such a
35449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** set of pages are synced to disk together. So, if the page this function
35450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is trying to make clean will require a journal sync and the doNotSync
35451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** flag is set, return without doing anything. The pcache layer will
35452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** just have to go ahead and allocate a new page buffer instead of
35453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** reusing pPg.
35454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
35455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Similarly, if the pager has already entered the error state, do not
35456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** try to write the contents of pPg to disk.
35457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
35458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( NEVER(pPager->errCode)
35459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || (pPager->doNotSync && pPg->flags&PGHDR_NEED_SYNC)
35460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
35461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
35462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
35463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Sync the journal file if required. */
35465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pPg->flags&PGHDR_NEED_SYNC ){
35466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = syncJournal(pPager);
35467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && pPager->fullSync &&
35468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- !(pPager->journalMode==PAGER_JOURNALMODE_MEMORY) &&
35469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- !(sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND)
35470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
35471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPager->nRec = 0;
35472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = writeJournalHdr(pPager);
35473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
35474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
35475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If the page number of this page is larger than the current size of
35477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the database image, it may need to be written to the sub-journal.
35478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This is because the call to pager_write_pagelist() below will not
35479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** actually write data to the file in this case.
35480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
35481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Consider the following sequence of events:
35482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
35483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** BEGIN;
35484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** <journal page X>
35485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** <modify page X>
35486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** SAVEPOINT sp;
35487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** <shrink database file to Y pages>
35488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** pagerStress(page X)
35489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** ROLLBACK TO sp;
35490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
35491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If (X>Y), then when pagerStress is called page X will not be written
35492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** out to the database file, but will be dropped from the cache. Then,
35493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** following the "ROLLBACK TO sp" statement, reading page X will read
35494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** data from the database file. This will be the copy of page X as it
35495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** was when the transaction started, not as it was when "SAVEPOINT sp"
35496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** was executed.
35497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
35498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The solution is to write the current data for page X into the
35499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sub-journal file now (if it is not already there), so that it will
35500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** be restored to its current value when the "ROLLBACK TO sp" is
35501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** executed.
35502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
35503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( NEVER(
35504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc==SQLITE_OK && pPg->pgno>pPager->dbSize && subjRequiresPage(pPg)
35505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ) ){
35506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = subjournalPage(pPg);
35507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
35508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Write the contents of the page out to the database file. */
35510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
35511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPg->pDirty = 0;
35512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = pager_write_pagelist(pPg);
37065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPg->pDirty = 0;
37066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
37067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Write a single frame for this page to the log. */
37068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( subjRequiresPage(pPg) ){
37069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = subjournalPage(pPg);
37070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
37071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
37072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pagerWalFrames(pPager, pPg, 0, 0, 0);
37073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
37074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
37075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The doNotSync flag is set by the sqlite3PagerWrite() function while it
37076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is journalling a set of two or more database pages that are stored
37077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** on the same disk sector. Syncing the journal is not allowed while
37078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this is happening as it is important that all members of such a
37079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** set of pages are synced to disk together. So, if the page this function
37080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is trying to make clean will require a journal sync and the doNotSync
37081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** flag is set, return without doing anything. The pcache layer will
37082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** just have to go ahead and allocate a new page buffer instead of
37083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** reusing pPg.
37084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
37085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Similarly, if the pager has already entered the error state, do not
37086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** try to write the contents of pPg to disk.
37087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
37088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( NEVER(pPager->errCode)
37089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (pPager->doNotSync && pPg->flags&PGHDR_NEED_SYNC)
37090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
37091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
37092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
37093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Sync the journal file if required. */
37095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPg->flags&PGHDR_NEED_SYNC ){
37096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = syncJournal(pPager);
37097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && pPager->fullSync &&
37098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ !(pPager->journalMode==PAGER_JOURNALMODE_MEMORY) &&
37099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ !(sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND)
37100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
37101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->nRec = 0;
37102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = writeJournalHdr(pPager);
37103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
37104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
37105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the page number of this page is larger than the current size of
37107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the database image, it may need to be written to the sub-journal.
37108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is because the call to pager_write_pagelist() below will not
37109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** actually write data to the file in this case.
37110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
37111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Consider the following sequence of events:
37112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
37113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** BEGIN;
37114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <journal page X>
37115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <modify page X>
37116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SAVEPOINT sp;
37117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <shrink database file to Y pages>
37118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pagerStress(page X)
37119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ROLLBACK TO sp;
37120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
37121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If (X>Y), then when pagerStress is called page X will not be written
37122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** out to the database file, but will be dropped from the cache. Then,
37123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** following the "ROLLBACK TO sp" statement, reading page X will read
37124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** data from the database file. This will be the copy of page X as it
37125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** was when the transaction started, not as it was when "SAVEPOINT sp"
37126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** was executed.
37127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
37128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The solution is to write the current data for page X into the
37129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sub-journal file now (if it is not already there), so that it will
37130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be restored to its current value when the "ROLLBACK TO sp" is
37131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** executed.
37132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
37133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( NEVER(
37134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc==SQLITE_OK && pPg->pgno>pPager->dbSize && subjRequiresPage(pPg)
37135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) ){
37136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = subjournalPage(pPg);
37137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
37138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Write the contents of the page out to the database file. */
37140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
37141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pager_write_pagelist(pPg);
37142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
35513 37143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35514 37144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35515 37145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Mark the page as clean. */
35516 37146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
35517 37147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PAGERTRACE(("STRESS %d page %d\n", PAGERID(pPager), pPg->pgno));
@@ -35915,71 +37545,10 @@
35915 37545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35916 37546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35917 37547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
35918 37548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35919 37549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
35921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Read the content for page pPg out of the database file and into
35922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** pPg->pData. A shared lock or greater must be held on the database
35923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** file before this function is called.
35924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
35925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If page 1 is read, then the value of Pager.dbFileVers[] is set to
35926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the value read from the database file.
35927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
35928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If an IO error occurs, then the IO error is returned to the caller.
35929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Otherwise, SQLITE_OK is returned.
35930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
35931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int readDbPage(PgHdr *pPg){
35932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */
35933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Pgno pgno = pPg->pgno; /* Page number to read */
35934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc; /* Return code */
35935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i64 iOffset; /* Byte offset of file to read from */
35936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pPager->state>=PAGER_SHARED && !MEMDB );
35938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( isOpen(pPager->fd) );
35939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( NEVER(!isOpen(pPager->fd)) ){
35941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pPager->tempFile );
35942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(pPg->pData, 0, pPager->pageSize);
35943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
35944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
35945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iOffset = (pgno-1)*(i64)pPager->pageSize;
35946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3OsRead(pPager->fd, pPg->pData, pPager->pageSize, iOffset);
35947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_IOERR_SHORT_READ ){
35948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_OK;
35949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
35950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pgno==1 ){
35951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc ){
35952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If the read is unsuccessful, set the dbFileVers[] to something
35953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** that will never be a valid file version. dbFileVers[] is a copy
35954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of bytes 24..39 of the database. Bytes 28..31 should always be
35955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** zero. Bytes 32..35 and 35..39 should be page numbers which are
35956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** never 0xffffffff. So filling pPager->dbFileVers[] with all 0xff
35957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** bytes should suffice.
35958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
35959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** For an encrypted database, the situation is more complex: bytes
35960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** 24..39 of the database are white noise. But the probability of
35961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** white noising equaling 16 bytes of 0xff is vanishingly small so
35962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** we should still be ok.
35963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
35964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers));
35965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
35966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u8 *dbFileVers = &((u8*)pPg->pData)[24];
35967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers));
35968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
35969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
35970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- CODEC1(pPager, pPg->pData, pgno, 3, rc = SQLITE_NOMEM);
35971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- PAGER_INCR(sqlite3_pager_readdb_count);
35973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- PAGER_INCR(pPager->nRead);
35974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- IOTRACE(("PGIN %p %d\n", pPager, pgno));
35975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- PAGERTRACE(("FETCH %d page %d hash(%08x)\n",
35976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- PAGERID(pPager), pgno, pager_pagehash(pPg)));
35977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
35979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
35980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
35981 37550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
35982 37551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is called to obtain a shared lock on the database file.
35983 37552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** It is illegal to call sqlite3PagerAcquire() until after this function
35984 37553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** has been successfully called. If a shared-lock is already held when
35985 37554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** this function is called, it is a no-op.
@@ -36029,11 +37598,13 @@
36029 37598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36030 37599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->errCode = SQLITE_OK;
36031 37600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pager_reset(pPager);
36032 37601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36033 37602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pPager->state==PAGER_UNLOCK || isErrorReset ){
37603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
37604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pagerBeginReadTransaction(pPager);
37605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( pPager->state==PAGER_UNLOCK || isErrorReset ){
36035 37606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vfs * const pVfs = pPager->pVfs;
36036 37607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isHotJournal = 0;
36037 37608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !MEMDB );
36038 37609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( sqlite3PcacheRefCount(pPager->pPCache)==0 );
36039 37610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPager->noReadlock ){
@@ -36118,11 +37689,11 @@
36118 37689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** rollback journal at this time. */
36119 37690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalStarted = 0;
36120 37691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalOff = 0;
36121 37692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->setMaster = 0;
36122 37693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalHdr = 0;
36123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36124 37695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Make sure the journal file has been synced to disk. */
36125 37696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36126 37697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Playback and delete the journal. Drop the database write
36127 37698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** lock and reacquire the read lock. Purge the cache before
36128 37699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** playing back the hot-journal so that we don't end up with
@@ -36185,10 +37756,15 @@
36185 37756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){
36186 37757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pager_reset(pPager);
36187 37758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36188 37759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36189 37760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->exclusiveMode || pPager->state==PAGER_SHARED );
37761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If there is a WAL file in the file-system, open this database in WAL
37763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mode. Otherwise, the following function call is a no-op.
37764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
37765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pagerOpenWalIfPresent(pPager);
36190 37766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36191 37767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36192 37768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
failed:
36193 37769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
36194 37770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* pager_unlock() is a no-op for exclusive mode and in-memory databases. */
@@ -36325,12 +37901,12 @@
36325 37901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto pager_acquire_err;
36326 37902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36327 37903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36328 37904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( MEMDB || nMax<(int)pgno || noContent || !isOpen(pPager->fd) ){
36329 37905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pgno>pPager->mxPgno ){
36330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_FULL;
36331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto pager_acquire_err;
37906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_FULL;
37907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto pager_acquire_err;
36332 37908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36333 37909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( noContent ){
36334 37910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Failure to set the bits in the InJournal bit-vectors is benign.
36335 37911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** It merely means that we might do some extra work to journal a
36336 37912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** page that does not need to be journaled. Nevertheless, be sure
@@ -36410,31 +37986,10 @@
36410 37986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3PcacheRelease(pPg);
36411 37987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pagerUnlockIfUnused(pPager);
36412 37988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36413 37989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36414 37990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
36416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If the main journal file has already been opened, ensure that the
36417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sub-journal file is open too. If the main journal is not open,
36418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** this function is a no-op.
36419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
36420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** SQLITE_OK is returned if everything goes according to plan.
36421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** An SQLITE_IOERR_XXX error code is returned if a call to
36422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sqlite3OsOpen() fails.
36423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
36424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int openSubJournal(Pager *pPager){
36425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK;
36426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( isOpen(pPager->jfd) && !isOpen(pPager->sjfd) ){
36427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){
36428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3MemJournalOpen(pPager->sjfd);
36429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
36430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = pagerOpentemp(pPager, pPager->sjfd, SQLITE_OPEN_SUBJOURNAL);
36431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
36432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
36433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
36434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
36435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
36436 37991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
36437 37992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is called at the start of every write transaction.
36438 37993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** There must already be a RESERVED or EXCLUSIVE lock on the database
36439 37994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file when this routine is called.
36440 37995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -36513,13 +38068,10 @@
36513 38068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalOff = 0;
36514 38069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->setMaster = 0;
36515 38070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->journalHdr = 0;
36516 38071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = writeJournalHdr(pPager);
36517 38072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && pPager->nSavepoint ){
36519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = openSubJournal(pPager);
36520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
36521 38073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36522 38074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
36523 38075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BitvecDestroy(pPager->pInJournal);
36524 38076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->pInJournal = 0;
36525 38077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -36553,24 +38105,60 @@
36553 38105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
36554 38106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){
36555 38107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
36556 38108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->state!=PAGER_UNLOCK );
36557 38109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->subjInMemory = (u8)subjInMemory;
38110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36558 38111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPager->state==PAGER_SHARED ){
36559 38112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->pInJournal==0 );
36560 38113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !MEMDB && !pPager->tempFile );
36561 38114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Obtain a RESERVED lock on the database file. If the exFlag parameter
36563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is true, then immediately upgrade this to an EXCLUSIVE lock. The
36564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** busy-handler callback can be used when upgrading to the EXCLUSIVE
36565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** lock, but not when obtaining the RESERVED lock.
36566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
36567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3OsLock(pPager->fd, RESERVED_LOCK);
36568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
36569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPager->state = PAGER_RESERVED;
36570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( exFlag ){
36571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
38115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
38116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the pager is configured to use locking_mode=exclusive, and an
38117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** exclusive lock on the database is not already held, obtain it now.
38118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
38119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, -1) ){
38120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsLock(pPager->fd, EXCLUSIVE_LOCK);
38121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->state = PAGER_SHARED;
38122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
38123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
38124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3WalExclusiveMode(pPager->pWal, 1);
38126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Grab the write lock on the log file. If successful, upgrade to
38129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** PAGER_RESERVED state. Otherwise, return an error code to the caller.
38130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The busy-handler is not invoked if another connection already
38131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** holds the write-lock. If possible, the upper layer will call it.
38132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
38133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL mode sets Pager.state to PAGER_RESERVED when it has an open
38134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** transaction, but never to PAGER_EXCLUSIVE. This is because in
38135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** PAGER_EXCLUSIVE state the code to roll back savepoint transactions
38136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** may copy data from the sub-journal into the database file as well
38137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** as into the page cache. Which would be incorrect in WAL mode.
38138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
38139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalBeginWriteTransaction(pPager->pWal);
38140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
38141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->dbOrigSize = pPager->dbSize;
38142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->state = PAGER_RESERVED;
38143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->journalOff = 0;
38144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rc!=SQLITE_OK || pPager->state==PAGER_RESERVED );
38147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rc==SQLITE_OK || pPager->state==PAGER_SHARED );
38148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
38149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Obtain a RESERVED lock on the database file. If the exFlag parameter
38150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is true, then immediately upgrade this to an EXCLUSIVE lock. The
38151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** busy-handler callback can be used when upgrading to the EXCLUSIVE
38152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** lock, but not when obtaining the RESERVED lock.
38153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
38154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsLock(pPager->fd, RESERVED_LOCK);
38155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
38156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->state = PAGER_RESERVED;
38157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( exFlag ){
38158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
38159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
36572 38160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36573 38161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36574 38162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36575 38163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* No need to open the journal file at this time. It will be
36576 38164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** opened before it is written to. If we defer opening the journal,
@@ -36582,10 +38170,11 @@
36582 38170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** time a (read or write) transaction was successfully concluded
36583 38171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by this connection. Instead of deleting the journal file it was
36584 38172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** kept open and either was truncated to 0 bytes or its header was
36585 38173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** overwritten with zeros.
36586 38174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
38175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pagerUseWal(pPager)==0 );
36587 38176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->nRec==0 );
36588 38177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->dbOrigSize==0 );
36589 38178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->pInJournal==0 );
36590 38179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pager_open_journal(pPager);
36591 38180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -36636,10 +38225,11 @@
36636 38225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Mark the page as dirty. If the page has already been written
36637 38226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to the journal then we can return right away.
36638 38227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
36639 38228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3PcacheMakeDirty(pPg);
36640 38229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pageInJournal(pPg) && !subjRequiresPage(pPg) ){
38230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !pagerUseWal(pPager) );
36641 38231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->dbModified = 1;
36642 38232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
36643 38233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36644 38234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If we get this far, it means that the page needs to be
36645 38235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** written to the transaction journal or the ckeckpoint journal
@@ -36651,11 +38241,14 @@
36651 38241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
36652 38242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3PagerBegin(pPager, 0, pPager->subjInMemory);
36653 38243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
36654 38244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
36655 38245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
38246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !isOpen(pPager->jfd)
38247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && pPager->journalMode!=PAGER_JOURNALMODE_OFF
38248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && !pagerUseWal(pPager)
38249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
36657 38250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPager->useJournal );
36658 38251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pager_open_journal(pPager);
36659 38252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) return rc;
36660 38253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36661 38254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->dbModified = 1;
@@ -36663,10 +38256,11 @@
36663 38256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The transaction journal now exists and we have a RESERVED or an
36664 38257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** EXCLUSIVE lock on the main database file. Write the current page to
36665 38258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the transaction journal if it is not there already.
36666 38259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
36667 38260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !pageInJournal(pPg) && isOpen(pPager->jfd) ){
38261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !pagerUseWal(pPager) );
36668 38262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPg->pgno<=pPager->dbOrigSize ){
36669 38263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u32 cksum;
36670 38264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pData2;
36671 38265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36672 38266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* We should never write to the journal file the page that
@@ -36954,11 +38548,14 @@
36954 38548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Increment the value just read and write it back to byte 24. */
36955 38549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
change_counter = sqlite3Get4byte((u8*)pPager->dbFileVers);
36956 38550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
change_counter++;
36957 38551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
put32bits(((char*)pPgHdr->pData)+24, change_counter);
36958 38552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Also store the SQLite version number in bytes 96..99 */
38553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Also store the SQLite version number in bytes 96..99 and in
38554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bytes 92..95 store the change counter for which the version number
38555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is valid. */
38556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ put32bits(((char*)pPgHdr->pData)+92, change_counter);
36960 38557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
put32bits(((char*)pPgHdr->pData)+96, SQLITE_VERSION_NUMBER);
36961 38558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36962 38559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If running in direct mode, write the contents of page 1 to the file. */
36963 38560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( DIRECT_MODE ){
36964 38561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const void *zBuf = pPgHdr->pData;
@@ -37043,132 +38640,143 @@
37043 38640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** function has already been called, it is mostly a no-op. However, any
37044 38641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** backup in progress needs to be restarted.
37045 38642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
37046 38643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BackupRestart(pPager->pBackup);
37047 38644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( pPager->state!=PAGER_SYNCED && pPager->dbModified ){
37048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The following block updates the change-counter. Exactly how it
37050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** does this depends on whether or not the atomic-update optimization
37051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** was enabled at compile time, and if this transaction meets the
37052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** runtime criteria to use the operation:
37053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
37054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** * The file-system supports the atomic-write property for
37055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** blocks of size page-size, and
37056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** * This commit is not part of a multi-file transaction, and
37057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** * Exactly one page has been modified and store in the journal file.
37058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
37059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If the optimization was not enabled at compile time, then the
37060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** pager_incr_changecounter() function is called to update the change
37061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** counter in 'indirect-mode'. If the optimization is compiled in but
37062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is not applicable to this transaction, call sqlite3JournalCreate()
37063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to make sure the journal file has actually been created, then call
37064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** pager_incr_changecounter() to update the change-counter in indirect
37065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** mode.
37066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
37067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Otherwise, if the optimization is both enabled and applicable,
37068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** then call pager_incr_changecounter() to update the change-counter
37069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in 'direct' mode. In this case the journal file will never be
37070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** created for this transaction.
37071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
37072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_ATOMIC_WRITE
37073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- PgHdr *pPg;
37074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( isOpen(pPager->jfd) || pPager->journalMode==PAGER_JOURNALMODE_OFF );
37075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !zMaster && isOpen(pPager->jfd)
37076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && pPager->journalOff==jrnlBufferSize(pPager)
37077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && pPager->dbSize>=pPager->dbFileSize
37078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && (0==(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty)
37079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
37080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Update the db file change counter via the direct-write method. The
37081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** following call will modify the in-memory representation of page 1
37082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to include the updated change counter and then write page 1
37083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** directly to the database file. Because of the atomic-write
37084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** property of the host file-system, this is safe.
37085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
37086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = pager_incr_changecounter(pPager, 1);
37087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
37088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3JournalCreate(pPager->jfd);
37089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
37090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = pager_incr_changecounter(pPager, 0);
37091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
37092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
37093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
37094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = pager_incr_changecounter(pPager, 0);
37095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
37096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
37097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If this transaction has made the database smaller, then all pages
37099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** being discarded by the truncation must be written to the journal
37100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** file. This can only happen in auto-vacuum mode.
37101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
37102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Before reading the pages with page numbers larger than the
37103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** current value of Pager.dbSize, set dbSize back to the value
37104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** that it took at the start of the transaction. Otherwise, the
37105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** calls to sqlite3PagerGet() return zeroed pages instead of
37106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** reading data from the database file.
37107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
37108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** When journal_mode==OFF the dbOrigSize is always zero, so this
37109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** block never runs if journal_mode=OFF.
37110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
37111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifndef SQLITE_OMIT_AUTOVACUUM
37112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pPager->dbSize<pPager->dbOrigSize
37113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && ALWAYS(pPager->journalMode!=PAGER_JOURNALMODE_OFF)
37114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
37115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Pgno i; /* Iterator variable */
37116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const Pgno iSkip = PAGER_MJ_PGNO(pPager); /* Pending lock page */
37117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const Pgno dbSize = pPager->dbSize; /* Database image size */
37118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPager->dbSize = pPager->dbOrigSize;
37119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for( i=dbSize+1; i<=pPager->dbOrigSize; i++ ){
37120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !sqlite3BitvecTest(pPager->pInJournal, i) && i!=iSkip ){
37121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- PgHdr *pPage; /* Page to journal */
37122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3PagerGet(pPager, i, &pPage);
37123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
37124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3PagerWrite(pPage);
37125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3PagerUnref(pPage);
37126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
37127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
37128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
37129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPager->dbSize = dbSize;
37130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
37131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
37132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Write the master journal name into the journal file. If a master
37134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** journal file name has already been written to the journal file,
37135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** or if zMaster is NULL (no master journal), then this call is a no-op.
37136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
37137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = writeMasterJournal(pPager, zMaster);
37138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
37139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Sync the journal file. If the atomic-update optimization is being
37141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** used, this call will not create the journal file or perform any
37142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** real IO.
37143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
37144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = syncJournal(pPager);
37145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
37146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Write all dirty pages to the database file. */
37148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = pager_write_pagelist(sqlite3PcacheDirtyList(pPager->pPCache));
37149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ){
37150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( rc!=SQLITE_IOERR_BLOCKED );
37151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto commit_phase_one_exit;
37152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
37153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3PcacheCleanAll(pPager->pPCache);
37154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If the file on disk is not the same size as the database image,
37156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** then use pager_truncate to grow or shrink the file here.
37157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
37158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pPager->dbSize!=pPager->dbFileSize ){
37159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager));
37160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pPager->state>=PAGER_EXCLUSIVE );
37161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = pager_truncate(pPager, nNew);
37162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
37163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
37164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Finally, sync the database file. */
37166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !pPager->noSync && !noSync ){
37167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3OsSync(pPager->fd, pPager->sync_flags);
37168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
37169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- IOTRACE(("DBSYNC %p\n", pPager))
38645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
38646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache);
38647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pList ){
38648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1,
38649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (pPager->fullSync ? pPager->sync_flags : 0)
38650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
38651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
38653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3PcacheCleanAll(pPager->pPCache);
38654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
38656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The following block updates the change-counter. Exactly how it
38657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** does this depends on whether or not the atomic-update optimization
38658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** was enabled at compile time, and if this transaction meets the
38659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** runtime criteria to use the operation:
38660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
38661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * The file-system supports the atomic-write property for
38662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** blocks of size page-size, and
38663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * This commit is not part of a multi-file transaction, and
38664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Exactly one page has been modified and store in the journal file.
38665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
38666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the optimization was not enabled at compile time, then the
38667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pager_incr_changecounter() function is called to update the change
38668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** counter in 'indirect-mode'. If the optimization is compiled in but
38669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is not applicable to this transaction, call sqlite3JournalCreate()
38670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to make sure the journal file has actually been created, then call
38671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pager_incr_changecounter() to update the change-counter in indirect
38672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mode.
38673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
38674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, if the optimization is both enabled and applicable,
38675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then call pager_incr_changecounter() to update the change-counter
38676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in 'direct' mode. In this case the journal file will never be
38677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** created for this transaction.
38678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
38679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_ATOMIC_WRITE
38680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *pPg;
38681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( isOpen(pPager->jfd) || pPager->journalMode==PAGER_JOURNALMODE_OFF );
38682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !zMaster && isOpen(pPager->jfd)
38683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && pPager->journalOff==jrnlBufferSize(pPager)
38684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && pPager->dbSize>=pPager->dbFileSize
38685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (0==(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty)
38686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
38687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Update the db file change counter via the direct-write method. The
38688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** following call will modify the in-memory representation of page 1
38689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to include the updated change counter and then write page 1
38690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** directly to the database file. Because of the atomic-write
38691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** property of the host file-system, this is safe.
38692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
38693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pager_incr_changecounter(pPager, 1);
38694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
38695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3JournalCreate(pPager->jfd);
38696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
38697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pager_incr_changecounter(pPager, 0);
38698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
38701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pager_incr_changecounter(pPager, 0);
38702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
38703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
38704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If this transaction has made the database smaller, then all pages
38706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** being discarded by the truncation must be written to the journal
38707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file. This can only happen in auto-vacuum mode.
38708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
38709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Before reading the pages with page numbers larger than the
38710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current value of Pager.dbSize, set dbSize back to the value
38711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that it took at the start of the transaction. Otherwise, the
38712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** calls to sqlite3PagerGet() return zeroed pages instead of
38713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** reading data from the database file.
38714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
38715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When journal_mode==OFF the dbOrigSize is always zero, so this
38716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** block never runs if journal_mode=OFF.
38717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
38718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_AUTOVACUUM
38719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPager->dbSize<pPager->dbOrigSize
38720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && ALWAYS(pPager->journalMode!=PAGER_JOURNALMODE_OFF)
38721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
38722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pgno i; /* Iterator variable */
38723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const Pgno iSkip = PAGER_MJ_PGNO(pPager); /* Pending lock page */
38724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const Pgno dbSize = pPager->dbSize; /* Database image size */
38725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->dbSize = pPager->dbOrigSize;
38726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for( i=dbSize+1; i<=pPager->dbOrigSize; i++ ){
38727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !sqlite3BitvecTest(pPager->pInJournal, i) && i!=iSkip ){
38728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *pPage; /* Page to journal */
38729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3PagerGet(pPager, i, &pPage);
38730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
38731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3PagerWrite(pPage);
38732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3PagerUnref(pPage);
38733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
38734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->dbSize = dbSize;
38737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
38739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Write the master journal name into the journal file. If a master
38741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** journal file name has already been written to the journal file,
38742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or if zMaster is NULL (no master journal), then this call is a no-op.
38743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
38744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = writeMasterJournal(pPager, zMaster);
38745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
38746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Sync the journal file. If the atomic-update optimization is being
38748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used, this call will not create the journal file or perform any
38749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** real IO.
38750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
38751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = syncJournal(pPager);
38752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
38753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Write all dirty pages to the database file. */
38755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pager_write_pagelist(sqlite3PcacheDirtyList(pPager->pPCache));
38756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
38757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rc!=SQLITE_IOERR_BLOCKED );
38758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto commit_phase_one_exit;
38759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3PcacheCleanAll(pPager->pPCache);
38761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the file on disk is not the same size as the database image,
38763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then use pager_truncate to grow or shrink the file here.
38764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
38765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPager->dbSize!=pPager->dbFileSize ){
38766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager));
38767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPager->state>=PAGER_EXCLUSIVE );
38768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pager_truncate(pPager, nNew);
38769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
38770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Finally, sync the database file. */
38773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pPager->noSync && !noSync ){
38774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsSync(pPager->fd, pPager->sync_flags);
38775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ IOTRACE(("DBSYNC %p\n", pPager))
38777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
37170 38778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
37171 38779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->state = PAGER_SYNCED;
37172 38780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
37173 38781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
37174 38782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
commit_phase_one_exit:
@@ -37273,11 +38881,18 @@
37273 38881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** hot-journal rollback).
37274 38882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
37275 38883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){
37276 38884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK; /* Return code */
37277 38885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PAGERTRACE(("ROLLBACK %d\n", PAGERID(pPager)));
37278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !pPager->dbModified || !isOpen(pPager->jfd) ){
38886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
38887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc2;
38888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, -1);
38890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc2 = pager_end_transaction(pPager, pPager->setMaster);
38891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ) rc = rc2;
38892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pager_error(pPager, rc);
38893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( !pPager->dbModified || !isOpen(pPager->jfd) ){
37279 38894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pager_end_transaction(pPager, pPager->setMaster);
37280 38895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){
37281 38896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPager->state>=PAGER_EXCLUSIVE ){
37282 38897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pager_playback(pPager, 0);
37283 38898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -37399,11 +39014,10 @@
37399 39014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !aNew ){
37400 39015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
37401 39016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
37402 39017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&aNew[nCurrent], 0, (nSavepoint-nCurrent) * sizeof(PagerSavepoint));
37403 39018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager->aSavepoint = aNew;
37404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPager->nSavepoint = nSavepoint;
37405 39019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
37406 39020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Populate the PagerSavepoint structures just allocated. */
37407 39021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=nCurrent; ii<nSavepoint; ii++){
37408 39022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aNew[ii].nOrig = nPage;
37409 39023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isOpen(pPager->jfd) && pPager->journalOff>0 ){
@@ -37414,14 +39028,16 @@
37414 39028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aNew[ii].iSubRec = pPager->nSubRec;
37415 39029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aNew[ii].pInSavepoint = sqlite3BitvecCreate(nPage);
37416 39030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !aNew[ii].pInSavepoint ){
37417 39031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
37418 39032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
39033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pagerUseWal(pPager) ){
39034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3WalSavepoint(pPager->pWal, aNew[ii].aWalData);
39035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->nSavepoint = ii+1;
37419 39037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
37420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Open the sub-journal, if it is not already opened. */
37422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = openSubJournal(pPager);
39038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPager->nSavepoint==nSavepoint );
37423 39039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assertTruncateConstraint(pPager);
37424 39040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
37425 39041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
37426 39042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
37427 39043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -37491,11 +39107,11 @@
37491 39107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Else this is a rollback operation, playback the specified savepoint.
37492 39108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If this is a temp-file, it is possible that the journal file has
37493 39109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** not yet been opened. In this case there have been no changes to
37494 39110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the database file, so the playback operation can be skipped.
37495 39111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
37496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- else if( isOpen(pPager->jfd) ){
39112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if( pagerUseWal(pPager) || isOpen(pPager->jfd) ){
37497 39113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PagerSavepoint *pSavepoint = (nNew==0)?0:&pPager->aSavepoint[nNew-1];
37498 39114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pagerPlaybackSavepoint(pPager, pSavepoint);
37499 39115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert(rc!=SQLITE_DONE);
37500 39116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
37501 39117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -37760,60 +39376,106 @@
37760 39376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
37761 39377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return (int)pPager->exclusiveMode;
37762 39378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
37763 39379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
37764 39380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
37765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Get/set the journal-mode for this pager. Parameter eMode must be one of:
39381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Set the journal-mode for this pager. Parameter eMode must be one of:
37766 39382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
37767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** PAGER_JOURNALMODE_QUERY
37768 39383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PAGER_JOURNALMODE_DELETE
37769 39384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PAGER_JOURNALMODE_TRUNCATE
37770 39385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PAGER_JOURNALMODE_PERSIST
37771 39386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PAGER_JOURNALMODE_OFF
37772 39387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PAGER_JOURNALMODE_MEMORY
39388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** PAGER_JOURNALMODE_WAL
37773 39389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
37774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If the parameter is not _QUERY, then the journal_mode is set to the
37775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** value specified if the change is allowed. The change is disallowed
37776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** for the following reasons:
39390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The journalmode is set to the value specified if the change is allowed.
39391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The change may be disallowed for the following reasons:
37777 39392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
37778 39393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** * An in-memory database can only have its journal_mode set to _OFF
37779 39394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** or _MEMORY.
37780 39395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
37781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** * The journal mode may not be changed while a transaction is active.
39396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Temporary databases cannot have _WAL journalmode.
37782 39397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
37783 39398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The returned indicate the current (possibly updated) journal-mode.
37784 39399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
37785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3PagerJournalMode(Pager *pPager, int eMode){
37786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( eMode==PAGER_JOURNALMODE_QUERY
37787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || eMode==PAGER_JOURNALMODE_DELETE
39400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){
39401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 eOld = pPager->journalMode; /* Prior journalmode */
39402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The eMode parameter is always valid */
39404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eMode==PAGER_JOURNALMODE_DELETE
37788 39405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| eMode==PAGER_JOURNALMODE_TRUNCATE
37789 39406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| eMode==PAGER_JOURNALMODE_PERSIST
37790 39407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| eMode==PAGER_JOURNALMODE_OFF
39408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || eMode==PAGER_JOURNALMODE_WAL
37791 39409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| eMode==PAGER_JOURNALMODE_MEMORY );
37792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( PAGER_JOURNALMODE_QUERY<0 );
37793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( eMode>=0
37794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && (!MEMDB || eMode==PAGER_JOURNALMODE_MEMORY
37795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || eMode==PAGER_JOURNALMODE_OFF)
37796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && !pPager->dbModified
37797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && (!isOpen(pPager->jfd) || 0==pPager->journalOff)
37798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
37799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( isOpen(pPager->jfd) ){
39410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Do not allow the journalmode of a TEMP database to be changed to WAL
39412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPager->tempFile && eMode==PAGER_JOURNALMODE_WAL ){
39414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eOld!=PAGER_JOURNALMODE_WAL );
39415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eMode = eOld;
39416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Do allow the journalmode of an in-memory database to be set to
39419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** anything other than MEMORY or OFF
39420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( MEMDB ){
39422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eOld==PAGER_JOURNALMODE_MEMORY || eOld==PAGER_JOURNALMODE_OFF );
39423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eMode!=PAGER_JOURNALMODE_MEMORY && eMode!=PAGER_JOURNALMODE_OFF ){
39424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eMode = eOld;
39425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eMode!=eOld ){
39429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* When changing between rollback modes, close the journal file prior
39430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to the change. But when changing from a rollback mode to WAL, keep
39431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the journal open since there is a rollback-style transaction in play
39432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used to convert the version numbers in the btree header.
39433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isOpen(pPager->jfd) && eMode!=PAGER_JOURNALMODE_WAL ){
37800 39435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3OsClose(pPager->jfd);
37801 39436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
37802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( (PAGER_JOURNALMODE_TRUNCATE & 1)==1 );
37803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( (PAGER_JOURNALMODE_PERSIST & 1)==1 );
37804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( (PAGER_JOURNALMODE_DELETE & 1)==0 );
37805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( (PAGER_JOURNALMODE_MEMORY & 1)==0 );
37806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( (PAGER_JOURNALMODE_OFF & 1)==0 );
37807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (pPager->journalMode & 1)==1 && (eMode & 1)==0
37808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && !pPager->exclusiveMode ){
39437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Change the journal mode. */
39439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->journalMode = (u8)eMode;
39440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* When transistioning from TRUNCATE or PERSIST to any other journal
39442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mode (and we are not in locking_mode=EXCLUSIVE) then delete the
39443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** journal file.
39444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 );
39446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 );
39447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (PAGER_JOURNALMODE_DELETE & 5)!=1 );
39448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (PAGER_JOURNALMODE_MEMORY & 5)!=1 );
39449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (PAGER_JOURNALMODE_OFF & 5)!=1 );
39450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (PAGER_JOURNALMODE_WAL & 5)!=1 );
39451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (eOld & 5)==1 && (eMode & 5)!=1 && !pPager->exclusiveMode ){
37809 39452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
37810 39453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
37811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPager->journalMode = (u8)eMode;
37812 39454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
39455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Return the new journal mode */
39457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (int)pPager->journalMode;
39458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the current journal mode.
39462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){
37813 39464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return (int)pPager->journalMode;
37814 39465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
39466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return TRUE if the pager is in a state where it is OK to change the
39469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** journalmode. Journalmode changes can only happen when the database
39470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is unmodified.
39471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager *pPager){
39473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPager->dbModified ) return 0;
39474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isOpen(pPager->jfd) && pPager->journalOff>0 ) return 0;
39475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
39476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
37815 39477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
37816 39478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
37817 39479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Get/set the size-limit used for persistent journal files.
37818 39480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
37819 39481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Setting the size limit to -1 means no limit is enforced.
@@ -37833,14 +39495,2621 @@
37833 39495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3BackupUpdate() only.
37834 39496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
37835 39497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){
37836 39498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return &pPager->pBackup;
37837 39499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
39500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
39502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called when the user invokes "PRAGMA checkpoint".
39504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager){
39506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
39507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPager->pWal ){
39508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *zBuf = (u8 *)pPager->pTmpSpace;
39509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalCheckpoint(pPager->pWal,
39510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (pPager->noSync ? 0 : pPager->sync_flags),
39511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->pageSize, zBuf
39512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
39513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
39515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager){
39518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return sqlite3WalCallback(pPager->pWal);
39519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return true if the underlying VFS for the given pager supports the
39523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** primitives necessary for write-ahead logging.
39524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager){
39526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const sqlite3_io_methods *pMethods = pPager->fd->pMethods;
39527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return pMethods->iVersion>=2 && pMethods->xShmOpen!=0;
39528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Open a connection to the write-ahead log file for pager pPager. If
39532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the log connection is already open, this function is a no-op.
39533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The caller must be holding a SHARED lock on the database file to call
39535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this function.
39536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen){
39538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Return code */
39539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPager->state>=PAGER_SHARED );
39541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pPager->pWal ){
39542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !sqlite3PagerWalSupported(pPager) ) return SQLITE_CANTOPEN;
39543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Open the connection to the log file. If this operation fails,
39545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (e.g. due to malloc() failure), unlock the database file and
39546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** return an error code.
39547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalOpen(pPager->pVfs, pPager->fd,
39549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->zFilename, &pPager->pWal);
39550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
39551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->journalMode = PAGER_JOURNALMODE_WAL;
39552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
39554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pisOpen = 1;
39555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
39558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called to close the connection to the log file prior
39562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to switching from WAL to rollback mode.
39563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Before closing the log file, this function attempts to take an
39565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** EXCLUSIVE lock on the database file. If this cannot be obtained, an
39566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** error (SQLITE_BUSY) is returned and the log connection is not closed.
39567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If successful, the EXCLUSIVE lock is not released before returning.
39568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager){
39570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
39571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPager->journalMode==PAGER_JOURNALMODE_WAL );
39573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the log file is not already open, but does exist in the file-system,
39575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it may need to be checkpointed before the connection can switch to
39576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** rollback mode. Open it now so this can happen.
39577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pPager->pWal ){
39579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int logexists = 0;
39580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsLock(pPager->fd, SQLITE_LOCK_SHARED);
39581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
39582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pagerHasWAL(pPager, &logexists);
39583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && logexists ){
39585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalOpen(pPager->pVfs, pPager->fd,
39586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->zFilename, &pPager->pWal);
39587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Checkpoint and close the log. Because an EXCLUSIVE lock is held on
39591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the database file, the log and log-summary files will be deleted.
39592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && pPager->pWal ){
39594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsLock(pPager->fd, SQLITE_LOCK_EXCLUSIVE);
39595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
39596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalClose(pPager->pWal,
39597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (pPager->noSync ? 0 : pPager->sync_flags),
39598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->pageSize, (u8*)pPager->pTmpSpace
39599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
39600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPager->pWal = 0;
39601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
39602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If we cannot get an EXCLUSIVE lock, downgrade the PENDING lock
39603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that we did get back to SHARED. */
39604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsUnlock(pPager->fd, SQLITE_LOCK_SHARED);
39605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
39608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
39609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
37838 39610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
37839 39611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_DISKIO */
37840 39612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
37841 39613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** End of pager.c ***********************************************/
39614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************** Begin file wal.c *********************************************/
39615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2010 February 1
39617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The author disclaims copyright to this source code. In place of
39619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a legal notice, here is a blessing:
39620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** May you do good and not evil.
39622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** May you find forgiveness for yourself and forgive others.
39623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** May you share freely, never taking more than you give.
39624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *************************************************************************
39626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This file contains the implementation of a write-ahead log (WAL) used in
39628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "journal_mode=WAL" mode.
39629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WRITE-AHEAD LOG (WAL) FILE FORMAT
39631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A WAL file consists of a header followed by zero or more "frames".
39633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Each frame records the revised content of a single page from the
39634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** database file. All changes to the database are recorded by writing
39635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** frames into the WAL. Transactions commit when a frame is written that
39636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** contains a commit marker. A single WAL can and usually does record
39637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** multiple transactions. Periodically, the content of the WAL is
39638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** transferred back into the database file in an operation called a
39639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "checkpoint".
39640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A single WAL file can be used multiple times. In other words, the
39642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL can fill up with frames and then be checkpointed and then new
39643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** frames can overwrite the old ones. A WAL always grows from beginning
39644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** toward the end. Checksums and counters attached to each frame are
39645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used to determine which frames within the WAL are valid and which
39646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are leftovers from prior checkpoints.
39647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The WAL header is 24 bytes in size and consists of the following six
39649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** big-endian 32-bit unsigned integer values:
39650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 0: Magic number. 0x377f0682 or 0x377f0683
39652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 4: File format version. Currently 3007000
39653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 8: Database page size. Example: 1024
39654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 12: Checkpoint sequence number
39655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 16: Salt-1, random integer incremented with each checkpoint
39656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 20: Salt-2, a different random integer changing with each ckpt
39657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Immediately following the wal-header are zero or more frames. Each
39659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** frame consists of a 24-byte frame-header followed by a <page-size> bytes
39660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of page data. The frame-header is broken into 6 big-endian 32-bit unsigned
39661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** integer values, as follows:
39662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 0: Page number.
39664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 4: For commit records, the size of the database image in pages
39665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** after the commit. For all other records, zero.
39666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 8: Salt-1 (copied from the header)
39667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 12: Salt-2 (copied from the header)
39668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 16: Checksum-1.
39669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 20: Checksum-2.
39670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A frame is considered valid if and only if the following conditions are
39672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** true:
39673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (1) The salt-1 and salt-2 values in the frame-header match
39675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** salt values in the wal-header
39676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (2) The checksum values in the final 8 bytes of the frame-header
39678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** exactly match the checksum computed consecutively on the
39679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL header and the first 8 bytes and the content of all frames
39680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** up to and including the current frame.
39681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The checksum is computed using 32-bit big-endian integers if the
39683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** magic number in the first 4 bytes of the WAL is 0x377f0683 and it
39684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is computed using little-endian if the magic number is 0x377f0682.
39685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The checksum values are always stored in the frame header in a
39686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** big-endian format regardless of which byte order is used to compute
39687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the checksum. The checksum is computed by interpreting the input as
39688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an even number of unsigned 32-bit integers: x[0] through x[N]. The
39689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** algorithm used for the checksum is as follows:
39690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for i from 0 to n-1 step 2:
39692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** s0 += x[i] + s1;
39693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** s1 += x[i+1] + s0;
39694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** endfor
39695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On a checkpoint, the WAL is first VFS.xSync-ed, then valid content of the
39697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL is transferred into the database, then the database is VFS.xSync-ed.
39698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The VFS.xSync operations serve as write barriers - all writes launched
39699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** before the xSync must complete before any write that launches after the
39700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** xSync begins.
39701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** After each checkpoint, the salt-1 value is incremented and the salt-2
39703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** value is randomized. This prevents old and new frames in the WAL from
39704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** being considered valid at the same time and being checkpointing together
39705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** following a crash.
39706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** READER ALGORITHM
39708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** To read a page from the database (call it page number P), a reader
39710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** first checks the WAL to see if it contains page P. If so, then the
39711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** last valid instance of page P that is a followed by a commit frame
39712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or is a commit frame itself becomes the value read. If the WAL
39713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** contains no copies of page P that are valid and which are a commit
39714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** frame or are followed by a commit frame, then page P is read from
39715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the database file.
39716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** To start a read transaction, the reader records the index of the last
39718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** valid frame in the WAL. The reader uses this recorded "mxFrame" value
39719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for all subsequent read operations. New transactions can be appended
39720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to the WAL, but as long as the reader uses its original mxFrame value
39721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and ignores the newly appended content, it will see a consistent snapshot
39722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the database from a single point in time. This technique allows
39723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** multiple concurrent readers to view different versions of the database
39724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** content simultaneously.
39725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The reader algorithm in the previous paragraphs works correctly, but
39727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** because frames for page P can appear anywhere within the WAL, the
39728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** reader has to scan the entire WAL looking for page P frames. If the
39729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL is large (multiple megabytes is typical) that scan can be slow,
39730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and read performance suffers. To overcome this problem, a separate
39731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** data structure called the wal-index is maintained to expedite the
39732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** search for frames of a particular page.
39733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL-INDEX FORMAT
39735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Conceptually, the wal-index is shared memory, though VFS implementations
39737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** might choose to implement the wal-index using a mmapped file. Because
39738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the wal-index is shared memory, SQLite does not support journal_mode=WAL
39739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** on a network filesystem. All users of the database must be able to
39740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** share memory.
39741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The wal-index is transient. After a crash, the wal-index can (and should
39743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be) reconstructed from the original WAL file. In fact, the VFS is required
39744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to either truncate or zero the header of the wal-index when the last
39745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** connection to it closes. Because the wal-index is transient, it can
39746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** use an architecture-specific format; it does not have to be cross-platform.
39747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Hence, unlike the database and WAL file formats which store all values
39748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** as big endian, the wal-index can store multi-byte values in the native
39749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** byte order of the host computer.
39750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The purpose of the wal-index is to answer this question quickly: Given
39752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a page number P, return the index of the last frame for page P in the WAL,
39753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or return NULL if there are no frames for page P in the WAL.
39754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The wal-index consists of a header region, followed by an one or
39756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** more index blocks.
39757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The wal-index header contains the total number of frames within the WAL
39759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in the the mxFrame field.
39760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Each index block except for the first contains information on
39762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** HASHTABLE_NPAGE frames. The first index block contains information on
39763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and
39764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** HASHTABLE_NPAGE are selected so that together the wal-index header and
39765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** first index block are the same size as all other index blocks in the
39766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wal-index.
39767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Each index block contains two sections, a page-mapping that contains the
39769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** database page number associated with each wal frame, and a hash-table
39770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that allows readers to query an index block for a specific page number.
39771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The page-mapping is an array of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE
39772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for the first index block) 32-bit page numbers. The first entry in the
39773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** first index-block contains the database page number corresponding to the
39774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** first frame in the WAL file. The first entry in the second index block
39775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in the WAL file corresponds to the (HASHTABLE_NPAGE_ONE+1)th frame in
39776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the log, and so on.
39777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The last index block in a wal-index usually contains less than the full
39779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** complement of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE) page-numbers,
39780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** depending on the contents of the WAL file. This does not change the
39781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** allocated size of the page-mapping array - the page-mapping array merely
39782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** contains unused entries.
39783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Even without using the hash table, the last frame for page P
39785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** can be found by scanning the page-mapping sections of each index block
39786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** starting with the last index block and moving toward the first, and
39787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** within each index block, starting at the end and moving toward the
39788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** beginning. The first entry that equals P corresponds to the frame
39789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** holding the content for that page.
39790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The hash table consists of HASHTABLE_NSLOT 16-bit unsigned integers.
39792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** HASHTABLE_NSLOT = 2*HASHTABLE_NPAGE, and there is one entry in the
39793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** hash table for each page number in the mapping section, so the hash
39794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** table is never more than half full. The expected number of collisions
39795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** prior to finding a match is 1. Each entry of the hash table is an
39796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1-based index of an entry in the mapping section of the same
39797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** index block. Let K be the 1-based index of the largest entry in
39798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the mapping section. (For index blocks other than the last, K will
39799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** always be exactly HASHTABLE_NPAGE (4096) and for the last index block
39800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** K will be (mxFrame%HASHTABLE_NPAGE).) Unused slots of the hash table
39801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** contain a value of 0.
39802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** To look for page P in the hash table, first compute a hash iKey on
39804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** P as follows:
39805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** iKey = (P * 383) % HASHTABLE_NSLOT
39807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Then start scanning entries of the hash table, starting with iKey
39809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (wrapping around to the beginning when the end of the hash table is
39810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** reached) until an unused hash slot is found. Let the first unused slot
39811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be at index iUnused. (iUnused might be less than iKey if there was
39812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wrap-around.) Because the hash table is never more than half full,
39813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the search is guaranteed to eventually hit an unused entry. Let
39814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** iMax be the value between iKey and iUnused, closest to iUnused,
39815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** where aHash[iMax]==P. If there is no iMax entry (if there exists
39816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** no hash slot such that aHash[i]==p) then page P is not in the
39817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current index block. Otherwise the iMax-th mapping entry of the
39818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current index block corresponds to the last entry that references
39819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** page P.
39820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A hash search begins with the last index block and moves toward the
39822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** first index block, looking for entries corresponding to page P. On
39823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** average, only two or three slots in each index block need to be
39824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** examined in order to either find the last entry for page P, or to
39825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** establish that no such entry exists in the block. Each index block
39826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** holds over 4000 entries. So two or three index blocks are sufficient
39827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to cover a typical 10 megabyte WAL file, assuming 1K pages. 8 or 10
39828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** comparisons (on average) suffice to either locate a frame in the
39829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL or to establish that the frame does not exist in the WAL. This
39830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is much faster than scanning the entire 10MB WAL.
39831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Note that entries are added in order of increasing K. Hence, one
39833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** reader might be using some value K0 and a second reader that started
39834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** at a later time (after additional transactions were added to the WAL
39835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and to the wal-index) might be using a different value K1, where K1>K0.
39836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Both readers can use the same hash table and mapping section to get
39837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the correct result. There may be entries in the hash table with
39838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** K>K0 but to the first reader, those entries will appear to be unused
39839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** slots in the hash table and so the first reader will get an answer as
39840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if no values greater than K0 had ever been inserted into the hash table
39841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in the first place - which is what reader one wants. Meanwhile, the
39842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** second reader using K1 will see additional values that were inserted
39843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** later, which is exactly what reader two wants.
39844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When a rollback occurs, the value of K is decreased. Hash table entries
39846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that correspond to frames greater than the new K value are removed
39847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** from the hash table at this point.
39848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
39850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Trace output macros
39854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
39856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalTrace = 0;
39857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define WALTRACE(X) if(sqlite3WalTrace) sqlite3DebugPrintf X
39858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
39859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define WALTRACE(X)
39860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
39861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Indices of various locking bytes. WAL_NREADER is the number
39865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of available reader locks and should be at least 3.
39866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_WRITE_LOCK 0
39868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_ALL_BUT_WRITE 1
39869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_CKPT_LOCK 1
39870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_RECOVER_LOCK 2
39871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_READ_LOCK(I) (3+(I))
39872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_NREADER (SQLITE_SHM_NLOCK-3)
39873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Object declarations */
39876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct WalIndexHdr WalIndexHdr;
39877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct WalIterator WalIterator;
39878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct WalCkptInfo WalCkptInfo;
39879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The following object holds a copy of the wal-index header content.
39883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The actual header in the wal-index consists of two copies of this
39885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** object.
39886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct WalIndexHdr {
39888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iChange; /* Counter incremented each transaction */
39889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 isInit; /* 1 when initialized */
39890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 bigEndCksum; /* True if checksums in WAL are big-endian */
39891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 szPage; /* Database page size in bytes */
39892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 mxFrame; /* Index of last valid frame in the WAL */
39893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 nPage; /* Size of database in pages */
39894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 aFrameCksum[2]; /* Checksum of last frame in log */
39895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 aSalt[2]; /* Two salt values copied from WAL header */
39896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 aCksum[2]; /* Checksum over all prior fields */
39897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
39898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A copy of the following object occurs in the wal-index immediately
39901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** following the second copy of the WalIndexHdr. This object stores
39902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** information used by checkpoint.
39903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** nBackfill is the number of frames in the WAL that have been written
39905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** back into the database. (We call the act of moving content from WAL to
39906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** database "backfilling".) The nBackfill number is never greater than
39907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WalIndexHdr.mxFrame. nBackfill can only be increased by threads
39908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** holding the WAL_CKPT_LOCK lock (which includes a recovery thread).
39909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** However, a WAL_WRITE_LOCK thread can move the value of nBackfill from
39910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mxFrame back to zero when the WAL is reset.
39911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** There is one entry in aReadMark[] for each reader lock. If a reader
39913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** holds read-lock K, then the value in aReadMark[K] is no greater than
39914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the mxFrame for that reader. The value READMARK_NOT_USED (0xffffffff)
39915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for any aReadMark[] means that entry is unused. aReadMark[0] is
39916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a special case; its value is never used and it exists as a place-holder
39917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to avoid having to offset aReadMark[] indexs by one. Readers holding
39918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL_READ_LOCK(0) always ignore the entire WAL and read all content
39919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** directly from the database.
39920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The value of aReadMark[K] may only be changed by a thread that
39922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is holding an exclusive lock on WAL_READ_LOCK(K). Thus, the value of
39923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** aReadMark[K] cannot changed while there is a reader is using that mark
39924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** since the reader will be holding a shared lock on WAL_READ_LOCK(K).
39925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The checkpointer may only transfer frames from WAL to database where
39927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the frame numbers are less than or equal to every aReadMark[] that is
39928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in use (that is, every aReadMark[j] for which there is a corresponding
39929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL_READ_LOCK(j)). New readers (usually) pick the aReadMark[] with the
39930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** largest value and will increase an unused aReadMark[] to mxFrame if there
39931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is not already an aReadMark[] equal to mxFrame. The exception to the
39932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** previous sentence is when nBackfill equals mxFrame (meaning that everything
39933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in the WAL has been backfilled into the database) then new readers
39934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** will choose aReadMark[0] which has value 0 and hence such reader will
39935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** get all their all content directly from the database file and ignore
39936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the WAL.
39937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Writers normally append new frames to the end of the WAL. However,
39939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if nBackfill equals mxFrame (meaning that all WAL content has been
39940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** written back into the database) and if no readers are using the WAL
39941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (in other words, if there are no WAL_READ_LOCK(i) where i>0) then
39942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the writer will first "reset" the WAL back to the beginning and start
39943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** writing new content beginning at frame 1.
39944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** We assume that 32-bit loads are atomic and so no locks are needed in
39946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** order to read from any aReadMark[] entries.
39947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct WalCkptInfo {
39949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 nBackfill; /* Number of WAL frames backfilled into DB */
39950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 aReadMark[WAL_NREADER]; /* Reader marks */
39951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
39952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define READMARK_NOT_USED 0xffffffff
39953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A block of WALINDEX_LOCK_RESERVED bytes beginning at
39956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WALINDEX_LOCK_OFFSET is reserved for locks. Since some systems
39957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** only support mandatory file-locks, we do not read or write data
39958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** from the region of the file on which locks are applied.
39959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WALINDEX_LOCK_OFFSET (sizeof(WalIndexHdr)*2 + sizeof(WalCkptInfo))
39961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WALINDEX_LOCK_RESERVED 16
39962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WALINDEX_HDR_SIZE (WALINDEX_LOCK_OFFSET+WALINDEX_LOCK_RESERVED)
39963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Size of header before each frame in wal */
39965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_FRAME_HDRSIZE 24
39966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Size of write ahead log header */
39968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_HDRSIZE 24
39969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* WAL magic value. Either this value, or the same value with the least
39971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** significant bit also set (WAL_MAGIC | 0x00000001) is stored in 32-bit
39972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** big-endian format in the first 4 bytes of a WAL file.
39973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the LSB is set, then the checksums for each frame within the WAL
39975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file are calculated by treating all data as an array of 32-bit
39976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** big-endian words. Otherwise, they are calculated by interpreting
39977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** all data as 32-bit little-endian words.
39978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_MAGIC 0x377f0682
39980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the offset of frame iFrame in the write-ahead log file,
39983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** assuming a database page size of szPage bytes. The offset returned
39984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is to the start of the write-ahead log frame-header.
39985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define walFrameOffset(iFrame, szPage) ( \
39987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WAL_HDRSIZE + ((iFrame)-1)*((szPage)+WAL_FRAME_HDRSIZE) \
39988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
39989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
39991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** An open write-ahead log file is represented by an instance of the
39992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** following object.
39993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
39994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Wal {
39995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_vfs *pVfs; /* The VFS used to create pDbFd */
39996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *pDbFd; /* File handle for the database file */
39997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *pWalFd; /* File handle for WAL file */
39998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iCallback; /* Value to pass to log callback (or 0) */
39999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nWiData; /* Size of array apWiData */
40000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile u32 **apWiData; /* Pointer to wal-index content in memory */
40001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 szPage; /* Database page size */
40002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i16 readLock; /* Which read lock is being held. -1 for none */
40003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 exclusiveMode; /* Non-zero if connection is in exclusive mode */
40004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 isWIndexOpen; /* True if ShmOpen() called on pDbFd */
40005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 writeLock; /* True if in a write transaction */
40006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 ckptLock; /* True if holding a checkpoint lock */
40007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WalIndexHdr hdr; /* Wal-index header for current transaction */
40008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zWalName; /* Name of WAL file */
40009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 nCkpt; /* Checkpoint sequence counter in the wal-header */
40010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
40011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 lockError; /* True if a locking error has occurred */
40012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
40013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
40014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Each page of the wal-index mapping contains a hash-table made up of
40017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an array of HASHTABLE_NSLOT elements of the following type.
40018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef u16 ht_slot;
40020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This structure is used to implement an iterator that loops through
40023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** all frames in the WAL in database page order. Where two or more frames
40024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** correspond to the same database page, the iterator visits only the
40025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** frame most recently written to the WAL (in other words, the frame with
40026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the largest index).
40027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The internals of this structure are only accessed by:
40029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** walIteratorInit() - Create a new iterator,
40031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** walIteratorNext() - Step an iterator,
40032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** walIteratorFree() - Free an iterator.
40033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This functionality is used by the checkpoint code (see walCheckpoint()).
40035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct WalIterator {
40037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iPrior; /* Last result returned from the iterator */
40038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nSegment; /* Size of the aSegment[] array */
40039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct WalSegment {
40040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iNext; /* Next slot in aIndex[] not yet returned */
40041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ht_slot *aIndex; /* i0, i1, i2... such that aPgno[iN] ascend */
40042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aPgno; /* Array of page numbers. */
40043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nEntry; /* Max size of aPgno[] and aIndex[] arrays */
40044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iZero; /* Frame number associated with aPgno[0] */
40045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } aSegment[1]; /* One for every 32KB page in the WAL */
40046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
40047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Define the parameters of the hash tables in the wal-index file. There
40050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is a hash-table following every HASHTABLE_NPAGE page numbers in the
40051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wal-index.
40052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Changing any of these constants will alter the wal-index format and
40054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** create incompatibilities.
40055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define HASHTABLE_NPAGE 4096 /* Must be power of 2 */
40057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define HASHTABLE_HASH_1 383 /* Should be prime */
40058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define HASHTABLE_NSLOT (HASHTABLE_NPAGE*2) /* Must be a power of 2 */
40059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The block of page numbers associated with the first hash-table in a
40062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wal-index is smaller than usual. This is so that there is a complete
40063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** hash-table on each aligned 32KB page of the wal-index.
40064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define HASHTABLE_NPAGE_ONE (HASHTABLE_NPAGE - (WALINDEX_HDR_SIZE/sizeof(u32)))
40066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The wal-index is divided into pages of WALINDEX_PGSZ bytes each. */
40068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WALINDEX_PGSZ ( \
40069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sizeof(ht_slot)*HASHTABLE_NSLOT + HASHTABLE_NPAGE*sizeof(u32) \
40070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
40071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Obtain a pointer to the iPage'th page of the wal-index. The wal-index
40074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is broken into pages of WALINDEX_PGSZ bytes. Wal-index pages are
40075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** numbered from zero.
40076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If this call is successful, *ppPage is set to point to the wal-index
40078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** page and SQLITE_OK is returned. If an error (an OOM or VFS error) occurs,
40079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then an SQLite error code is returned and *ppPage is set to 0.
40080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){
40082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
40083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Enlarge the pWal->apWiData[] array if required */
40085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->nWiData<=iPage ){
40086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nByte = sizeof(u32 *)*(iPage+1);
40087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile u32 **apNew;
40088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ apNew = (volatile u32 **)sqlite3_realloc(pWal->apWiData, nByte);
40089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !apNew ){
40090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppPage = 0;
40091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
40092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&apNew[pWal->nWiData], 0, sizeof(u32 *)*(iPage+1-pWal->nWiData));
40094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->apWiData = apNew;
40095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->nWiData = iPage+1;
40096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Request a pointer to the required page from the VFS */
40099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->apWiData[iPage]==0 ){
40100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ,
40101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->writeLock, (void volatile **)&pWal->apWiData[iPage]
40102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
40103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppPage = pWal->apWiData[iPage];
40106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iPage==0 || *ppPage || rc!=SQLITE_OK );
40107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
40108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return a pointer to the WalCkptInfo structure in the wal-index.
40112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static volatile WalCkptInfo *walCkptInfo(Wal *pWal){
40114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->nWiData>0 && pWal->apWiData[0] );
40115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (volatile WalCkptInfo*)&(pWal->apWiData[0][sizeof(WalIndexHdr)/2]);
40116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return a pointer to the WalIndexHdr structure in the wal-index.
40120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static volatile WalIndexHdr *walIndexHdr(Wal *pWal){
40122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->nWiData>0 && pWal->apWiData[0] );
40123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (volatile WalIndexHdr*)pWal->apWiData[0];
40124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The argument to this macro must be of type u32. On a little-endian
40128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** architecture, it returns the u32 value that results from interpreting
40129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the 4 bytes as a big-endian value. On a big-endian architecture, it
40130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** returns the value that would be produced by intepreting the 4 bytes
40131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the input value as a little-endian integer.
40132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define BYTESWAP32(x) ( \
40134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (((x)&0x000000FF)<<24) + (((x)&0x0000FF00)<<8) \
40135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ + (((x)&0x00FF0000)>>8) + (((x)&0xFF000000)>>24) \
40136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
40137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Generate or extend an 8 byte checksum based on the data in
40140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** array aByte[] and the initial values of aIn[0] and aIn[1] (or
40141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** initial values of 0 and 0 if aIn==NULL).
40142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The checksum is written back into aOut[] before returning.
40144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** nByte must be a positive multiple of 8.
40146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void walChecksumBytes(
40148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nativeCksum, /* True for native byte-order, false for non-native */
40149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *a, /* Content to be checksummed */
40150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nByte, /* Bytes of content in a[]. Must be a multiple of 8. */
40151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const u32 *aIn, /* Initial checksum value input */
40152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aOut /* OUT: Final checksum value output */
40153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
40154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 s1, s2;
40155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aData = (u32 *)a;
40156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aEnd = (u32 *)&a[nByte];
40157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aIn ){
40159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ s1 = aIn[0];
40160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ s2 = aIn[1];
40161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
40162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ s1 = s2 = 0;
40163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nByte>=8 );
40166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (nByte&0x00000007)==0 );
40167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nativeCksum ){
40169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do {
40170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ s1 += *aData++ + s2;
40171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ s2 += *aData++ + s1;
40172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }while( aData<aEnd );
40173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
40174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do {
40175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ s1 += BYTESWAP32(aData[0]) + s2;
40176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ s2 += BYTESWAP32(aData[1]) + s1;
40177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aData += 2;
40178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }while( aData<aEnd );
40179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aOut[0] = s1;
40182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aOut[1] = s2;
40183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Write the header information in pWal->hdr into the wal-index.
40187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The checksum on pWal->hdr is updated before it is written.
40189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void walIndexWriteHdr(Wal *pWal){
40191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile WalIndexHdr *aHdr = walIndexHdr(pWal);
40192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int nCksum = offsetof(WalIndexHdr, aCksum);
40193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->writeLock );
40195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.isInit = 1;
40196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum);
40197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy((void *)&aHdr[1], (void *)&pWal->hdr, sizeof(WalIndexHdr));
40198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsShmBarrier(pWal->pDbFd);
40199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy((void *)&aHdr[0], (void *)&pWal->hdr, sizeof(WalIndexHdr));
40200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function encodes a single frame header and writes it to a buffer
40204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** supplied by the caller. A frame-header is made up of a series of
40205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 4-byte big-endian integers, as follows:
40206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 0: Page number.
40208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 4: For commit records, the size of the database image in pages
40209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** after the commit. For all other records, zero.
40210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 8: Salt-1 (copied from the wal-header)
40211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 12: Salt-2 (copied from the wal-header)
40212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 16: Checksum-1.
40213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 20: Checksum-2.
40214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void walEncodeFrame(
40216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pWal, /* The write-ahead log */
40217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iPage, /* Database page number for frame */
40218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 nTruncate, /* New db size (or 0 for non-commit frames) */
40219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *aData, /* Pointer to page data */
40220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *aFrame /* OUT: Write encoded frame here */
40221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
40222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nativeCksum; /* True for native byte-order checksums */
40223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aCksum = pWal->hdr.aFrameCksum;
40224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( WAL_FRAME_HDRSIZE==24 );
40225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Put4byte(&aFrame[0], iPage);
40226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Put4byte(&aFrame[4], nTruncate);
40227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&aFrame[8], pWal->hdr.aSalt, 8);
40228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN);
40230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum);
40231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum);
40232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Put4byte(&aFrame[16], aCksum[0]);
40234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Put4byte(&aFrame[20], aCksum[1]);
40235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Check to see if the frame with header in aFrame[] and content
40239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in aData[] is valid. If it is a valid frame, fill *piPage and
40240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** *pnTruncate and return true. Return if the frame is not valid.
40241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walDecodeFrame(
40243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pWal, /* The write-ahead log */
40244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *piPage, /* OUT: Database page number for frame */
40245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *pnTruncate, /* OUT: New db size (or 0 if not commit) */
40246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *aData, /* Pointer to page data (for checksum) */
40247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *aFrame /* Frame data */
40248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
40249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nativeCksum; /* True for native byte-order checksums */
40250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aCksum = pWal->hdr.aFrameCksum;
40251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 pgno; /* Page number of the frame */
40252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( WAL_FRAME_HDRSIZE==24 );
40253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A frame is only valid if the salt values in the frame-header
40255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** match the salt values in the wal-header.
40256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( memcmp(&pWal->hdr.aSalt, &aFrame[8], 8)!=0 ){
40258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
40259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A frame is only valid if the page number is creater than zero.
40262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pgno = sqlite3Get4byte(&aFrame[0]);
40264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pgno==0 ){
40265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
40266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A frame is only valid if a checksum of the first 16 bytes
40269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the frame-header, and the frame-data matches
40270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the checksum in the last 8 bytes of the frame-header.
40271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN);
40273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum);
40274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum);
40275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aCksum[0]!=sqlite3Get4byte(&aFrame[16])
40276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || aCksum[1]!=sqlite3Get4byte(&aFrame[20])
40277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
40278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Checksum failed. */
40279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
40280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If we reach this point, the frame is valid. Return the page number
40283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and the new database size.
40284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piPage = pgno;
40286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnTruncate = sqlite3Get4byte(&aFrame[4]);
40287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
40288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
40292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Names of locks. This routine is used to provide debugging output and is not
40294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a part of an ordinary build.
40295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *walLockName(int lockIdx){
40297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( lockIdx==WAL_WRITE_LOCK ){
40298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "WRITE-LOCK";
40299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( lockIdx==WAL_CKPT_LOCK ){
40300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "CKPT-LOCK";
40301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( lockIdx==WAL_RECOVER_LOCK ){
40302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "RECOVER-LOCK";
40303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
40304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static char zName[15];
40305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_snprintf(sizeof(zName), zName, "READ-LOCK[%d]",
40306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lockIdx-WAL_READ_LOCK(0));
40307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return zName;
40308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /*defined(SQLITE_TEST) || defined(SQLITE_DEBUG) */
40311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Set or release locks on the WAL. Locks are either shared or exclusive.
40315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A lock cannot be moved directly between shared and exclusive - it must go
40316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** through the unlocked state first.
40317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** In locking_mode=EXCLUSIVE, all of these routines become no-ops.
40319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walLockShared(Wal *pWal, int lockIdx){
40321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
40322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->exclusiveMode ) return SQLITE_OK;
40323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1,
40324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_SHM_LOCK | SQLITE_SHM_SHARED);
40325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: acquire SHARED-%s %s\n", pWal,
40326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walLockName(lockIdx), rc ? "failed" : "ok"));
40327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ VVA_ONLY( pWal->lockError = (rc!=SQLITE_OK && rc!=SQLITE_BUSY); )
40328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
40329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void walUnlockShared(Wal *pWal, int lockIdx){
40331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->exclusiveMode ) return;
40332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1,
40333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED);
40334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: release SHARED-%s\n", pWal, walLockName(lockIdx)));
40335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walLockExclusive(Wal *pWal, int lockIdx, int n){
40337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
40338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->exclusiveMode ) return SQLITE_OK;
40339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, n,
40340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE);
40341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: acquire EXCLUSIVE-%s cnt=%d %s\n", pWal,
40342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walLockName(lockIdx), n, rc ? "failed" : "ok"));
40343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ VVA_ONLY( pWal->lockError = (rc!=SQLITE_OK && rc!=SQLITE_BUSY); )
40344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
40345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void walUnlockExclusive(Wal *pWal, int lockIdx, int n){
40347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->exclusiveMode ) return;
40348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, n,
40349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE);
40350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: release EXCLUSIVE-%s cnt=%d\n", pWal,
40351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walLockName(lockIdx), n));
40352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Compute a hash on a page number. The resulting hash value must land
40356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** between 0 and (HASHTABLE_NSLOT-1). The walHashNext() function advances
40357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the hash to the next value in the event of a collision.
40358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walHash(u32 iPage){
40360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iPage>0 );
40361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (HASHTABLE_NSLOT & (HASHTABLE_NSLOT-1))==0 );
40362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (iPage*HASHTABLE_HASH_1) & (HASHTABLE_NSLOT-1);
40363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walNextHash(int iPriorHash){
40365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (iPriorHash+1)&(HASHTABLE_NSLOT-1);
40366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return pointers to the hash table and page number array stored on
40370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** page iHash of the wal-index. The wal-index is broken into 32KB pages
40371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** numbered starting from 0.
40372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Set output variable *paHash to point to the start of the hash table
40374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in the wal-index file. Set *piZero to one less than the frame
40375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** number of the first frame indexed by this hash table. If a
40376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** slot in the hash table is set to N, it refers to frame number
40377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (*piZero+N) in the log.
40378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Finally, set *paPgno so that *paPgno[1] is the page number of the
40380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** first frame indexed by the hash table, frame (*piZero+1).
40381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walHashGet(
40383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pWal, /* WAL handle */
40384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iHash, /* Find the iHash'th table */
40385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile ht_slot **paHash, /* OUT: Pointer to hash index */
40386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile u32 **paPgno, /* OUT: Pointer to page number array */
40387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *piZero /* OUT: Frame associated with *paPgno[0] */
40388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
40389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
40390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile u32 *aPgno;
40391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walIndexPage(pWal, iHash, &aPgno);
40393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rc==SQLITE_OK || iHash>0 );
40394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
40396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iZero;
40397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile ht_slot *aHash;
40398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aHash = (volatile ht_slot *)&aPgno[HASHTABLE_NPAGE];
40400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iHash==0 ){
40401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aPgno = &aPgno[WALINDEX_HDR_SIZE/sizeof(u32)];
40402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iZero = 0;
40403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
40404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE;
40405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *paPgno = &aPgno[-1];
40408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *paHash = aHash;
40409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piZero = iZero;
40410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
40412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the number of the wal-index page that contains the hash-table
40416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and page-number array that contain entries corresponding to WAL frame
40417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** iFrame. The wal-index is broken up into 32KB pages. Wal-index pages
40418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are numbered starting from 0.
40419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walFramePage(u32 iFrame){
40421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iHash = (iFrame+HASHTABLE_NPAGE-HASHTABLE_NPAGE_ONE-1) / HASHTABLE_NPAGE;
40422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (iHash==0 || iFrame>HASHTABLE_NPAGE_ONE)
40423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (iHash>=1 || iFrame<=HASHTABLE_NPAGE_ONE)
40424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (iHash<=1 || iFrame>(HASHTABLE_NPAGE_ONE+HASHTABLE_NPAGE))
40425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (iHash>=2 || iFrame<=HASHTABLE_NPAGE_ONE+HASHTABLE_NPAGE)
40426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (iHash<=2 || iFrame>(HASHTABLE_NPAGE_ONE+2*HASHTABLE_NPAGE))
40427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
40428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return iHash;
40429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the page number associated with frame iFrame in this WAL.
40433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static u32 walFramePgno(Wal *pWal, u32 iFrame){
40435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iHash = walFramePage(iFrame);
40436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iHash==0 ){
40437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return pWal->apWiData[0][WALINDEX_HDR_SIZE/sizeof(u32) + iFrame - 1];
40438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return pWal->apWiData[iHash][(iFrame-1-HASHTABLE_NPAGE_ONE)%HASHTABLE_NPAGE];
40440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Remove entries from the hash table that point to WAL slots greater
40444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** than pWal->hdr.mxFrame.
40445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called whenever pWal->hdr.mxFrame is decreased due
40447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to a rollback or savepoint.
40448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** At most only the hash table containing pWal->hdr.mxFrame needs to be
40450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** updated. Any later hash tables will be automatically cleared when
40451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pWal->hdr.mxFrame advances to the point where those hash tables are
40452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** actually needed.
40453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void walCleanupHash(Wal *pWal){
40455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile ht_slot *aHash; /* Pointer to hash table to clear */
40456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile u32 *aPgno; /* Page number array for hash table */
40457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iZero; /* frame == (aHash[x]+iZero) */
40458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iLimit = 0; /* Zero values greater than this */
40459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nByte; /* Number of bytes to zero in aPgno[] */
40460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Used to iterate through aHash[] */
40461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->writeLock );
40463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE-1 );
40464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE );
40465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE+1 );
40466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->hdr.mxFrame==0 ) return;
40468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Obtain pointers to the hash-table and page-number array containing
40470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the entry that corresponds to frame pWal->hdr.mxFrame. It is guaranteed
40471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that the page said hash-table and array reside on is already mapped.
40472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->nWiData>walFramePage(pWal->hdr.mxFrame) );
40474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->apWiData[walFramePage(pWal->hdr.mxFrame)] );
40475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &aHash, &aPgno, &iZero);
40476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Zero all hash-table entries that correspond to frame numbers greater
40478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** than pWal->hdr.mxFrame.
40479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLimit = pWal->hdr.mxFrame - iZero;
40481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iLimit>0 );
40482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<HASHTABLE_NSLOT; i++){
40483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aHash[i]>iLimit ){
40484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aHash[i] = 0;
40485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Zero the entries in the aPgno array that correspond to frames with
40489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** frame numbers greater than pWal->hdr.mxFrame.
40490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nByte = ((char *)aHash - (char *)&aPgno[iLimit+1]);
40492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset((void *)&aPgno[iLimit+1], 0, nByte);
40493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
40495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Verify that the every entry in the mapping region is still reachable
40496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** via the hash table even after the cleanup.
40497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iLimit ){
40499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Loop counter */
40500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iKey; /* Hash key */
40501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; i<=iLimit; i++){
40502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iKey=walHash(aPgno[i]); aHash[iKey]; iKey=walNextHash(iKey)){
40503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aHash[iKey]==i ) break;
40504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( aHash[iKey]==i );
40506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */
40509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Set an entry in the wal-index that will map database page number
40514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pPage into WAL frame iFrame.
40515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
40517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
40518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iZero; /* One less than frame number of aPgno[1] */
40519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile u32 *aPgno; /* Page number array */
40520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile ht_slot *aHash; /* Hash table */
40521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walHashGet(pWal, walFramePage(iFrame), &aHash, &aPgno, &iZero);
40523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Assuming the wal-index file was successfully mapped, populate the
40525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** page number array and hash table entry.
40526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
40528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iKey; /* Hash table key */
40529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int idx; /* Value to write to hash-table slot */
40530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TESTONLY( int nCollide = 0; /* Number of hash collisions */ )
40531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ idx = iFrame - iZero;
40533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( idx <= HASHTABLE_NSLOT/2 + 1 );
40534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If this is the first entry to be added to this hash-table, zero the
40536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** entire hash table and aPgno[] array before proceding.
40537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( idx==1 ){
40539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nByte = (u8 *)&aHash[HASHTABLE_NSLOT] - (u8 *)&aPgno[1];
40540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset((void*)&aPgno[1], 0, nByte);
40541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the entry in aPgno[] is already set, then the previous writer
40544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** must have exited unexpectedly in the middle of a transaction (after
40545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** writing one or more dirty pages to the WAL to free up memory).
40546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Remove the remnants of that writers uncommitted transaction from
40547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the hash-table before writing any new entries.
40548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aPgno[idx] ){
40550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walCleanupHash(pWal);
40551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !aPgno[idx] );
40552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Write the aPgno[] array entry and the hash-table slot. */
40555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iKey=walHash(iPage); aHash[iKey]; iKey=walNextHash(iKey)){
40556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nCollide++ < idx );
40557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aPgno[idx] = iPage;
40559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aHash[iKey] = idx;
40560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
40562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Verify that the number of entries in the hash table exactly equals
40563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the number of entries in the mapping region.
40564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
40566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Loop counter */
40567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nEntry = 0; /* Number of entries in the hash table */
40568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<HASHTABLE_NSLOT; i++){ if( aHash[i] ) nEntry++; }
40569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nEntry==idx );
40570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Verify that the every entry in the mapping region is reachable
40573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** via the hash table. This turns out to be a really, really expensive
40574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** thing to check, so only do this occasionally - not on every
40575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** iteration.
40576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (idx&0x3ff)==0 ){
40578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Loop counter */
40579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; i<=idx; i++){
40580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iKey=walHash(aPgno[i]); aHash[iKey]; iKey=walNextHash(iKey)){
40581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aHash[iKey]==i ) break;
40582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( aHash[iKey]==i );
40584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */
40587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
40591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Recover the wal-index by reading the write-ahead log file.
40596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine first tries to establish an exclusive lock on the
40598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wal-index to prevent other threads/processes from doing anything
40599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** with the WAL or wal-index while recovery is running. The
40600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL_RECOVER_LOCK is also held so that other threads will know
40601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that this thread is running recovery. If unable to establish
40602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the necessary locks, this routine returns SQLITE_BUSY.
40603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walIndexRecover(Wal *pWal){
40605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return Code */
40606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 nSize; /* Size of log file */
40607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 aFrameCksum[2] = {0, 0};
40608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iLock; /* Lock offset to lock for checkpoint */
40609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nLock; /* Number of locks to hold */
40610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Obtain an exclusive lock on all byte in the locking range not already
40612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** locked by the caller. The caller is guaranteed to have locked the
40613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL_WRITE_LOCK byte, and may have also locked the WAL_CKPT_LOCK byte.
40614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If successful, the same bytes that are locked here are unlocked before
40615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this function returns.
40616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->ckptLock==1 || pWal->ckptLock==0 );
40618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( WAL_ALL_BUT_WRITE==WAL_WRITE_LOCK+1 );
40619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( WAL_CKPT_LOCK==WAL_ALL_BUT_WRITE );
40620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->writeLock );
40621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLock = WAL_ALL_BUT_WRITE + pWal->ckptLock;
40622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLock = SQLITE_SHM_NLOCK - iLock;
40623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walLockExclusive(pWal, iLock, nLock);
40624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ){
40625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
40626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: recovery begin...\n", pWal));
40628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&pWal->hdr, 0, sizeof(WalIndexHdr));
40630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsFileSize(pWal->pWalFd, &nSize);
40632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
40633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto recovery_error;
40634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nSize>WAL_HDRSIZE ){
40637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 aBuf[WAL_HDRSIZE]; /* Buffer to load WAL header into */
40638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *aFrame = 0; /* Malloc'd buffer to load entire frame */
40639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int szFrame; /* Number of bytes in buffer aFrame[] */
40640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *aData; /* Pointer to data part of aFrame buffer */
40641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iFrame; /* Index of last frame read */
40642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 iOffset; /* Next offset to read from log file */
40643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int szPage; /* Page size according to the log */
40644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 magic; /* Magic value read from WAL header */
40645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Read in the WAL header. */
40647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0);
40648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
40649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto recovery_error;
40650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the database page size is not a power of two, or is greater than
40653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_MAX_PAGE_SIZE, conclude that the WAL file contains no valid
40654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** data. Similarly, if the 'magic' value is invalid, ignore the whole
40655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL file.
40656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ magic = sqlite3Get4byte(&aBuf[0]);
40658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ szPage = sqlite3Get4byte(&aBuf[8]);
40659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (magic&0xFFFFFFFE)!=WAL_MAGIC
40660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || szPage&(szPage-1)
40661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || szPage>SQLITE_MAX_PAGE_SIZE
40662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || szPage<512
40663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
40664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto finished;
40665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.bigEndCksum = (magic&0x00000001);
40667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->szPage = szPage;
40668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->nCkpt = sqlite3Get4byte(&aBuf[12]);
40669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&pWal->hdr.aSalt, &aBuf[16], 8);
40670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walChecksumBytes(pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN,
40671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aBuf, WAL_HDRSIZE, 0, pWal->hdr.aFrameCksum
40672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
40673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Malloc a buffer to read frames into. */
40675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ szFrame = szPage + WAL_FRAME_HDRSIZE;
40676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aFrame = (u8 *)sqlite3_malloc(szFrame);
40677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !aFrame ){
40678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_NOMEM;
40679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto recovery_error;
40680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aData = &aFrame[WAL_FRAME_HDRSIZE];
40682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Read all frames from the log file. */
40684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iFrame = 0;
40685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iOffset=WAL_HDRSIZE; (iOffset+szFrame)<=nSize; iOffset+=szFrame){
40686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 pgno; /* Database page number for frame */
40687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 nTruncate; /* dbsize field from frame header */
40688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isValid; /* True if this frame is valid */
40689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Read and decode the next log frame. */
40691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset);
40692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) break;
40693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isValid = walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame);
40694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !isValid ) break;
40695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walIndexAppend(pWal, ++iFrame, pgno);
40696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) break;
40697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If nTruncate is non-zero, this is a commit record. */
40699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nTruncate ){
40700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.mxFrame = iFrame;
40701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.nPage = nTruncate;
40702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.szPage = szPage;
40703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aFrameCksum[0] = pWal->hdr.aFrameCksum[0];
40704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aFrameCksum[1] = pWal->hdr.aFrameCksum[1];
40705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(aFrame);
40709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ finished:
40712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
40713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile WalCkptInfo *pInfo;
40714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
40715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.aFrameCksum[0] = aFrameCksum[0];
40716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.aFrameCksum[1] = aFrameCksum[1];
40717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walIndexWriteHdr(pWal);
40718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Reset the checkpoint-header. This is safe because this thread is
40720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** currently holding locks that exclude all other readers, writers and
40721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** checkpointers.
40722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInfo = walCkptInfo(pWal);
40724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInfo->nBackfill = 0;
40725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInfo->aReadMark[0] = 0;
40726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED;
40727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ recovery_error:
40730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: recovery %s\n", pWal, rc ? "failed" : "ok"));
40731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockExclusive(pWal, iLock, nLock);
40732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
40733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Close an open wal-index.
40737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void walIndexClose(Wal *pWal, int isDelete){
40739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->isWIndexOpen ){
40740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsShmClose(pWal->pDbFd, isDelete);
40741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->isWIndexOpen = 0;
40742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Open a connection to the WAL file associated with database zDbName.
40747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The database file must already be opened on connection pDbFd.
40748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A SHARED lock should be held on the database file when this function
40750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is called. The purpose of this SHARED lock is to prevent any other
40751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** client from unlinking the WAL or wal-index file. If another process
40752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** were to do this just after this client opened one of these files, the
40753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** system would be badly broken.
40754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the log file is successfully opened, SQLITE_OK is returned and
40756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** *ppWal is set to point to a new WAL handle. If an error occurs,
40757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an SQLite error code is returned and *ppWal is left unmodified.
40758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalOpen(
40760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_vfs *pVfs, /* vfs module to open wal and wal-index */
40761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_file *pDbFd, /* The open database file */
40762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zDbName, /* Name of the database file */
40763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal **ppWal /* OUT: Allocated Wal handle */
40764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
40765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return Code */
40766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pRet; /* Object to allocate and return */
40767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int flags; /* Flags passed to OsOpen() */
40768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zWal; /* Name of write-ahead log file */
40769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nWal; /* Length of zWal in bytes */
40770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( zDbName && zDbName[0] );
40772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pDbFd );
40773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* In the amalgamation, the os_unix.c and os_win.c source files come before
40775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this source file. Verify that the #defines of the locking byte offsets
40776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in os_unix.c and os_win.c agree with the WALINDEX_LOCK_OFFSET value.
40777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef WIN_SHM_BASE
40779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( WIN_SHM_BASE==WALINDEX_LOCK_OFFSET );
40780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
40781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef UNIX_SHM_BASE
40782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( UNIX_SHM_BASE==WALINDEX_LOCK_OFFSET );
40783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
40784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Allocate an instance of struct Wal to return. */
40787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppWal = 0;
40788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nWal = sqlite3Strlen30(zDbName) + 5;
40789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet = (Wal*)sqlite3MallocZero(sizeof(Wal) + pVfs->szOsFile + nWal);
40790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pRet ){
40791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
40792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet->pVfs = pVfs;
40795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet->pWalFd = (sqlite3_file *)&pRet[1];
40796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet->pDbFd = pDbFd;
40797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet->readLock = -1;
40798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_randomness(8, &pRet->hdr.aSalt);
40799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet->zWalName = zWal = pVfs->szOsFile + (char*)pRet->pWalFd;
40800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_snprintf(nWal, zWal, "%s-wal", zDbName);
40801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsShmOpen(pDbFd);
40802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Open file handle on the write-ahead log file. */
40804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
40805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet->isWIndexOpen = 1;
40806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_MAIN_JOURNAL);
40807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsOpen(pVfs, zWal, pRet->pWalFd, flags, &flags);
40808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
40811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walIndexClose(pRet, 0);
40812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsClose(pRet->pWalFd);
40813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pRet);
40814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
40815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppWal = pRet;
40816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%d: opened\n", pRet));
40817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
40819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Find the smallest page number out of all pages held in the WAL that
40823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** has not been returned by any prior invocation of this method on the
40824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** same WalIterator object. Write into *piFrame the frame index where
40825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that page was last written into the WAL. Write into *piPage the page
40826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** number.
40827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return 0 on success. If there are no pages in the WAL with a page
40829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** number larger than *piPage, then return 1.
40830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walIteratorNext(
40832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WalIterator *p, /* Iterator */
40833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *piPage, /* OUT: The page number of the next page */
40834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *piFrame /* OUT: Wal frame index of next page */
40835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
40836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iMin; /* Result pgno must be greater than iMin */
40837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iRet = 0xFFFFFFFF; /* 0xffffffff is never a valid page number */
40838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* For looping through segments */
40839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iMin = p->iPrior;
40841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iMin<0xffffffff );
40842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=p->nSegment-1; i>=0; i--){
40843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct WalSegment *pSegment = &p->aSegment[i];
40844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pSegment->iNext<pSegment->nEntry ){
40845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iPg = pSegment->aPgno[pSegment->aIndex[pSegment->iNext]];
40846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iPg>iMin ){
40847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iPg<iRet ){
40848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iRet = iPg;
40849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piFrame = pSegment->iZero + pSegment->aIndex[pSegment->iNext];
40850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
40852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSegment->iNext++;
40854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piPage = p->iPrior = iRet;
40858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (iRet==0xFFFFFFFF);
40859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void walMergesort(
40863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aContent, /* Pages in wal */
40864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ht_slot *aBuffer, /* Buffer of at least *pnList items to use */
40865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ht_slot *aList, /* IN/OUT: List to sort */
40866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnList /* IN/OUT: Number of elements in aList[] */
40867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
40868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nList = *pnList;
40869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nList>1 ){
40870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nLeft = nList / 2; /* Elements in left list */
40871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRight = nList - nLeft; /* Elements in right list */
40872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iLeft = 0; /* Current index in aLeft */
40873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iRight = 0; /* Current index in aright */
40874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iOut = 0; /* Current index in output buffer */
40875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ht_slot *aLeft = aList; /* Left list */
40876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ht_slot *aRight = aList+nLeft;/* Right list */
40877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* TODO: Change to non-recursive version. */
40879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walMergesort(aContent, aBuffer, aLeft, &nLeft);
40880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walMergesort(aContent, aBuffer, aRight, &nRight);
40881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( iRight<nRight || iLeft<nLeft ){
40883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ht_slot logpage;
40884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pgno dbpage;
40885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (iLeft<nLeft)
40887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (iRight>=nRight || aContent[aLeft[iLeft]]<aContent[aRight[iRight]])
40888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
40889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ logpage = aLeft[iLeft++];
40890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
40891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ logpage = aRight[iRight++];
40892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dbpage = aContent[logpage];
40894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aBuffer[iOut++] = logpage;
40896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iLeft<nLeft && aContent[aLeft[iLeft]]==dbpage ) iLeft++;
40897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iLeft>=nLeft || aContent[aLeft[iLeft]]>dbpage );
40899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iRight>=nRight || aContent[aRight[iRight]]>dbpage );
40900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(aList, aBuffer, sizeof(aList[0])*iOut);
40902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnList = iOut;
40903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
40906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
40907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
40908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; i<*pnList; i++){
40909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( aContent[aList[i]] > aContent[aList[i-1]] );
40910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
40913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Free an iterator allocated by walIteratorInit().
40917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void walIteratorFree(WalIterator *p){
40919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p);
40920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Map the wal-index into memory owned by this thread, if it is not
40924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mapped already. Then construct a WalInterator object that can be
40925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used to loop over all pages in the WAL in ascending order.
40926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On success, make *pp point to the newly allocated WalInterator object
40928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** return SQLITE_OK. Otherwise, leave *pp unchanged and return an error
40929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** code.
40930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
40931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The calling routine should invoke walIteratorFree() to destroy the
40932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WalIterator object when it has finished with it. The caller must
40933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** also unmap the wal-index. But the wal-index must not be unmapped
40934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** prior to the WalIterator object being destroyed.
40935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walIteratorInit(Wal *pWal, WalIterator **pp){
40937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WalIterator *p; /* Return value */
40938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nSegment; /* Number of segments to merge */
40939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iLast; /* Last frame in log */
40940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nByte; /* Number of bytes to allocate */
40941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Iterator variable */
40942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ht_slot *aTmp; /* Temp space used by merge-sort */
40943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ht_slot *aSpace; /* Space at the end of the allocation */
40944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This routine only runs while holding SQLITE_SHM_CHECKPOINT. No other
40946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** thread is able to write to shared memory while this routine is
40947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** running (or, indeed, while the WalIterator object exists). Hence,
40948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** we can cast off the volatile qualification from shared memory
40949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
40950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->ckptLock );
40951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLast = pWal->hdr.mxFrame;
40952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Allocate space for the WalIterator object */
40954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nSegment = walFramePage(iLast) + 1;
40955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nByte = sizeof(WalIterator)
40956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ + nSegment*(sizeof(struct WalSegment))
40957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ + (nSegment+1)*(HASHTABLE_NPAGE * sizeof(ht_slot));
40958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = (WalIterator *)sqlite3_malloc(nByte);
40959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !p ){
40960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
40961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(p, 0, nByte);
40963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Allocate space for the WalIterator object */
40965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nSegment = nSegment;
40966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aSpace = (ht_slot *)&p->aSegment[nSegment];
40967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aTmp = &aSpace[HASHTABLE_NPAGE*nSegment];
40968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<nSegment; i++){
40969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile ht_slot *aHash;
40970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int j;
40971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iZero;
40972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nEntry;
40973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile u32 *aPgno;
40974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
40975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walHashGet(pWal, i, &aHash, &aPgno, &iZero);
40977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
40978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walIteratorFree(p);
40979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
40980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aPgno++;
40982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nEntry = ((i+1)==nSegment)?iLast-iZero:(u32 *)aHash-(u32 *)aPgno;
40983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iZero++;
40984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<nEntry; j++){
40986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aSpace[j] = j;
40987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walMergesort((u32 *)aPgno, aTmp, aSpace, &nEntry);
40989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->aSegment[i].iZero = iZero;
40990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->aSegment[i].nEntry = nEntry;
40991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->aSegment[i].aIndex = aSpace;
40992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->aSegment[i].aPgno = (u32 *)aPgno;
40993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aSpace += HASHTABLE_NPAGE;
40994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( aSpace==aTmp );
40996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Return the fully initialized WalIterator object */
40998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp = p;
40999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK ;
41000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Copy as much content as we can from the WAL back into the database file
41004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in response to an sqlite3_wal_checkpoint() request or the equivalent.
41005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The amount of information copies from WAL to database might be limited
41007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by active readers. This routine will never overwrite a database page
41008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that a concurrent reader might be using.
41009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** All I/O barrier operations (a.k.a fsyncs) occur in this routine when
41011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLite is in WAL-mode in synchronous=NORMAL. That means that if
41012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** checkpoints are always run by a background thread or background
41013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** process, foreground threads will never block on a lengthy fsync call.
41014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fsync is called on the WAL before writing content out of the WAL and
41016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** into the database. This ensures that if the new content is persistent
41017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in the WAL and can be recovered following a power-loss or hard reset.
41018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fsync is also called on the database file if (and only if) the entire
41020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL content is copied into the database file. This second fsync makes
41021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it safe to delete the WAL since the new content will persist in the
41022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** database file.
41023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine uses and updates the nBackfill field of the wal-index header.
41025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is the only routine tha will increase the value of nBackfill.
41026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (A WAL reset or recovery will revert nBackfill to zero, but not increase
41027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** its value.)
41028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The caller must be holding sufficient locks to ensure that no other
41030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** checkpoint is running (in any other thread or process) at the same
41031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** time.
41032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walCheckpoint(
41034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pWal, /* Wal connection */
41035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sync_flags, /* Flags for OsSync() (or 0) */
41036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nBuf, /* Size of zBuf in bytes */
41037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *zBuf /* Temporary buffer to use */
41038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
41039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
41040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int szPage = pWal->hdr.szPage; /* Database page-size */
41041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WalIterator *pIter = 0; /* Wal iterator context */
41042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iDbpage = 0; /* Next database page to write */
41043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iFrame = 0; /* Wal frame containing data for iDbpage */
41044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 mxSafeFrame; /* Max frame that can be backfilled */
41045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Loop counter */
41046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile WalCkptInfo *pInfo; /* The checkpoint status information */
41047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Allocate the iterator */
41049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walIteratorInit(pWal, &pIter);
41050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK || pWal->hdr.mxFrame==0 ){
41051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto walcheckpoint_out;
41052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*** TODO: Move this test out to the caller. Make it an assert() here ***/
41055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->hdr.szPage!=nBuf ){
41056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_CORRUPT_BKPT;
41057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto walcheckpoint_out;
41058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Compute in mxSafeFrame the index of the last frame of the WAL that is
41061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** safe to write into the database. Frames beyond mxSafeFrame might
41062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** overwrite database pages that are in use by active readers and thus
41063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** cannot be backfilled from the WAL.
41064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxSafeFrame = pWal->hdr.mxFrame;
41066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInfo = walCkptInfo(pWal);
41067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; i<WAL_NREADER; i++){
41068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 y = pInfo->aReadMark[i];
41069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( mxSafeFrame>=y ){
41070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( y<=pWal->hdr.mxFrame );
41071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1);
41072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInfo->aReadMark[i] = READMARK_NOT_USED;
41074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1);
41075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( rc==SQLITE_BUSY ){
41076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxSafeFrame = y;
41077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
41078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto walcheckpoint_out;
41079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInfo->nBackfill<mxSafeFrame
41084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (rc = walLockExclusive(pWal, WAL_READ_LOCK(0), 1))==SQLITE_OK
41085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
41086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 nBackfill = pInfo->nBackfill;
41087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Sync the WAL to disk */
41089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sync_flags ){
41090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsSync(pWal->pWalFd, sync_flags);
41091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Iterate through the contents of the WAL, copying data to the db file. */
41094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){
41095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( walFramePgno(pWal, iFrame)==iDbpage );
41096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iFrame<=nBackfill || iFrame>mxSafeFrame ) continue;
41097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsRead(pWal->pWalFd, zBuf, szPage,
41098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walFrameOffset(iFrame, szPage) + WAL_FRAME_HDRSIZE
41099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
41100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) break;
41101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, (iDbpage-1)*szPage);
41102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) break;
41103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If work was actually accomplished... */
41106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( mxSafeFrame==walIndexHdr(pWal)->mxFrame ){
41108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsTruncate(pWal->pDbFd, ((i64)pWal->hdr.nPage*(i64)szPage));
41109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && sync_flags ){
41110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsSync(pWal->pDbFd, sync_flags);
41111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInfo->nBackfill = mxSafeFrame;
41115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Release the reader lock held while backfilling */
41119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1);
41120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( rc==SQLITE_BUSY ){
41121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Reset the return code so as not to report a checkpoint failure
41122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** just because active readers prevent any backfill.
41123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
41125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walcheckpoint_out:
41128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walIteratorFree(pIter);
41129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Close a connection to a log file.
41134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalClose(
41136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pWal, /* Wal to close */
41137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sync_flags, /* Flags to pass to OsSync() (or 0) */
41138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nBuf,
41139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *zBuf /* Buffer of at least nBuf bytes */
41140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
41141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
41142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal ){
41143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isDelete = 0; /* True to unlink wal and wal-index files */
41144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If an EXCLUSIVE lock can be obtained on the database file (using the
41146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ordinary, rollback-mode locking methods, this guarantees that the
41147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** connection associated with this log file is the only connection to
41148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the database. In this case checkpoint the database and unlink both
41149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the wal and wal-index files.
41150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The EXCLUSIVE lock is not released before returning.
41152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE);
41154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->exclusiveMode = 1;
41156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3WalCheckpoint(pWal, sync_flags, nBuf, zBuf);
41157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isDelete = 1;
41159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walIndexClose(pWal, isDelete);
41163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsClose(pWal->pWalFd);
41164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isDelete ){
41165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsDelete(pWal->pVfs, pWal->zWalName, 0);
41166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: closed\n", pWal));
41168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pWal->apWiData);
41169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pWal);
41170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Try to read the wal-index header. Return 0 on success and 1 if
41176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** there is a problem.
41177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The wal-index is in shared memory. Another thread or process might
41179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be writing the header at the same time this procedure is trying to
41180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** read it, which might result in inconsistency. A dirty read is detected
41181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by verifying that both copies of the header are the same and also by
41182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a checksum on the header.
41183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If and only if the read is consistent and the header is different from
41185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pWal->hdr, then pWal->hdr is updated to the content of the new header
41186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and *pChanged is set to 1.
41187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the checksum cannot be verified return non-zero. If the header
41189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is read successfully and the checksum verified, return zero.
41190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int walIndexTryHdr(Wal *pWal, int *pChanged){
41192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 aCksum[2]; /* Checksum on the header content */
41193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WalIndexHdr h1, h2; /* Two copies of the header content */
41194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WalIndexHdr volatile *aHdr; /* Header in shared memory */
41195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The first page of the wal-index must be mapped at this point. */
41197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->nWiData>0 && pWal->apWiData[0] );
41198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Read the header. This might happen currently with a write to the
41200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** same area of shared memory on a different CPU in a SMP,
41201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** meaning it is possible that an inconsistent snapshot is read
41202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** from the file. If this happens, return non-zero.
41203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** There are two copies of the header at the beginning of the wal-index.
41205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When reading, read [0] first then [1]. Writes are in the reverse order.
41206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Memory barriers are used to prevent the compiler or the hardware from
41207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** reordering the reads and writes.
41208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aHdr = walIndexHdr(pWal);
41210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&h1, (void *)&aHdr[0], sizeof(h1));
41211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsShmBarrier(pWal->pDbFd);
41212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&h2, (void *)&aHdr[1], sizeof(h2));
41213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( memcmp(&h1, &h2, sizeof(h1))!=0 ){
41215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1; /* Dirty read */
41216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( h1.isInit==0 ){
41218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1; /* Malformed header - probably all zeros */
41219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walChecksumBytes(1, (u8*)&h1, sizeof(h1)-sizeof(h1.aCksum), 0, aCksum);
41221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aCksum[0]!=h1.aCksum[0] || aCksum[1]!=h1.aCksum[1] ){
41222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1; /* Checksum does not match */
41223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( memcmp(&pWal->hdr, &h1, sizeof(WalIndexHdr)) ){
41226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pChanged = 1;
41227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&pWal->hdr, &h1, sizeof(WalIndexHdr));
41228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->szPage = pWal->hdr.szPage;
41229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The header was successfully read. Return zero. */
41232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
41233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read the wal-index header from the wal-index and into pWal->hdr.
41237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the wal-header appears to be corrupt, try to recover the log
41238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** before returning.
41239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Set *pChanged to 1 if the wal-index header value in pWal->hdr is
41241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** changed by this opertion. If pWal->hdr is unchanged, set *pChanged
41242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to 0.
41243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine also maps the wal-index content into memory and assigns
41245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ownership of that mapping to the current thread. In some implementations,
41246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** only one thread at a time can hold a mapping of the wal-index. Hence,
41247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the caller should strive to invoke walIndexUnmap() as soon as possible
41248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** after this routine returns.
41249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the wal-index header is successfully read, return SQLITE_OK.
41251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise an SQLite error code.
41252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walIndexReadHdr(Wal *pWal, int *pChanged){
41254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
41255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int badHdr; /* True if a header read failed */
41256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile u32 *page0;
41257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Ensure that page 0 of the wal-index (the page that contains the
41259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wal-index header) is mapped. Return early if an error occurs here.
41260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pChanged );
41262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walIndexPage(pWal, 0, &page0);
41263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
41264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
41266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( page0 || pWal->writeLock==0 );
41267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the first page of the wal-index has been mapped, try to read the
41269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wal-index header immediately, without holding any lock. This usually
41270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** works, but may fail if the wal-index header is corrupt or currently
41271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** being modified by another user.
41272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ badHdr = (page0 ? walIndexTryHdr(pWal, pChanged) : 1);
41274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the first attempt failed, it might have been due to a race
41276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** with a writer. So get a WRITE lock and try again.
41277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( badHdr==0 || pWal->writeLock==0 );
41279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( badHdr && SQLITE_OK==(rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1)) ){
41280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->writeLock = 1;
41281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){
41282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ badHdr = walIndexTryHdr(pWal, pChanged);
41283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( badHdr ){
41284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the wal-index header is still malformed even while holding
41285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a WRITE lock, it can only mean that the header is corrupted and
41286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** needs to be reconstructed. So run recovery to do exactly that.
41287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walIndexRecover(pWal);
41289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pChanged = 1;
41290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->writeLock = 0;
41293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1);
41294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is the value that walTryBeginRead returns when it needs to
41301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be retried.
41302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WAL_RETRY (-1)
41304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Attempt to start a read transaction. This might fail due to a race or
41307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** other transient condition. When that happens, it returns WAL_RETRY to
41308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** indicate to the caller that it is safe to retry immediately.
41309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On success return SQLITE_OK. On a permantent failure (such an
41311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** I/O error or an SQLITE_BUSY because another process is running
41312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** recovery) return a positive error code.
41313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On success, this routine obtains a read lock on
41315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL_READ_LOCK(pWal->readLock). The pWal->readLock integer is
41316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in the range 0 <= pWal->readLock < WAL_NREADER. If pWal->readLock==(-1)
41317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that means the Wal does not hold any read lock. The reader must not
41318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** access any database page that is modified by a WAL frame up to and
41319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** including frame number aReadMark[pWal->readLock]. The reader will
41320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** use WAL frames up to and including pWal->hdr.mxFrame if pWal->readLock>0
41321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Or if pWal->readLock==0, then the reader will ignore the WAL
41322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** completely and get all content directly from the database file.
41323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When the read transaction is completed, the caller must release the
41324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** lock on WAL_READ_LOCK(pWal->readLock) and set pWal->readLock to -1.
41325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine uses the nBackfill and aReadMark[] fields of the header
41327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to select a particular WAL_READ_LOCK() that strives to let the
41328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** checkpoint process do as much work as possible. This routine might
41329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** update values of the aReadMark[] array in the header, but if it does
41330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** so it takes care to hold an exclusive lock on the corresponding
41331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL_READ_LOCK() while changing values.
41332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
41334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile WalCkptInfo *pInfo; /* Checkpoint information in wal-index */
41335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 mxReadMark; /* Largest aReadMark[] value */
41336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mxI; /* Index of largest aReadMark[] value */
41337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Loop counter */
41338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Return code */
41339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->readLock<0 ); /* Not currently locked */
41341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Take steps to avoid spinning forever if there is a protocol error. */
41343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( cnt>5 ){
41344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( cnt>100 ) return SQLITE_PROTOCOL;
41345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsSleep(pWal->pVfs, 1);
41346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !useWal ){
41349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walIndexReadHdr(pWal, pChanged);
41350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_BUSY ){
41351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If there is not a recovery running in another thread or process
41352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then convert BUSY errors to WAL_RETRY. If recovery is known to
41353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be running, convert BUSY to BUSY_RECOVERY. There is a race here
41354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** which might cause WAL_RETRY to be returned even if BUSY_RECOVERY
41355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** would be technically correct. But the race is benign since with
41356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL_RETRY this routine will be called again and will probably be
41357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** right on the second iteration.
41358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walLockShared(pWal, WAL_RECOVER_LOCK);
41360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockShared(pWal, WAL_RECOVER_LOCK);
41362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = WAL_RETRY;
41363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( rc==SQLITE_BUSY ){
41364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_BUSY_RECOVERY;
41365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
41369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInfo = walCkptInfo(pWal);
41373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame ){
41374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The WAL has been completely backfilled (or it is empty).
41375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and can be safely ignored.
41376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walLockShared(pWal, WAL_READ_LOCK(0));
41378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsShmBarrier(pWal->pDbFd);
41379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) ){
41381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* It is not safe to allow the reader to continue here if frames
41382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** may have been appended to the log before READ_LOCK(0) was obtained.
41383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When holding READ_LOCK(0), the reader ignores the entire log file,
41384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** which implies that the database file contains a trustworthy
41385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** snapshoT. Since holding READ_LOCK(0) prevents a checkpoint from
41386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** happening, this is usually correct.
41387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** However, if frames have been appended to the log (or if the log
41389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is wrapped and written for that matter) before the READ_LOCK(0)
41390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is obtained, that is not necessarily true. A checkpointer may
41391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** have started to backfill the appended frames but crashed before
41392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it finished. Leaving a corrupt image in the database file.
41393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockShared(pWal, WAL_READ_LOCK(0));
41395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return WAL_RETRY;
41396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->readLock = 0;
41398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
41399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( rc!=SQLITE_BUSY ){
41400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If we get this far, it means that the reader will want to use
41405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the WAL to get at content from recent commits. The job now is
41406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to select one of the aReadMark[] entries that is closest to
41407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** but not exceeding pWal->hdr.mxFrame and lock that entry.
41408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxReadMark = 0;
41410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxI = 0;
41411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; i<WAL_NREADER; i++){
41412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 thisMark = pInfo->aReadMark[i];
41413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( mxReadMark<=thisMark && thisMark<=pWal->hdr.mxFrame ){
41414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( thisMark!=READMARK_NOT_USED );
41415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxReadMark = thisMark;
41416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxI = i;
41417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( mxI==0 ){
41420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If we get here, it means that all of the aReadMark[] entries between
41421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1 and WAL_NREADER-1 are zero. Try to initialize aReadMark[1] to
41422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be mxFrame, then retry.
41423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walLockExclusive(pWal, WAL_READ_LOCK(1), 1);
41425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInfo->aReadMark[1] = pWal->hdr.mxFrame;
41427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockExclusive(pWal, WAL_READ_LOCK(1), 1);
41428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = WAL_RETRY;
41429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( rc==SQLITE_BUSY ){
41430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = WAL_RETRY;
41431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
41434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( mxReadMark < pWal->hdr.mxFrame ){
41435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; i<WAL_NREADER; i++){
41436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1);
41437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxReadMark = pInfo->aReadMark[i] = pWal->hdr.mxFrame;
41439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxI = i;
41440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1);
41441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
41442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( rc!=SQLITE_BUSY ){
41443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walLockShared(pWal, WAL_READ_LOCK(mxI));
41449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ){
41450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc==SQLITE_BUSY ? WAL_RETRY : rc;
41451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Now that the read-lock has been obtained, check that neither the
41453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** value in the aReadMark[] array or the contents of the wal-index
41454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** header have changed.
41455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** It is necessary to check that the wal-index header did not change
41457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** between the time it was read and when the shared-lock was obtained
41458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** on WAL_READ_LOCK(mxI) was obtained to account for the possibility
41459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that the log file may have been wrapped by a writer, or that frames
41460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that occur later in the log than pWal->hdr.mxFrame may have been
41461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** copied into the database by a checkpointer. If either of these things
41462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** happened, then reading the database with the current value of
41463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pWal->hdr.mxFrame risks reading a corrupted snapshot. So, retry
41464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** instead.
41465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This does not guarantee that the copy of the wal-index header is up to
41467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** date before proceeding. That would not be possible without somehow
41468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** blocking writers. It only guarantees that a dangerous checkpoint or
41469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** log-wrap (either of which would require an exclusive lock on
41470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL_READ_LOCK(mxI)) has not occurred since the snapshot was valid.
41471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsShmBarrier(pWal->pDbFd);
41473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInfo->aReadMark[mxI]!=mxReadMark
41474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr))
41475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
41476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockShared(pWal, WAL_READ_LOCK(mxI));
41477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return WAL_RETRY;
41478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
41479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( mxReadMark<=pWal->hdr.mxFrame );
41480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->readLock = mxI;
41481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Begin a read transaction on the database.
41488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine used to be called sqlite3OpenSnapshot() and with good reason:
41490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it takes a snapshot of the state of the WAL and wal-index for the current
41491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** instant in time. The current thread will continue to use this snapshot.
41492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Other threads might append new content to the WAL and wal-index but
41493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that extra content is ignored by the current thread.
41494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the database contents have changes since the previous read
41496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** transaction, then *pChanged is set to 1 before returning. The
41497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Pager layer will use this to know that is cache is stale and
41498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** needs to be flushed.
41499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){
41501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
41502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int cnt = 0; /* Number of TryBeginRead attempts */
41503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do{
41505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walTryBeginRead(pWal, pChanged, 0, ++cnt);
41506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }while( rc==WAL_RETRY );
41507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Finish with a read transaction. All this does is release the
41512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** read-lock.
41513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal){
41515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->readLock>=0 ){
41516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock));
41517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->readLock = -1;
41518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read a page from the WAL, if it is present in the WAL and if the
41523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current read transaction is configured to use the WAL.
41524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The *pInWal is set to 1 if the requested page is in the WAL and
41526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** has been loaded. Or *pInWal is set to 0 if the page was not in
41527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the WAL and needs to be read out of the database.
41528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalRead(
41530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pWal, /* WAL handle */
41531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pgno pgno, /* Database page number to read data for */
41532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pInWal, /* OUT: True if data is read from WAL */
41533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nOut, /* Size of buffer pOut in bytes */
41534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *pOut /* Buffer to write page data to */
41535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
41536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iRead = 0; /* If !=0, WAL frame to return data from */
41537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */
41538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iHash; /* Used to loop through N hash tables */
41539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This routine is only be called from within a read transaction. */
41541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->readLock>=0 || pWal->lockError );
41542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the "last page" field of the wal-index header snapshot is 0, then
41544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** no data will be read from the wal under any circumstances. Return early
41545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in this case to avoid the walIndexMap/Unmap overhead. Likewise, if
41546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pWal->readLock==0, then the WAL is ignored by the reader so
41547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** return early, as if the WAL were empty.
41548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iLast==0 || pWal->readLock==0 ){
41550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pInWal = 0;
41551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
41552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Search the hash table or tables for an entry matching page number
41555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pgno. Each iteration of the following for() loop searches one
41556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** hash table (each hash table indexes up to HASHTABLE_NPAGE frames).
41557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This code may run concurrently to the code in walIndexAppend()
41559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that adds entries to the wal-index (and possibly to this hash
41560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** table). This means the value just read from the hash
41561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** slot (aHash[iKey]) may have been added before or after the
41562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current read transaction was opened. Values added after the
41563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** read transaction was opened may have been written incorrectly -
41564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** i.e. these slots may contain garbage data. However, we assume
41565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that any slots written before the current read transaction was
41566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** opened remain unmodified.
41567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For the reasons above, the if(...) condition featured in the inner
41569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** loop of the following block is more stringent that would be required
41570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if we had exclusive access to the hash-table:
41571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (aPgno[iFrame]==pgno):
41573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This condition filters out normal hash-table collisions.
41574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (iFrame<=iLast):
41576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This condition filters out entries that were added to the hash
41577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** table after the current read-transaction had started.
41578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iHash=walFramePage(iLast); iHash>=0 && iRead==0; iHash--){
41580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile ht_slot *aHash; /* Pointer to hash table */
41581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile u32 *aPgno; /* Pointer to array of page numbers */
41582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iZero; /* Frame number corresponding to aPgno[0] */
41583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iKey; /* Hash slot index */
41584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
41585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walHashGet(pWal, iHash, &aHash, &aPgno, &iZero);
41587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
41588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iKey=walHash(pgno); aHash[iKey]; iKey=walNextHash(iKey)){
41591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iFrame = aHash[iKey] + iZero;
41592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iFrame<=iLast && aPgno[aHash[iKey]]==pgno ){
41593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iFrame>iRead );
41594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iRead = iFrame;
41595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
41600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If expensive assert() statements are available, do a linear search
41601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the wal-index file content. Make sure the results agree with the
41602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** result obtained using the hash indexes above. */
41603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
41604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iRead2 = 0;
41605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iTest;
41606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iTest=iLast; iTest>0; iTest--){
41607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( walFramePgno(pWal, iTest)==pgno ){
41608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iRead2 = iTest;
41609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
41610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iRead==iRead2 );
41613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
41615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If iRead is non-zero, then it is the log frame number that contains the
41617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** required page. Read and return data from the log file.
41618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iRead ){
41620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 iOffset = walFrameOffset(iRead, pWal->hdr.szPage) + WAL_FRAME_HDRSIZE;
41621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pInWal = 1;
41622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return sqlite3OsRead(pWal->pWalFd, pOut, nOut, iOffset);
41623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pInWal = 0;
41626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
41627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Set *pPgno to the size of the database file (or zero, if unknown).
41632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3WalDbsize(Wal *pWal, Pgno *pPgno){
41634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->readLock>=0 || pWal->lockError );
41635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pPgno = pWal->hdr.nPage;
41636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function starts a write transaction on the WAL.
41641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A read transaction must have already been started by a prior call
41643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to sqlite3WalBeginReadTransaction().
41644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If another thread or process has written into the database since
41646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the read transaction was started, then it is not possible for this
41647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** thread to write as doing so would cause a fork. So this routine
41648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** returns SQLITE_BUSY in that case and no write transaction is started.
41649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** There can only be a single writer active at a time.
41651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){
41653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
41654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Cannot start a write transaction without first holding a read
41656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** transaction. */
41657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->readLock>=0 );
41658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Only one writer allowed at a time. Get the write lock. Return
41660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_BUSY if unable.
41661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1);
41663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ){
41664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->writeLock = 1;
41667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If another connection has written to the database file since the
41669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** time the read transaction on this connection was started, then
41670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the write is disallowed.
41671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){
41673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1);
41674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->writeLock = 0;
41675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_BUSY;
41676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** End a write transaction. The commit has already been done. This
41683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** routine merely releases the lock.
41684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal){
41686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1);
41687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->writeLock = 0;
41688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
41689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If any data has been written (but not committed) to the log file, this
41693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function moves the write-pointer back to the start of the transaction.
41694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Additionally, the callback function is invoked for each frame written
41696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to the WAL since the start of the transaction. If the callback returns
41697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** other than SQLITE_OK, it is not invoked again and the error code is
41698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** returned to the caller.
41699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, if the callback function does not return an error, this
41701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function returns SQLITE_OK.
41702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){
41704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
41705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->writeLock ){
41706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pgno iMax = pWal->hdr.mxFrame;
41707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pgno iFrame;
41708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Restore the clients cache of the wal-index header to the state it
41710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** was in before the client began writing to the database.
41711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr));
41713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iFrame=pWal->hdr.mxFrame+1;
41715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ALWAYS(rc==SQLITE_OK) && iFrame<=iMax;
41716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iFrame++
41717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
41718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This call cannot fail. Unless the page for which the page number
41719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is passed as the second argument is (a) in the cache and
41720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (b) has an outstanding reference, then xUndo is either a no-op
41721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (if (a) is false) or simply expels the page from the cache (if (b)
41722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is false).
41723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the upper layer is doing a rollback, it is guaranteed that there
41725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are no outstanding references to any page other than page 1. And
41726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** page 1 is never written to the log until the transaction is
41727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** committed. As a result, the call to xUndo may not fail.
41728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( walFramePgno(pWal, iFrame)!=1 );
41730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = xUndo(pUndoCtx, walFramePgno(pWal, iFrame));
41731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walCleanupHash(pWal);
41733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rc==SQLITE_OK );
41735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Argument aWalData must point to an array of WAL_SAVEPOINT_NDATA u32
41740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** values. This function populates the array with values required to
41741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "rollback" the write position of the WAL handle back to the current
41742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** point in the event of a savepoint rollback (via WalSavepointUndo()).
41743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){
41745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->writeLock );
41746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aWalData[0] = pWal->hdr.mxFrame;
41747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aWalData[1] = pWal->hdr.aFrameCksum[0];
41748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aWalData[2] = pWal->hdr.aFrameCksum[1];
41749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aWalData[3] = pWal->nCkpt;
41750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Move the write position of the WAL back to the point identified by
41754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the values in the aWalData[] array. aWalData must point to an array
41755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of WAL_SAVEPOINT_NDATA u32 values that has been previously populated
41756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by a call to WalSavepoint().
41757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){
41759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
41760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->writeLock );
41762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( aWalData[3]!=pWal->nCkpt || aWalData[0]<=pWal->hdr.mxFrame );
41763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aWalData[3]!=pWal->nCkpt ){
41765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This savepoint was opened immediately after the write-transaction
41766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** was started. Right after that, the writer decided to wrap around
41767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to the start of the log. Update the savepoint values to match.
41768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aWalData[0] = 0;
41770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aWalData[3] = pWal->nCkpt;
41771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aWalData[0]<pWal->hdr.mxFrame ){
41774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.mxFrame = aWalData[0];
41775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.aFrameCksum[0] = aWalData[1];
41776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.aFrameCksum[1] = aWalData[2];
41777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walCleanupHash(pWal);
41778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called just before writing a set of frames to the log
41785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file (see sqlite3WalFrames()). It checks to see if, instead of appending
41786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to the current log file, it is possible to overwrite the start of the
41787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** existing log file with the new frames (i.e. "reset" the log). If so,
41788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it sets pWal->hdr.mxFrame to 0. Otherwise, pWal->hdr.mxFrame is left
41789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** unchanged.
41790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_OK is returned if no error is encountered (regardless of whether
41792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or not pWal->hdr.mxFrame is modified). An SQLite error code is returned
41793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if some error
41794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int walRestartLog(Wal *pWal){
41796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
41797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int cnt;
41798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->readLock==0 ){
41800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ volatile WalCkptInfo *pInfo = walCkptInfo(pWal);
41801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInfo->nBackfill==pWal->hdr.mxFrame );
41802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInfo->nBackfill>0 ){
41803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1);
41804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If all readers are using WAL_READ_LOCK(0) (in other words if no
41806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** readers are currently using the WAL), then the transactions
41807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** frames will overwrite the start of the existing log. Update the
41808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wal-index header to reflect this.
41809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** In theory it would be Ok to update the cache of the header only
41811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** at this point. But updating the actual wal-index header is also
41812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** safe and means there is no special case for sqlite3WalUndo()
41813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to handle if this transaction is rolled back.
41814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Loop counter */
41816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aSalt = pWal->hdr.aSalt; /* Big-endian salt values */
41817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->nCkpt++;
41818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.mxFrame = 0;
41819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0]));
41820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_randomness(4, &aSalt[1]);
41821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walIndexWriteHdr(pWal);
41822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInfo->nBackfill = 0;
41823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED;
41824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInfo->aReadMark[0]==0 );
41825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1);
41826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockShared(pWal, WAL_READ_LOCK(0));
41829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->readLock = -1;
41830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cnt = 0;
41831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do{
41832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int notUsed;
41833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt);
41834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }while( rc==WAL_RETRY );
41835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Write a set of frames to the log. The caller must hold the write-lock
41841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** on the log file (obtained using sqlite3WalBeginWriteTransaction()).
41842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalFrames(
41844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pWal, /* Wal handle to write to */
41845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int szPage, /* Database page-size in bytes */
41846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *pList, /* List of dirty pages to write */
41847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pgno nTruncate, /* Database size after this commit */
41848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isCommit, /* True if this is a commit */
41849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sync_flags /* Flags to pass to OsSync() (or 0) */
41850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
41851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Used to catch return codes */
41852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iFrame; /* Next frame address */
41853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */
41854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *p; /* Iterator to run through pList with. */
41855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PgHdr *pLast = 0; /* Last frame in list */
41856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nLast = 0; /* Number of extra copies of last page */
41857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pList );
41859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->writeLock );
41860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
41862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { int cnt; for(cnt=0, p=pList; p; p=p->pDirty, cnt++){}
41863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: frame write begin. %d frames. mxFrame=%d. %s\n",
41864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal, cnt, pWal->hdr.mxFrame, isCommit ? "Commit" : "Spill"));
41865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
41867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* See if it is possible to write these frames into the start of the
41869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** log file, instead of appending to it at pWal->hdr.mxFrame.
41870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SQLITE_OK!=(rc = walRestartLog(pWal)) ){
41872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If this is the first frame written into the log, write the WAL
41876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** header to the start of the WAL file. See comments at the top of
41877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this source file for a description of the WAL header format.
41878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iFrame = pWal->hdr.mxFrame;
41880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iFrame==0 ){
41881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 aWalHdr[WAL_HDRSIZE]; /* Buffer to assembly wal-header in */
41882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Put4byte(&aWalHdr[0], (WAL_MAGIC | SQLITE_BIGENDIAN));
41883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Put4byte(&aWalHdr[4], 3007000);
41884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Put4byte(&aWalHdr[8], szPage);
41885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->szPage = szPage;
41886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.bigEndCksum = SQLITE_BIGENDIAN;
41887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Put4byte(&aWalHdr[12], pWal->nCkpt);
41888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&aWalHdr[16], pWal->hdr.aSalt, 8);
41889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsWrite(pWal->pWalFd, aWalHdr, sizeof(aWalHdr), 0);
41890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: wal-header write %s\n", pWal, rc ? "failed" : "ok"));
41891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
41892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walChecksumBytes(1, aWalHdr, sizeof(aWalHdr), 0, pWal->hdr.aFrameCksum);
41895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->szPage==szPage );
41897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Write the log file. */
41899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=pList; p; p=p->pDirty){
41900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 nDbsize; /* Db-size field for frame header */
41901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 iOffset; /* Write offset in log file */
41902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iOffset = walFrameOffset(++iFrame, szPage);
41904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Populate and write the frame header */
41906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDbsize = (isCommit && p->pDirty==0) ? nTruncate : 0;
41907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walEncodeFrame(pWal, p->pgno, nDbsize, p->pData, aFrame);
41908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsWrite(pWal->pWalFd, aFrame, sizeof(aFrame), iOffset);
41909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
41910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Write the page data */
41914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsWrite(pWal->pWalFd, p->pData, szPage, iOffset+sizeof(aFrame));
41915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
41916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pLast = p;
41919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Sync the log file if the 'isSync' flag was specified. */
41922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sync_flags ){
41923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 iSegment = sqlite3OsSectorSize(pWal->pWalFd);
41924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 iOffset = walFrameOffset(iFrame+1, szPage);
41925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( isCommit );
41927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iSegment>0 );
41928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iSegment = (((iOffset+iSegment-1)/iSegment) * iSegment);
41930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( iOffset<iSegment ){
41931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walEncodeFrame(pWal, pLast->pgno, nTruncate, pLast->pData, aFrame);
41932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsWrite(pWal->pWalFd, aFrame, sizeof(aFrame), iOffset);
41933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
41934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iOffset += WAL_FRAME_HDRSIZE;
41938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsWrite(pWal->pWalFd, pLast->pData, szPage, iOffset);
41939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
41940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLast++;
41943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iOffset += szPage;
41944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsSync(pWal->pWalFd, sync_flags);
41947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Append data to the wal-index. It is not necessary to lock the
41950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wal-index to do this as the SQLITE_SHM_WRITE lock held on the wal-index
41951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** guarantees that there are no other writers, and no data that may
41952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be in use by existing readers is being overwritten.
41953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iFrame = pWal->hdr.mxFrame;
41955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=pList; p && rc==SQLITE_OK; p=p->pDirty){
41956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iFrame++;
41957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walIndexAppend(pWal, iFrame, p->pgno);
41958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( nLast>0 && rc==SQLITE_OK ){
41960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iFrame++;
41961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLast--;
41962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walIndexAppend(pWal, iFrame, pLast->pgno);
41963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
41966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Update the private copy of the header. */
41967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.szPage = szPage;
41968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.mxFrame = iFrame;
41969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isCommit ){
41970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.iChange++;
41971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->hdr.nPage = nTruncate;
41972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If this is a commit, update the wal-index header too. */
41974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isCommit ){
41975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walIndexWriteHdr(pWal);
41976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->iCallback = iFrame;
41977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: frame write %s\n", pWal, rc ? "failed" : "ok"));
41981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
41982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
41983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
41985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine is called to implement sqlite3_wal_checkpoint() and
41986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** related interfaces.
41987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
41988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Obtain a CHECKPOINT lock and then backfill as much information as
41989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** we can from WAL into the database.
41990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
41991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalCheckpoint(
41992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wal *pWal, /* Wal connection */
41993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sync_flags, /* Flags to sync db file with (or 0) */
41994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nBuf, /* Size of temporary buffer */
41995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *zBuf /* Temporary buffer to use */
41996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
41997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
41998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isChanged = 0; /* True if a new wal-index header is loaded */
41999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->ckptLock==0 );
42001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: checkpoint begins\n", pWal));
42003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1);
42004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ){
42005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Usually this is SQLITE_BUSY meaning that another thread or process
42006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is already running a checkpoint, or maybe a recovery. But it might
42007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** also be SQLITE_IOERR. */
42008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
42009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
42010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->ckptLock = 1;
42011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Copy data from the log to the database file. */
42013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walIndexReadHdr(pWal, &isChanged);
42014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
42015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = walCheckpoint(pWal, sync_flags, nBuf, zBuf);
42016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
42017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isChanged ){
42018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If a new wal-index header was loaded before the checkpoint was
42019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** performed, then the pager-cache associated with pWal is now
42020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** out of date. So zero the cached wal-index header to ensure that
42021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** next time the pager opens a snapshot on this database it knows that
42022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the cache needs to be reset.
42023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
42024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&pWal->hdr, 0, sizeof(WalIndexHdr));
42025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
42026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Release the locks. */
42028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1);
42029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->ckptLock = 0;
42030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WALTRACE(("WAL%p: checkpoint %s\n", pWal, rc ? "failed" : "ok"));
42031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
42032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
42033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Return the value to pass to a sqlite3_wal_hook callback, the
42035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** number of frames in the WAL at the point of the last commit since
42036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3WalCallback() was called. If no commits have occurred since
42037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the last call, then return 0.
42038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
42039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal){
42040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 ret = 0;
42041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal ){
42042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ret = pWal->iCallback;
42043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->iCallback = 0;
42044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
42045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (int)ret;
42046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
42047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
42049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called to change the WAL subsystem into or out
42050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of locking_mode=EXCLUSIVE.
42051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
42052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If op is zero, then attempt to change from locking_mode=EXCLUSIVE
42053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** into locking_mode=NORMAL. This means that we must acquire a lock
42054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** on the pWal->readLock byte. If the WAL is already in locking_mode=NORMAL
42055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or if the acquisition of the lock fails, then return 0. If the
42056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** transition out of exclusive-mode is successful, return 1. This
42057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** operation must occur while the pager is still holding the exclusive
42058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** lock on the main database file.
42059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
42060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If op is one, then change from locking_mode=NORMAL into
42061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** locking_mode=EXCLUSIVE. This means that the pWal->readLock must
42062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be released. Return 1 if the transition is made and 0 if the
42063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL is already in exclusive-locking mode - meaning that this
42064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** routine is a no-op. The pager must already hold the exclusive lock
42065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** on the main database file before invoking this operation.
42066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
42067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If op is negative, then do a dry-run of the op==1 case but do
42068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** not actually change anything. The pager uses this to see if it
42069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** should acquire the database exclusive lock prior to invoking
42070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the op==1 case.
42071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
42072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){
42073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
42074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->writeLock==0 );
42075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* pWal->readLock is usually set, but might be -1 if there was a
42077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** prior error while attempting to acquire are read-lock. This cannot
42078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** happen if the connection is actually in exclusive mode (as no xShmLock
42079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** locks are taken in this case). Nor should the pager attempt to
42080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** upgrade to exclusive-mode following such an error.
42081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
42082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->readLock>=0 || pWal->lockError );
42083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) );
42084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( op==0 ){
42086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWal->exclusiveMode ){
42087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->exclusiveMode = 0;
42088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){
42089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->exclusiveMode = 1;
42090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
42091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pWal->exclusiveMode==0;
42092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
42093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Already in locking_mode=NORMAL */
42094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = 0;
42095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
42096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( op>0 ){
42097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->exclusiveMode==0 );
42098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWal->readLock>=0 );
42099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock));
42100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWal->exclusiveMode = 1;
42101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = 1;
42102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
42103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pWal->exclusiveMode==0;
42104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
42105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
42106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
42107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* #ifndef SQLITE_OMIT_WAL */
42109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /************** End of wal.c *************************************************/
37842 42111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Begin file btmutex.c *****************************************/
37843 42112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
37844 42113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 2007 August 27
37845 42114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
37846 42115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The author disclaims copyright to this source code. In place of
@@ -38278,10 +42547,11 @@
38278 42547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */
38279 42548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */
38280 42549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u16 maxLeaf; /* Maximum local payload in a LEAFDATA table */
38281 42550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u16 minLeaf; /* Minimum local payload in a LEAFDATA table */
38282 42551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 inTransaction; /* Transaction state */
42552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 doNotUseWAL; /* If true, do not open write-ahead-log file */
38283 42553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTransaction; /* Number of open transactions (read + write) */
38284 42554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u32 nPage; /* Number of pages in the database */
38285 42555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pSchema; /* Pointer to space allocated by sqlite3BtreeSchema() */
38286 42556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*xFreeSchema)(void*); /* Destructor for BtShared.pSchema */
38287 42557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_mutex *mutex; /* Non-recursive mutex required to access this struct */
@@ -41094,11 +45364,11 @@
41094 45364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
41095 45365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData);
41096 45366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (rc = sqlite3PagerPagecount(pBt->pPager, &nPageFile))!=SQLITE_OK ){;
41097 45367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto page1_init_failed;
41098 45368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
41099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nPage==0 ){
45369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){
41100 45370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nPage = nPageFile;
41101 45371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
41102 45372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nPage>0 ){
41103 45373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int pageSize;
41104 45374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int usableSize;
@@ -41105,16 +45375,46 @@
41105 45375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 *page1 = pPage1->aData;
41106 45376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_NOTADB;
41107 45377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( memcmp(page1, zMagicHeader, 16)!=0 ){
41108 45378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto page1_init_failed;
41109 45379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
45380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
45381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_OMIT_WAL
41110 45382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( page1[18]>1 ){
41111 45383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pBt->readOnly = 1;
41112 45384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
41113 45385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( page1[19]>1 ){
41114 45386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto page1_init_failed;
41115 45387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
45388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
45389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( page1[18]>2 ){
45390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBt->readOnly = 1;
45391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
45392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( page1[19]>2 ){
45393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto page1_init_failed;
45394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
45395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
45396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the write version is set to 2, this database should be accessed
45397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in WAL mode. If the log is not already open, open it now. Then
45398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** return SQLITE_OK and return without populating BtShared.pPage1.
45399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The caller detects this and calls this function again. This is
45400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** required as the version of page 1 currently in the page1 buffer
45401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** may not be the latest version - there may be a newer one in the log
45402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file.
45403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
45404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( page1[19]==2 && pBt->doNotUseWAL==0 ){
45405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isOpen = 0;
45406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3PagerOpenWal(pBt->pPager, &isOpen);
45407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
45408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto page1_init_failed;
45409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( isOpen==0 ){
45410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ releasePage(pPage1);
45411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
45412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
45413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_NOTADB;
45414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
45415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
41116 45416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
41117 45417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The maximum embedded fraction must be exactly 25%. And the minimum
41118 45418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** embedded fraction must be 12.5% for both leaf-data and non-leaf-data.
41119 45419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The original design allowed these amounts to vary, but as of
41120 45420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** version 3.6.0, we require them to be fixed.
@@ -41360,11 +45660,11 @@
41360 45660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
41361 45661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
41362 45662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
41363 45663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unlockBtreeIfUnused(pBt);
41364 45664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
41365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }while( rc==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE &&
45665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE &&
41366 45666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
btreeInvokeBusyHandler(pBt) );
41367 45667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
41368 45668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
41369 45669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->inTrans==TRANS_NONE ){
41370 45670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pBt->nTransaction++;
@@ -46807,10 +51107,46 @@
46807 51107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert(!pCur->isIncrblobHandle);
46808 51108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert(!pCur->aOverflow);
46809 51109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCur->isIncrblobHandle = 1;
46810 51110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
46811 51111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
51112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
51113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
51114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Set both the "read version" (single byte at byte offset 18) and
51115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "write version" (single byte at byte offset 19) fields in the database
51116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** header to iVersion.
51117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
51118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){
51119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ BtShared *pBt = pBtree->pBt;
51120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
51121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
51122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pBtree->inTrans==TRANS_NONE );
51123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iVersion==1 || iVersion==2 );
51124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
51125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If setting the version fields to 1, do not automatically open the
51126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL connection, even if the version fields are currently set to 2.
51127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
51128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBt->doNotUseWAL = (iVersion==1);
51129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
51130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3BtreeBeginTrans(pBtree, 0);
51131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
51132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *aData = pBt->pPage1->aData;
51133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aData[18]!=(u8)iVersion || aData[19]!=(u8)iVersion ){
51134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3BtreeBeginTrans(pBtree, 2);
51135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
51136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
51137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
51138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aData[18] = (u8)iVersion;
51139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aData[19] = (u8)iVersion;
51140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
51141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
51142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
51143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
51144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
51145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pBt->doNotUseWAL = 0;
51146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
51147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
46812 51148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
46813 51149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** End of btree.c ***********************************************/
46814 51150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Begin file backup.c ******************************************/
46815 51151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
46816 51152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 2009 January 28
@@ -47027,11 +51363,11 @@
47027 51363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( zSrcData );
47028 51364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
47029 51365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Catch the case where the destination is an in-memory database and the
47030 51366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** page sizes of the source and destination differ.
47031 51367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
47032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(sqlite3BtreePager(p->pDest)) ){
51368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(pDestPager) ){
47033 51369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_READONLY;
47034 51370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
47035 51371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
47036 51372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* This loop runs once for each destination page spanned by the source
47037 51373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** page. For each iteration, variable iOff is set to the byte offset
@@ -47097,10 +51433,13 @@
47097 51433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
47098 51434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Copy nPage pages from the source b-tree to the destination.
47099 51435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
47100 51436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){
47101 51437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
51438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int destMode; /* Destination journal mode */
51439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int pgszSrc = 0; /* Source page size */
51440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int pgszDest = 0; /* Destination page size */
47102 51441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
47103 51442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_mutex_enter(p->pSrcDb->mutex);
47104 51443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BtreeEnter(p->pSrc);
47105 51444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->pDestDb ){
47106 51445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_mutex_enter(p->pDestDb->mutex);
@@ -47137,10 +51476,19 @@
47137 51476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
47138 51477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK && 0==sqlite3BtreeIsInReadTrans(p->pSrc) ){
47139 51478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3BtreeBeginTrans(p->pSrc, 0);
47140 51479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bCloseTrans = 1;
47141 51480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
51481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
51482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Do not allow backup if the destination database is in WAL mode
51483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and the page sizes are different between source and destination */
51484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pgszSrc = sqlite3BtreeGetPageSize(p->pSrc);
51485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pgszDest = sqlite3BtreeGetPageSize(p->pDest);
51486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ destMode = sqlite3PagerGetJournalMode(sqlite3BtreePager(p->pDest));
51487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SQLITE_OK==rc && destMode==PAGER_JOURNALMODE_WAL && pgszSrc!=pgszDest ){
51488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_READONLY;
51489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
47142 51490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
47143 51491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Now that there is a read-lock on the source database, query the
47144 51492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** source pager for the number of pages in the database.
47145 51493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
47146 51494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nSrcPage = (int)sqlite3BtreeLastPage(p->pSrc);
@@ -47173,12 +51521,10 @@
47173 51521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** same schema version.
47174 51522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
47175 51523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_DONE
47176 51524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& (rc = sqlite3BtreeUpdateMeta(p->pDest,1,p->iDestSchema+1))==SQLITE_OK
47177 51525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
47178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const int nSrcPagesize = sqlite3BtreeGetPageSize(p->pSrc);
47179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const int nDestPagesize = sqlite3BtreeGetPageSize(p->pDest);
47180 51526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nDestTruncate;
47181 51527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
47182 51528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->pDestDb ){
47183 51529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ResetInternalSchema(p->pDestDb, 0);
47184 51530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -47193,56 +51539,58 @@
47193 51539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3PagerTruncateImage() here so that any pages in the
47194 51540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** destination file that lie beyond the nDestTruncate page mark are
47195 51541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** journalled by PagerCommitPhaseOne() before they are destroyed
47196 51542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by the file truncation.
47197 51543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
47198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nSrcPagesize<nDestPagesize ){
47199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ratio = nDestPagesize/nSrcPagesize;
51544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pgszSrc==sqlite3BtreeGetPageSize(p->pSrc) );
51545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pgszDest==sqlite3BtreeGetPageSize(p->pDest) );
51546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pgszSrc<pgszDest ){
51547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ratio = pgszDest/pgszSrc;
47200 51548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nDestTruncate = (nSrcPage+ratio-1)/ratio;
47201 51549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nDestTruncate==(int)PENDING_BYTE_PAGE(p->pDest->pBt) ){
47202 51550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nDestTruncate--;
47203 51551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
47204 51552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
47205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nDestTruncate = nSrcPage * (nSrcPagesize/nDestPagesize);
51553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDestTruncate = nSrcPage * (pgszSrc/pgszDest);
47206 51554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
47207 51555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3PagerTruncateImage(pDestPager, nDestTruncate);
47208 51556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
47209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nSrcPagesize<nDestPagesize ){
51557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pgszSrc<pgszDest ){
47210 51558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the source page-size is smaller than the destination page-size,
47211 51559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** two extra things may need to happen:
47212 51560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
47213 51561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** * The destination may need to be truncated, and
47214 51562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
47215 51563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** * Data stored on the pages immediately following the
47216 51564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pending-byte page in the source database may need to be
47217 51565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** copied into the destination database.
47218 51566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
47219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const i64 iSize = (i64)nSrcPagesize * (i64)nSrcPage;
51567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const i64 iSize = (i64)pgszSrc * (i64)nSrcPage;
47220 51568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_file * const pFile = sqlite3PagerFile(pDestPager);
47221 51569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
47222 51570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
47223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( (i64)nDestTruncate*(i64)nDestPagesize >= iSize || (
51571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (i64)nDestTruncate*(i64)pgszDest >= iSize || (
47224 51572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1)
47225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+nDestPagesize
51573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+pgszDest
47226 51574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
));
47227 51575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( SQLITE_OK==(rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1))
47228 51576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& SQLITE_OK==(rc = backupTruncateFile(pFile, iSize))
47229 51577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& SQLITE_OK==(rc = sqlite3PagerSync(pDestPager))
47230 51578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
47231 51579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i64 iOff;
47232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i64 iEnd = MIN(PENDING_BYTE + nDestPagesize, iSize);
51580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 iEnd = MIN(PENDING_BYTE + pgszDest, iSize);
47233 51581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(
47234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iOff=PENDING_BYTE+nSrcPagesize;
51582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iOff=PENDING_BYTE+pgszSrc;
47235 51583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc==SQLITE_OK && iOff<iEnd;
47236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iOff+=nSrcPagesize
51584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iOff+=pgszSrc
47237 51585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
47238 51586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PgHdr *pSrcPg = 0;
47239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const Pgno iSrcPg = (Pgno)((iOff/nSrcPagesize)+1);
51587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const Pgno iSrcPg = (Pgno)((iOff/pgszSrc)+1);
47240 51588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg);
47241 51589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
47242 51590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 *zData = sqlite3PagerGetData(pSrcPg);
47243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3OsWrite(pFile, zData, nSrcPagesize, iOff);
51591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3OsWrite(pFile, zData, pgszSrc, iOff);
47244 51592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
47245 51593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3PagerUnref(pSrcPg);
47246 51594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
47247 51595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
47248 51596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
@@ -49366,13 +53714,16 @@
49366 53714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the opcode for a given address. If the address is -1, then
49367 53715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** return the most recently inserted opcode.
49368 53716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
49369 53717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If a memory allocation error has occurred prior to the calling of this
49370 53718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** routine, then a pointer to a dummy VdbeOp will be returned. That opcode
49371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is readable and writable, but it has no effect. The return of a dummy
49372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** opcode allows the call to continue functioning after a OOM fault without
49373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** having to check to see if the return from this routine is a valid pointer.
53719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is readable but not writable, though it is cast to a writable value.
53720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The return of a dummy opcode allows the call to continue functioning
53721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** after a OOM fault without having to check to see if the return from
53722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this routine is a valid pointer. But because the dummy.opcode is 0,
53723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** dummy will never be written to. This is verified by code inspection and
53724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by running with Valgrind.
49374 53725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
49375 53726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** About the #ifdef SQLITE_OMIT_TRACE: Normally, this routine is never called
49376 53727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** unless p->nOp>0. This is because in the absense of SQLITE_OMIT_TRACE,
49377 53728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an OP_Trace instruction is always inserted by sqlite3VdbeGet() as soon as
49378 53729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a new VDBE is created. So we are free to set addr to p->nOp-1 without
@@ -49379,21 +53730,21 @@
49379 53730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** having to double-check to make sure that the result is non-negative. But
49380 53731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** if SQLITE_OMIT_TRACE is defined, the OP_Trace is omitted and we do need to
49381 53732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** check the value of p->nOp-1 before continuing.
49382 53733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
49383 53734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){
49384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static VdbeOp dummy;
53735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const VdbeOp dummy;
49385 53736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->magic==VDBE_MAGIC_INIT );
49386 53737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( addr<0 ){
49387 53738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_OMIT_TRACE
49388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->nOp==0 ) return &dummy;
53739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->nOp==0 ) return (VdbeOp*)&dummy;
49389 53740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
49390 53741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
addr = p->nOp - 1;
49391 53742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
49392 53743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( (addr>=0 && addr<p->nOp) || p->db->mallocFailed );
49393 53744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->db->mallocFailed ){
49394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return &dummy;
53745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (VdbeOp*)&dummy;
49395 53746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
49396 53747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return &p->aOp[addr];
49397 53748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
49398 53749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
49399 53750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -49502,10 +53853,15 @@
49502 53853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
49503 53854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
49504 53855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
49505 53856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
49506 53857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Declare to the Vdbe that the BTree object at db->aDb[i] is used.
53858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
53859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The prepared statement has to know in advance which Btree objects
53860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** will be used so that it can acquire mutexes on them all in sorted
53861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** order (via sqlite3VdbeMutexArrayEnter(). Mutexes are acquired
53862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in order (and released in reverse order) to avoid deadlocks.
49507 53863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
49508 53864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe *p, int i){
49509 53865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int mask;
49510 53866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( i>=0 && i<p->db->nDb && i<sizeof(u32)*8 );
49511 53867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( i<(int)sizeof(p->btreeMask)*8 );
@@ -50001,10 +54357,11 @@
50001 54357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->magic = VDBE_MAGIC_RUN;
50002 54358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nChange = 0;
50003 54359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->cacheCtr = 1;
50004 54360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->minWriteFileFormat = 255;
50005 54361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->iStatement = 0;
54362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nFkConstraint = 0;
50006 54363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef VDBE_PROFILE
50007 54364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{
50008 54365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
50009 54366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<p->nOp; i++){
50010 54367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->aOp[i].cnt = 0;
@@ -50689,14 +55046,21 @@
50689 55046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** must be SAVEPOINT_RELEASE. Hence the NEVER(p->rc==SQLITE_OK) in
50690 55047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the following code.
50691 55048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
50692 55049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( eStatementOp ){
50693 55050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3VdbeCloseStatement(p, eStatementOp);
50694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc && (NEVER(p->rc==SQLITE_OK) || p->rc==SQLITE_CONSTRAINT) ){
50695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->rc = rc;
50696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3DbFree(db, p->zErrMsg);
50697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zErrMsg = 0;
55051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ){
55052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eStatementOp==SAVEPOINT_ROLLBACK );
55053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( NEVER(p->rc==SQLITE_OK) || p->rc==SQLITE_CONSTRAINT ){
55054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->rc = rc;
55055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DbFree(db, p->zErrMsg);
55056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->zErrMsg = 0;
55057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
55058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ invalidateCursorsOnModifiedBtrees(db);
55059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3RollbackAll(db);
55060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3CloseSavepoints(db);
55061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->autoCommit = 1;
50698 55062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
50699 55063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
50700 55064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
50701 55065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If this was an INSERT, UPDATE or DELETE and no statement transaction
50702 55066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** has been rolled back, update the database connection change-counter.
@@ -51976,10 +56340,31 @@
51976 56340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
51977 56341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeMemSetNull(&pCtx->s);
51978 56342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCtx->isError = SQLITE_NOMEM;
51979 56343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCtx->s.db->mallocFailed = 1;
51980 56344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
56345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
56346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
56347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called after a transaction has been committed. It
56348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** invokes callbacks registered with sqlite3_wal_hook() as required.
56349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
56350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int doWalCallbacks(sqlite3 *db){
56351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
56352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
56353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
56354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<db->nDb; i++){
56355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Btree *pBt = db->aDb[i].pBt;
56356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pBt ){
56357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nEntry = sqlite3PagerWalCallback(sqlite3BtreePager(pBt));
56358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db->xWalCallback && nEntry>0 && rc==SQLITE_OK ){
56359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zName, nEntry);
56360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
56361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
56362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
56363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
56364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
56365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
51981 56366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
51982 56367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
51983 56368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Execute the statement pStmt, either until a row of data is ready, the
51984 56369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** statement is completely executed or an error occurs.
51985 56370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -51992,13 +56377,16 @@
51992 56377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3 *db;
51993 56378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
51994 56379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
51995 56380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert(p);
51996 56381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->magic!=VDBE_MAGIC_RUN ){
51997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_log(SQLITE_MISUSE,
51998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "attempt to step a halted statement: [%s]", p->zSql);
51999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_MISUSE_BKPT;
56382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* We used to require that sqlite3_reset() be called before retrying
56383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3_step() after any error. But after 3.6.23, we changed this
56384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** so that sqlite3_reset() would be called automatically instead of
56385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** throwing the error.
56386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
56387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_reset((sqlite3_stmt*)p);
52000 56388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52001 56389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52002 56390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check that malloc() has not failed. If it has, return early. */
52003 56391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db = p->db;
52004 56392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->mallocFailed ){
@@ -52022,13 +56410,11 @@
52022 56410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52023 56411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( db->writeVdbeCnt>0 || db->autoCommit==0 || db->nDeferredCons==0 );
52024 56412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52025 56413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_TRACE
52026 56414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->xProfile && !db->init.busy ){
52027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- double rNow;
52028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3OsCurrentTime(db->pVfs, &rNow);
52029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->startTime = (u64)((rNow - (int)rNow)*3600.0*24.0*1000000000.0);
56415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime);
52030 56416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52031 56417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
52032 56418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52033 56419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->activeVdbeCnt++;
52034 56420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->readOnly==0 ) db->writeVdbeCnt++;
@@ -52045,19 +56431,23 @@
52045 56431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52046 56432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_TRACE
52047 56433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Invoke the profile callback if there is one
52048 56434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
52049 56435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy && p->zSql ){
52050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- double rNow;
52051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u64 elapseTime;
52052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
52053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3OsCurrentTime(db->pVfs, &rNow);
52054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- elapseTime = (u64)((rNow - (int)rNow)*3600.0*24.0*1000000000.0);
52055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- elapseTime -= p->startTime;
52056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db->xProfile(db->pProfileArg, p->zSql, elapseTime);
56436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iNow;
56437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsCurrentTimeInt64(db->pVfs, &iNow);
56438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->xProfile(db->pProfileArg, p->zSql, iNow - p->startTime);
52057 56439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52058 56440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
56441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
56442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_DONE ){
56443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->rc==SQLITE_OK );
56444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->rc = doWalCallbacks(db);
56445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->rc!=SQLITE_OK ){
56446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_ERROR;
56447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
56448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
52059 56449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52060 56450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->errCode = rc;
52061 56451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( SQLITE_NOMEM==sqlite3ApiExit(p->db, p->rc) ){
52062 56452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->rc = SQLITE_NOMEM;
52063 56453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -53638,26 +58028,10 @@
53638 58028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** flag on jump instructions, we get a (small) speed improvement.
53639 58029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
53640 58030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define CHECK_FOR_INTERRUPT \
53641 58031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->u1.isInterrupted ) goto abort_due_to_interrupt;
53642 58032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
53643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_DEBUG
53644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fileExists(sqlite3 *db, const char *zFile){
53645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int res = 0;
53646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK;
53647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_TEST
53648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If we are currently testing IO errors, then do not call OsAccess() to
53649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** test for the presence of zFile. This is because any IO error that
53650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** occurs here will not be reported, causing the test to fail.
53651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
53652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- extern int sqlite3_io_error_pending;
53653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3_io_error_pending<=0 )
53654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
53655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3OsAccess(db->pVfs, zFile, SQLITE_ACCESS_EXISTS, &res);
53656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return (res && rc==SQLITE_OK);
53657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
53658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
53659 58033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
53660 58034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef NDEBUG
53661 58035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
53662 58036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is only called from within an assert() expression. It
53663 58037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** checks that the sqlite3.nTransaction variable is correctly set to
@@ -53744,13 +58118,10 @@
53744 58118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
union vdbeExecUnion {
53745 58119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_Yield_stack_vars {
53746 58120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int pcDest;
53747 58121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} aa;
53748 58122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_Variable_stack_vars {
53749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int p1; /* Variable to copy from */
53750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int p2; /* Register to copy to */
53751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n; /* Number of values left to copy */
53752 58123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pVar; /* Value being transferred */
53753 58124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} ab;
53754 58125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_Move_stack_vars {
53755 58126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zMalloc; /* Holding variable for allocated memory */
53756 58127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n; /* Number of registers left to copy */
@@ -54071,22 +58442,29 @@
54071 58442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value **apVal;
54072 58443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} cb;
54073 58444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_AggFinal_stack_vars {
54074 58445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pMem;
54075 58446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} cc;
58447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct OP_JournalMode_stack_vars {
58448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Btree *pBt; /* Btree to change journal mode of */
58449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pager *pPager; /* Pager associated with pBt */
58450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int eNew; /* New journal mode */
58451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int eOld; /* The old journal mode */
58452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zFilename; /* Name of database file for pPager */
58453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } cd;
54076 58454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_IncrVacuum_stack_vars {
54077 58455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Btree *pBt;
54078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } cd;
58456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } ce;
54079 58457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_VBegin_stack_vars {
54080 58458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VTable *pVTab;
54081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } ce;
58459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } cf;
54082 58460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_VOpen_stack_vars {
54083 58461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeCursor *pCur;
54084 58462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab_cursor *pVtabCursor;
54085 58463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
54086 58464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_module *pModule;
54087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } cf;
58465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } cg;
54088 58466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_VFilter_stack_vars {
54089 58467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nArg;
54090 58468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iQuery;
54091 58469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const sqlite3_module *pModule;
54092 58470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pQuery;
@@ -54095,39 +58473,39 @@
54095 58473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
54096 58474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeCursor *pCur;
54097 58475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int res;
54098 58476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
54099 58477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem **apArg;
54100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } cg;
58478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } ch;
54101 58479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_VColumn_stack_vars {
54102 58480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
54103 58481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const sqlite3_module *pModule;
54104 58482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pDest;
54105 58483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_context sContext;
54106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } ch;
58484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } ci;
54107 58485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_VNext_stack_vars {
54108 58486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
54109 58487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const sqlite3_module *pModule;
54110 58488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int res;
54111 58489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeCursor *pCur;
54112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } ci;
58490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } cj;
54113 58491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_VRename_stack_vars {
54114 58492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
54115 58493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pName;
54116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } cj;
58494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } ck;
54117 58495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_VUpdate_stack_vars {
54118 58496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
54119 58497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_module *pModule;
54120 58498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nArg;
54121 58499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
54122 58500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite_int64 rowid;
54123 58501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem **apArg;
54124 58502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pX;
54125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } ck;
58503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } cl;
54126 58504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct OP_Trace_stack_vars {
54127 58505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zTrace;
54128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } cl;
58506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } cm;
54129 58507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} u;
54130 58508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* End automatically generated code
54131 58509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
********************************************************************/
54132 58510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
54133 58511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */
@@ -54147,23 +58525,18 @@
54147 58525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
54148 58526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
checkProgress = db->xProgress!=0;
54149 58527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
54150 58528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
54151 58529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BeginBenignMalloc();
54152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->pc==0
54153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && ((p->db->flags & SQLITE_VdbeListing) || fileExists(db, "vdbe_explain"))
54154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
58530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->pc==0 && (p->db->flags & SQLITE_VdbeListing)!=0 ){
54155 58531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
54156 58532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
printf("VDBE Program Listing:\n");
54157 58533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbePrintSql(p);
54158 58534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<p->nOp; i++){
54159 58535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbePrintOp(stdout, i, &aOp[i]);
54160 58536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
54161 58537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
54162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fileExists(db, "vdbe_trace") ){
54163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->trace = stdout;
54164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
54165 58538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3EndBenignMalloc();
54166 58539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
54167 58540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(pc=p->pc; rc==SQLITE_OK; pc++){
54168 58541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pc>=0 && pc<p->nOp );
54169 58542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->mallocFailed ) goto no_mem;
@@ -54181,17 +58554,10 @@
54181 58554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
printf("VDBE Execution Trace:\n");
54182 58555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbePrintSql(p);
54183 58556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
54184 58557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbePrintOp(p->trace, pc, pOp);
54185 58558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
54186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->trace==0 && pc==0 ){
54187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3BeginBenignMalloc();
54188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fileExists(db, "vdbe_sqltrace") ){
54189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbePrintSql(p);
54190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
54191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3EndBenignMalloc();
54192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
54193 58559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
54194 58560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
54195 58561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
54196 58562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check to see if we need to simulate an interrupt. This only happens
54197 58563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** if we have a special test build.
@@ -54544,44 +58910,29 @@
54544 58910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOut->enc = encoding;
54545 58911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UPDATE_MAX_BLOBSIZE(pOut);
54546 58912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
54547 58913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
54548 58914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
54549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Opcode: Variable P1 P2 P3 P4 *
58915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Opcode: Variable P1 P2 * P4 *
54550 58916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
54551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Transfer the values of bound parameters P1..P1+P3-1 into registers
54552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** P2..P2+P3-1.
58917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Transfer the values of bound parameter P1 into register P2
54553 58918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
54554 58919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the parameter is named, then its name appears in P4 and P3==1.
54555 58920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The P4 value is used by sqlite3_bind_parameter_name().
54556 58921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
54557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case OP_Variable: {
58922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case OP_Variable: { /* out2-prerelease */
54558 58923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if 0 /* local variables moved into u.ab */
54559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int p1; /* Variable to copy from */
54560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int p2; /* Register to copy to */
54561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n; /* Number of values left to copy */
54562 58924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pVar; /* Value being transferred */
54563 58925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* local variables moved into u.ab */
54564 58926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
54565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ab.p1 = pOp->p1 - 1;
54566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ab.p2 = pOp->p2;
54567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ab.n = pOp->p3;
54568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( u.ab.p1>=0 && u.ab.p1+u.ab.n<=p->nVar );
54569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( u.ab.p2>=1 && u.ab.p2+u.ab.n-1<=p->nMem );
54570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pOp->p4.z==0 || pOp->p3==1 || pOp->p3==0 );
54571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
54572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( u.ab.n-- > 0 ){
54573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ab.pVar = &p->aVar[u.ab.p1++];
54574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3VdbeMemTooBig(u.ab.pVar) ){
54575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto too_big;
54576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
54577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOut = &aMem[u.ab.p2++];
54578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeMemReleaseExternal(pOut);
54579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOut->flags = MEM_Null;
54580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeMemShallowCopy(pOut, u.ab.pVar, MEM_Static);
54581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UPDATE_MAX_BLOBSIZE(pOut);
54582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
58927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pOp->p1>0 && pOp->p1<=p->nVar );
58928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ab.pVar = &p->aVar[pOp->p1 - 1];
58929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3VdbeMemTooBig(u.ab.pVar) ){
58930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto too_big;
58931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
58932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeMemShallowCopy(pOut, u.ab.pVar, MEM_Static);
58933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UPDATE_MAX_BLOBSIZE(pOut);
54583 58934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
54584 58935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
54585 58936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
54586 58937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Opcode: Move P1 P2 P3 * *
54587 58938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -58849,10 +63200,151 @@
58849 63200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto too_big;
58850 63201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
58851 63202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
58852 63203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
58853 63204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
63205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
63206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Opcode: Checkpoint P1 * * * *
63207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
63208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Checkpoint database P1. This is a no-op if P1 is not currently in
63209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL mode.
63210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
63211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case OP_Checkpoint: {
63212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Checkpoint(db, pOp->p1);
63213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
63214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
63215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
63216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Opcode: JournalMode P1 P2 P3 * P5
63218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
63219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Change the journal mode of database P1 to P3. P3 must be one of the
63220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** PAGER_JOURNALMODE_XXX values. If changing between the various rollback
63221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** modes (delete, truncate, persist, off and memory), this is a simple
63222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** operation. No IO is required.
63223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
63224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If changing into or out of WAL mode the procedure is more complicated.
63225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
63226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Write a string containing the final journal-mode to register P2.
63227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
63228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an attempt to change in to or out of WAL mode fails because another
63229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** connection also has the same database open, then an SQLITE_BUSY error
63230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is raised if P5==0, or of P5!=0 the journal mode changed is skipped
63231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** without signaling the error.
63232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
63233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case OP_JournalMode: { /* out2-prerelease */
63234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* local variables moved into u.cd */
63235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Btree *pBt; /* Btree to change journal mode of */
63236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pager *pPager; /* Pager associated with pBt */
63237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int eNew; /* New journal mode */
63238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int eOld; /* The old journal mode */
63239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zFilename; /* Name of database file for pPager */
63240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* local variables moved into u.cd */
63241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cd.eNew = pOp->p3;
63243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( u.cd.eNew==PAGER_JOURNALMODE_DELETE
63244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || u.cd.eNew==PAGER_JOURNALMODE_TRUNCATE
63245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || u.cd.eNew==PAGER_JOURNALMODE_PERSIST
63246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || u.cd.eNew==PAGER_JOURNALMODE_OFF
63247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || u.cd.eNew==PAGER_JOURNALMODE_MEMORY
63248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || u.cd.eNew==PAGER_JOURNALMODE_WAL
63249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || u.cd.eNew==PAGER_JOURNALMODE_QUERY
63250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
63251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pOp->p1>=0 && pOp->p1<db->nDb );
63252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This opcode is used in two places: PRAGMA journal_mode and ATTACH.
63254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** In PRAGMA journal_mode, the sqlite3VdbeUsesBtree() routine is called
63255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** when the statment is prepared and so p->aMutex.nMutex>0. All mutexes
63256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are already acquired. But when used in ATTACH, sqlite3VdbeUsesBtree()
63257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is not called when the statement is prepared because it requires the
63258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** iDb index of the database as a parameter, and the database has not
63259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** yet been attached so that index is unavailable. We have to wait
63260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** until runtime (now) to get the mutex on the newly attached database.
63261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** No other mutexes are required by the ATTACH command so this is safe
63262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to do.
63263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
63264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (p->btreeMask & (1<<pOp->p1))!=0 || p->aMutex.nMutex==0 );
63265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->aMutex.nMutex==0 ){
63266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This occurs right after ATTACH. Get a mutex on the newly ATTACHed
63267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** database. */
63268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeUsesBtree(p, pOp->p1);
63269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeMutexArrayEnter(p);
63270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cd.pBt = db->aDb[pOp->p1].pBt;
63273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cd.pPager = sqlite3BtreePager(u.cd.pBt);
63274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cd.eOld = sqlite3PagerGetJournalMode(u.cd.pPager);
63275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( u.cd.eNew==PAGER_JOURNALMODE_QUERY ) u.cd.eNew = u.cd.eOld;
63276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !sqlite3PagerOkToChangeJournalMode(u.cd.pPager) ) u.cd.eNew = u.cd.eOld;
63277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
63279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cd.zFilename = sqlite3PagerFilename(u.cd.pPager);
63280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Do not allow a transition to journal_mode=WAL for a database
63282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in temporary storage or if the VFS does not support xShmOpen.
63283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
63284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( u.cd.eNew==PAGER_JOURNALMODE_WAL
63285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (u.cd.zFilename[0]==0 /* Temp file */
63286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || !sqlite3PagerWalSupported(u.cd.pPager)) /* No xShmOpen support */
63287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
63288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cd.eNew = u.cd.eOld;
63289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (u.cd.eNew!=u.cd.eOld)
63292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (u.cd.eOld==PAGER_JOURNALMODE_WAL || u.cd.eNew==PAGER_JOURNALMODE_WAL)
63293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
63294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !db->autoCommit || db->activeVdbeCnt>1 ){
63295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_ERROR;
63296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3SetString(&p->zErrMsg, db,
63297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "cannot change %s wal mode from within a transaction",
63298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (u.cd.eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of")
63299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
63300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
63301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
63302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( u.cd.eOld==PAGER_JOURNALMODE_WAL ){
63304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If leaving WAL mode, close the log file. If successful, the call
63305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to PagerCloseWal() checkpoints and deletes the write-ahead-log
63306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file. An EXCLUSIVE lock may still be held on the database file
63307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** after a successful return.
63308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
63309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3PagerCloseWal(u.cd.pPager);
63310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
63311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3PagerSetJournalMode(u.cd.pPager, u.cd.eNew);
63312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( rc==SQLITE_BUSY && pOp->p5==0 ){
63313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto abort_due_to_error;
63314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
63316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3PagerSetJournalMode(u.cd.pPager, PAGER_JOURNALMODE_DELETE);
63317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
63318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Open a transaction on the database file. Regardless of the journal
63321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** mode, this transaction always uses a rollback journal.
63322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
63323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( sqlite3BtreeIsInTrans(u.cd.pBt)==0 );
63324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
63325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3BtreeSetVersion(u.cd.pBt,
63326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (u.cd.eNew==PAGER_JOURNALMODE_WAL ? 2 : 1));
63327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_BUSY && pOp->p5==0 ) goto abort_due_to_error;
63328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_BUSY ){
63330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cd.eNew = u.cd.eOld;
63331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
63332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* ifndef SQLITE_OMIT_WAL */
63336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cd.eNew = sqlite3PagerSetJournalMode(u.cd.pPager, u.cd.eNew);
63338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOut = &aMem[pOp->p2];
63339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOut->flags = MEM_Str|MEM_Static|MEM_Term;
63340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOut->z = (char *)sqlite3JournalModename(u.cd.eNew);
63341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOut->n = sqlite3Strlen30(pOut->z);
63342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOut->enc = SQLITE_UTF8;
63343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeEncoding(pOut, encoding);
63344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
63345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
58854 63346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
58855 63347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH)
58856 63348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Opcode: Vacuum * * * * *
58857 63349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
58858 63350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Vacuum the entire database. This opcode will cause other virtual
@@ -58871,18 +63363,18 @@
58871 63363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Perform a single step of the incremental vacuum procedure on
58872 63364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the P1 database. If the vacuum has finished, jump to instruction
58873 63365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** P2. Otherwise, fall through to the next instruction.
58874 63366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
58875 63367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_IncrVacuum: { /* jump */
58876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0 /* local variables moved into u.cd */
63368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* local variables moved into u.ce */
58877 63369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Btree *pBt;
58878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* local variables moved into u.cd */
63370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* local variables moved into u.ce */
58879 63371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
58880 63372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pOp->p1>=0 && pOp->p1<db->nDb );
58881 63373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( (p->btreeMask & (1<<pOp->p1))!=0 );
58882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cd.pBt = db->aDb[pOp->p1].pBt;
58883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3BtreeIncrVacuum(u.cd.pBt);
63374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ce.pBt = db->aDb[pOp->p1].pBt;
63375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3BtreeIncrVacuum(u.ce.pBt);
58884 63376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_DONE ){
58885 63377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pc = pOp->p2 - 1;
58886 63378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_OK;
58887 63379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
58888 63380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
@@ -58948,19 +63440,19 @@
58948 63440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Also, whether or not P4 is set, check that this is not being called from
58949 63441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** within a callback to a virtual table xSync() method. If it is, the error
58950 63442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** code will be set to SQLITE_LOCKED.
58951 63443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
58952 63444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_VBegin: {
58953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0 /* local variables moved into u.ce */
63445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* local variables moved into u.cf */
58954 63446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VTable *pVTab;
58955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* local variables moved into u.ce */
58956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ce.pVTab = pOp->p4.pVtab;
58957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3VtabBegin(db, u.ce.pVTab);
58958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( u.ce.pVTab ){
63447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* local variables moved into u.cf */
63448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cf.pVTab = pOp->p4.pVtab;
63449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3VtabBegin(db, u.cf.pVTab);
63450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( u.cf.pVTab ){
58959 63451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, p->zErrMsg);
58960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zErrMsg = u.ce.pVTab->pVtab->zErrMsg;
58961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ce.pVTab->pVtab->zErrMsg = 0;
63452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->zErrMsg = u.cf.pVTab->pVtab->zErrMsg;
63453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cf.pVTab->pVtab->zErrMsg = 0;
58962 63454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
58963 63455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
58964 63456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
58965 63457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_VIRTUALTABLE */
58966 63458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -58996,38 +63488,38 @@
58996 63488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
58997 63489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** P1 is a cursor number. This opcode opens a cursor to the virtual
58998 63490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** table and stores that cursor in P1.
58999 63491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
59000 63492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_VOpen: {
59001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0 /* local variables moved into u.cf */
63493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* local variables moved into u.cg */
59002 63494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeCursor *pCur;
59003 63495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab_cursor *pVtabCursor;
59004 63496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
59005 63497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_module *pModule;
59006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* local variables moved into u.cf */
59007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
59008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cf.pCur = 0;
59009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cf.pVtabCursor = 0;
59010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cf.pVtab = pOp->p4.pVtab->pVtab;
59011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cf.pModule = (sqlite3_module *)u.cf.pVtab->pModule;
59012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert(u.cf.pVtab && u.cf.pModule);
59013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = u.cf.pModule->xOpen(u.cf.pVtab, &u.cf.pVtabCursor);
63498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* local variables moved into u.cg */
63499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cg.pCur = 0;
63501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cg.pVtabCursor = 0;
63502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cg.pVtab = pOp->p4.pVtab->pVtab;
63503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cg.pModule = (sqlite3_module *)u.cg.pVtab->pModule;
63504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert(u.cg.pVtab && u.cg.pModule);
63505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = u.cg.pModule->xOpen(u.cg.pVtab, &u.cg.pVtabCursor);
59014 63506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, p->zErrMsg);
59015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zErrMsg = u.cf.pVtab->zErrMsg;
59016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cf.pVtab->zErrMsg = 0;
63507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->zErrMsg = u.cg.pVtab->zErrMsg;
63508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cg.pVtab->zErrMsg = 0;
59017 63509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( SQLITE_OK==rc ){
59018 63510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Initialize sqlite3_vtab_cursor base class */
59019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cf.pVtabCursor->pVtab = u.cf.pVtab;
63511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cg.pVtabCursor->pVtab = u.cg.pVtab;
59020 63512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59021 63513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Initialise vdbe cursor object */
59022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cf.pCur = allocateCursor(p, pOp->p1, 0, -1, 0);
59023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( u.cf.pCur ){
59024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cf.pCur->pVtabCursor = u.cf.pVtabCursor;
59025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cf.pCur->pModule = u.cf.pVtabCursor->pVtab->pModule;
63514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cg.pCur = allocateCursor(p, pOp->p1, 0, -1, 0);
63515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( u.cg.pCur ){
63516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cg.pCur->pVtabCursor = u.cg.pVtabCursor;
63517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cg.pCur->pModule = u.cg.pVtabCursor->pVtab->pModule;
59026 63518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
59027 63519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->mallocFailed = 1;
59028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cf.pModule->xClose(u.cf.pVtabCursor);
63520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cg.pModule->xClose(u.cg.pVtabCursor);
59029 63521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59030 63522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59031 63523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
59032 63524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59033 63525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_VIRTUALTABLE */
@@ -59050,11 +63542,11 @@
59050 63542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** xFilter as argv. Register P3+2 becomes argv[0] when passed to xFilter.
59051 63543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
59052 63544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A jump is made to P2 if the result set after filtering would be empty.
59053 63545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
59054 63546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_VFilter: { /* jump */
59055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0 /* local variables moved into u.cg */
63547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* local variables moved into u.ch */
59056 63548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nArg;
59057 63549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iQuery;
59058 63550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const sqlite3_module *pModule;
59059 63551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pQuery;
59060 63552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pArgc;
@@ -59062,50 +63554,50 @@
59062 63554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
59063 63555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeCursor *pCur;
59064 63556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int res;
59065 63557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
59066 63558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem **apArg;
59067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* local variables moved into u.cg */
59068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
59069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.pQuery = &aMem[pOp->p3];
59070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.pArgc = &u.cg.pQuery[1];
59071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.pCur = p->apCsr[pOp->p1];
59072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- REGISTER_TRACE(pOp->p3, u.cg.pQuery);
59073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( u.cg.pCur->pVtabCursor );
59074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.pVtabCursor = u.cg.pCur->pVtabCursor;
59075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.pVtab = u.cg.pVtabCursor->pVtab;
59076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.pModule = u.cg.pVtab->pModule;
63559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* local variables moved into u.ch */
63560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.pQuery = &aMem[pOp->p3];
63562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.pArgc = &u.ch.pQuery[1];
63563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.pCur = p->apCsr[pOp->p1];
63564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ REGISTER_TRACE(pOp->p3, u.ch.pQuery);
63565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( u.ch.pCur->pVtabCursor );
63566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.pVtabCursor = u.ch.pCur->pVtabCursor;
63567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.pVtab = u.ch.pVtabCursor->pVtab;
63568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.pModule = u.ch.pVtab->pModule;
59077 63569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59078 63570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Grab the index number and argc parameters */
59079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( (u.cg.pQuery->flags&MEM_Int)!=0 && u.cg.pArgc->flags==MEM_Int );
59080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.nArg = (int)u.cg.pArgc->u.i;
59081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.iQuery = (int)u.cg.pQuery->u.i;
63571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (u.ch.pQuery->flags&MEM_Int)!=0 && u.ch.pArgc->flags==MEM_Int );
63572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.nArg = (int)u.ch.pArgc->u.i;
63573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.iQuery = (int)u.ch.pQuery->u.i;
59082 63574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59083 63575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Invoke the xFilter method */
59084 63576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{
59085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.res = 0;
59086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.apArg = p->apArg;
59087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(u.cg.i = 0; u.cg.i<u.cg.nArg; u.cg.i++){
59088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.apArg[u.cg.i] = &u.cg.pArgc[u.cg.i+1];
59089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeMemStoreType(u.cg.apArg[u.cg.i]);
63577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.res = 0;
63578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.apArg = p->apArg;
63579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(u.ch.i = 0; u.ch.i<u.ch.nArg; u.ch.i++){
63580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.apArg[u.ch.i] = &u.ch.pArgc[u.ch.i+1];
63581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeMemStoreType(u.ch.apArg[u.ch.i]);
59090 63582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59091 63583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59092 63584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->inVtabMethod = 1;
59093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = u.cg.pModule->xFilter(u.cg.pVtabCursor, u.cg.iQuery, pOp->p4.z, u.cg.nArg, u.cg.apArg);
63585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = u.ch.pModule->xFilter(u.ch.pVtabCursor, u.ch.iQuery, pOp->p4.z, u.ch.nArg, u.ch.apArg);
59094 63586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->inVtabMethod = 0;
59095 63587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, p->zErrMsg);
59096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zErrMsg = u.cg.pVtab->zErrMsg;
59097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.pVtab->zErrMsg = 0;
63588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->zErrMsg = u.ch.pVtab->zErrMsg;
63589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.pVtab->zErrMsg = 0;
59098 63590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
59099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.res = u.cg.pModule->xEof(u.cg.pVtabCursor);
63591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.res = u.ch.pModule->xEof(u.ch.pVtabCursor);
59100 63592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59101 63593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( u.cg.res ){
63594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( u.ch.res ){
59103 63595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pc = pOp->p2 - 1;
59104 63596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59105 63597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cg.pCur->nullRow = 0;
63598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ch.pCur->nullRow = 0;
59107 63599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59108 63600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
59109 63601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59110 63602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_VIRTUALTABLE */
59111 63603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -59115,56 +63607,56 @@
59115 63607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Store the value of the P2-th column of
59116 63608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the row of the virtual-table that the
59117 63609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** P1 cursor is pointing to into register P3.
59118 63610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
59119 63611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_VColumn: {
59120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0 /* local variables moved into u.ch */
63612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* local variables moved into u.ci */
59121 63613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
59122 63614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const sqlite3_module *pModule;
59123 63615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pDest;
59124 63616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_context sContext;
59125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* local variables moved into u.ch */
63617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* local variables moved into u.ci */
59126 63618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59127 63619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeCursor *pCur = p->apCsr[pOp->p1];
59128 63620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pCur->pVtabCursor );
59129 63621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pOp->p3>0 && pOp->p3<=p->nMem );
59130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ch.pDest = &aMem[pOp->p3];
63622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ci.pDest = &aMem[pOp->p3];
59131 63623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCur->nullRow ){
59132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeMemSetNull(u.ch.pDest);
63624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeMemSetNull(u.ci.pDest);
59133 63625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
59134 63626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ch.pVtab = pCur->pVtabCursor->pVtab;
59136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ch.pModule = u.ch.pVtab->pModule;
59137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( u.ch.pModule->xColumn );
59138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(&u.ch.sContext, 0, sizeof(u.ch.sContext));
63627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ci.pVtab = pCur->pVtabCursor->pVtab;
63628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ci.pModule = u.ci.pVtab->pModule;
63629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( u.ci.pModule->xColumn );
63630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&u.ci.sContext, 0, sizeof(u.ci.sContext));
59139 63631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59140 63632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The output cell may already have a buffer allocated. Move
59141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the current contents to u.ch.sContext.s so in case the user-function
63633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the current contents to u.ci.sContext.s so in case the user-function
59142 63634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** can use the already allocated buffer instead of allocating a
59143 63635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** new one.
59144 63636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
59145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeMemMove(&u.ch.sContext.s, u.ch.pDest);
59146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- MemSetTypeFlag(&u.ch.sContext.s, MEM_Null);
63637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeMemMove(&u.ci.sContext.s, u.ci.pDest);
63638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MemSetTypeFlag(&u.ci.sContext.s, MEM_Null);
59147 63639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = u.ch.pModule->xColumn(pCur->pVtabCursor, &u.ch.sContext, pOp->p2);
63640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = u.ci.pModule->xColumn(pCur->pVtabCursor, &u.ci.sContext, pOp->p2);
59149 63641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, p->zErrMsg);
59150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zErrMsg = u.ch.pVtab->zErrMsg;
59151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ch.pVtab->zErrMsg = 0;
59152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( u.ch.sContext.isError ){
59153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = u.ch.sContext.isError;
63642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->zErrMsg = u.ci.pVtab->zErrMsg;
63643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ci.pVtab->zErrMsg = 0;
63644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( u.ci.sContext.isError ){
63645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = u.ci.sContext.isError;
59154 63646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59155 63647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59156 63648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Copy the result of the function to the P3 register. We
59157 63649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** do this regardless of whether or not an error occurred to ensure any
59158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** dynamic allocation in u.ch.sContext.s (a Mem struct) is released.
63650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** dynamic allocation in u.ci.sContext.s (a Mem struct) is released.
59159 63651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
59160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeChangeEncoding(&u.ch.sContext.s, encoding);
59161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeMemMove(u.ch.pDest, &u.ch.sContext.s);
59162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- REGISTER_TRACE(pOp->p3, u.ch.pDest);
59163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UPDATE_MAX_BLOBSIZE(u.ch.pDest);
63652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeEncoding(&u.ci.sContext.s, encoding);
63653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeMemMove(u.ci.pDest, &u.ci.sContext.s);
63654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ REGISTER_TRACE(pOp->p3, u.ci.pDest);
63655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UPDATE_MAX_BLOBSIZE(u.ci.pDest);
59164 63656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3VdbeMemTooBig(u.ch.pDest) ){
63657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3VdbeMemTooBig(u.ci.pDest) ){
59166 63658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto too_big;
59167 63659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59168 63660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
59169 63661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59170 63662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_VIRTUALTABLE */
@@ -59175,44 +63667,44 @@
59175 63667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Advance virtual table P1 to the next row in its result set and
59176 63668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** jump to instruction P2. Or, if the virtual table has reached
59177 63669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the end of its result set, then fall through to the next instruction.
59178 63670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
59179 63671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_VNext: { /* jump */
59180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0 /* local variables moved into u.ci */
63672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* local variables moved into u.cj */
59181 63673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
59182 63674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const sqlite3_module *pModule;
59183 63675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int res;
59184 63676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeCursor *pCur;
59185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* local variables moved into u.ci */
63677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* local variables moved into u.cj */
59186 63678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ci.res = 0;
59188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ci.pCur = p->apCsr[pOp->p1];
59189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( u.ci.pCur->pVtabCursor );
59190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( u.ci.pCur->nullRow ){
63679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cj.res = 0;
63680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cj.pCur = p->apCsr[pOp->p1];
63681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( u.cj.pCur->pVtabCursor );
63682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( u.cj.pCur->nullRow ){
59191 63683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
59192 63684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ci.pVtab = u.ci.pCur->pVtabCursor->pVtab;
59194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ci.pModule = u.ci.pVtab->pModule;
59195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( u.ci.pModule->xNext );
63685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cj.pVtab = u.cj.pCur->pVtabCursor->pVtab;
63686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cj.pModule = u.cj.pVtab->pModule;
63687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( u.cj.pModule->xNext );
59196 63688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59197 63689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Invoke the xNext() method of the module. There is no way for the
59198 63690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** underlying implementation to return an error if one occurs during
59199 63691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** xNext(). Instead, if an error occurs, true is returned (indicating that
59200 63692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** data is available) and the error code returned when xColumn or
59201 63693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** some other method is next invoked on the save virtual table cursor.
59202 63694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
59203 63695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->inVtabMethod = 1;
59204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = u.ci.pModule->xNext(u.ci.pCur->pVtabCursor);
63696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = u.cj.pModule->xNext(u.cj.pCur->pVtabCursor);
59205 63697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->inVtabMethod = 0;
59206 63698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, p->zErrMsg);
59207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zErrMsg = u.ci.pVtab->zErrMsg;
59208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ci.pVtab->zErrMsg = 0;
63699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->zErrMsg = u.cj.pVtab->zErrMsg;
63700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cj.pVtab->zErrMsg = 0;
59209 63701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
59210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ci.res = u.ci.pModule->xEof(u.ci.pCur->pVtabCursor);
63702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cj.res = u.cj.pModule->xEof(u.cj.pCur->pVtabCursor);
59211 63703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59212 63704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !u.ci.res ){
63705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !u.cj.res ){
59214 63706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there is data, jump to P2 */
59215 63707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pc = pOp->p2 - 1;
59216 63708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59217 63709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
59218 63710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -59224,24 +63716,24 @@
59224 63716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
59225 63717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This opcode invokes the corresponding xRename method. The value
59226 63718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in register P1 is passed as the zName argument to the xRename method.
59227 63719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
59228 63720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_VRename: {
59229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0 /* local variables moved into u.cj */
63721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* local variables moved into u.ck */
59230 63722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
59231 63723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pName;
59232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* local variables moved into u.cj */
59233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
59234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cj.pVtab = pOp->p4.pVtab->pVtab;
59235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cj.pName = &aMem[pOp->p1];
59236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( u.cj.pVtab->pModule->xRename );
59237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- REGISTER_TRACE(pOp->p1, u.cj.pName);
59238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( u.cj.pName->flags & MEM_Str );
59239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = u.cj.pVtab->pModule->xRename(u.cj.pVtab, u.cj.pName->z);
63724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* local variables moved into u.ck */
63725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ck.pVtab = pOp->p4.pVtab->pVtab;
63727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ck.pName = &aMem[pOp->p1];
63728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( u.ck.pVtab->pModule->xRename );
63729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ REGISTER_TRACE(pOp->p1, u.ck.pName);
63730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( u.ck.pName->flags & MEM_Str );
63731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = u.ck.pVtab->pModule->xRename(u.ck.pVtab, u.ck.pName->z);
59240 63732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, p->zErrMsg);
59241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zErrMsg = u.cj.pVtab->zErrMsg;
59242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cj.pVtab->zErrMsg = 0;
63733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->zErrMsg = u.ck.pVtab->zErrMsg;
63734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.ck.pVtab->zErrMsg = 0;
59243 63735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59244 63736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
59245 63737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59246 63738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
59247 63739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -59268,39 +63760,39 @@
59268 63760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** P1 is a boolean flag. If it is set to true and the xUpdate call
59269 63761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is successful, then the value returned by sqlite3_last_insert_rowid()
59270 63762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is set to the value of the rowid for the row just inserted.
59271 63763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
59272 63764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_VUpdate: {
59273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0 /* local variables moved into u.ck */
63765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* local variables moved into u.cl */
59274 63766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab *pVtab;
59275 63767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_module *pModule;
59276 63768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nArg;
59277 63769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
59278 63770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite_int64 rowid;
59279 63771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem **apArg;
59280 63772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem *pX;
59281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* local variables moved into u.ck */
63773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* local variables moved into u.cl */
59282 63774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ck.pVtab = pOp->p4.pVtab->pVtab;
59284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ck.pModule = (sqlite3_module *)u.ck.pVtab->pModule;
59285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ck.nArg = pOp->p2;
63775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cl.pVtab = pOp->p4.pVtab->pVtab;
63776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cl.pModule = (sqlite3_module *)u.cl.pVtab->pModule;
63777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cl.nArg = pOp->p2;
59286 63778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pOp->p4type==P4_VTAB );
59287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ALWAYS(u.ck.pModule->xUpdate) ){
59288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ck.apArg = p->apArg;
59289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ck.pX = &aMem[pOp->p3];
59290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(u.ck.i=0; u.ck.i<u.ck.nArg; u.ck.i++){
59291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeMemStoreType(u.ck.pX);
59292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ck.apArg[u.ck.i] = u.ck.pX;
59293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ck.pX++;
59294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
59295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = u.ck.pModule->xUpdate(u.ck.pVtab, u.ck.nArg, u.ck.apArg, &u.ck.rowid);
63779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ALWAYS(u.cl.pModule->xUpdate) ){
63780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cl.apArg = p->apArg;
63781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cl.pX = &aMem[pOp->p3];
63782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(u.cl.i=0; u.cl.i<u.cl.nArg; u.cl.i++){
63783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeMemStoreType(u.cl.pX);
63784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cl.apArg[u.cl.i] = u.cl.pX;
63785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cl.pX++;
63786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = u.cl.pModule->xUpdate(u.cl.pVtab, u.cl.nArg, u.cl.apArg, &u.cl.rowid);
59296 63788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, p->zErrMsg);
59297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->zErrMsg = u.ck.pVtab->zErrMsg;
59298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.ck.pVtab->zErrMsg = 0;
63789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->zErrMsg = u.cl.pVtab->zErrMsg;
63790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cl.pVtab->zErrMsg = 0;
59299 63791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK && pOp->p1 ){
59300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( u.ck.nArg>1 && u.ck.apArg[0] && (u.ck.apArg[0]->flags&MEM_Null) );
59301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db->lastRowid = u.ck.rowid;
63792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( u.cl.nArg>1 && u.cl.apArg[0] && (u.cl.apArg[0]->flags&MEM_Null) );
63793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->lastRowid = u.cl.rowid;
59302 63794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59303 63795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nChange++;
59304 63796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59305 63797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
59306 63798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -59322,24 +63814,24 @@
59322 63814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
59323 63815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If tracing is enabled (by the sqlite3_trace()) interface, then
59324 63816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the UTF-8 string contained in P4 is emitted on the trace callback.
59325 63817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
59326 63818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_Trace: {
59327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0 /* local variables moved into u.cl */
63819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0 /* local variables moved into u.cm */
59328 63820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zTrace;
59329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* local variables moved into u.cl */
63821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* local variables moved into u.cm */
59330 63822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u.cl.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql);
59332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( u.cl.zTrace ){
63823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u.cm.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql);
63824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( u.cm.zTrace ){
59333 63825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->xTrace ){
59334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *z = sqlite3VdbeExpandSql(p, u.cl.zTrace);
63826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *z = sqlite3VdbeExpandSql(p, u.cm.zTrace);
59335 63827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->xTrace(db->pTraceArg, z);
59336 63828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, z);
59337 63829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59338 63830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
59339 63831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (db->flags & SQLITE_SqlTrace)!=0 ){
59340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3DebugPrintf("SQL-trace: %s\n", u.cl.zTrace);
63832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DebugPrintf("SQL-trace: %s\n", u.cm.zTrace);
59341 63833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59342 63834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_DEBUG */
59343 63835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59344 63836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
59345 63837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -60295,11 +64787,11 @@
60295 64787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
60296 64788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
60297 64789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
60298 64790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Table of methods for MemJournal sqlite3_file object.
60299 64791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
60300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static struct sqlite3_io_methods MemJournalMethods = {
64792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const struct sqlite3_io_methods MemJournalMethods = {
60301 64793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1, /* iVersion */
60302 64794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memjrnlClose, /* xClose */
60303 64795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memjrnlRead, /* xRead */
60304 64796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memjrnlWrite, /* xWrite */
60305 64797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memjrnlTruncate, /* xTruncate */
@@ -60318,11 +64810,11 @@
60318 64810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
60319 64811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){
60320 64812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
MemJournal *p = (MemJournal *)pJfd;
60321 64813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( EIGHT_BYTE_ALIGNMENT(p) );
60322 64814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(p, 0, sqlite3MemJournalSize());
60323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pMethod = &MemJournalMethods;
64815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pMethod = (sqlite3_io_methods*)&MemJournalMethods;
60324 64816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
60325 64817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
60326 64818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
60327 64819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return true if the file-handle passed as an argument is
60328 64820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an in-memory journal
@@ -63760,10 +68252,31 @@
63760 68252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->iReg==iReg ){
63761 68253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->tempReg = 0;
63762 68254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
63763 68255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
63764 68256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
68257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
68258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
68259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Generate code to extract the value of the iCol-th column of a table.
68260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
68261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(
68262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Vdbe *v, /* The VDBE under construction */
68263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Table *pTab, /* The table containing the value */
68264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iTabCur, /* The cursor for this table */
68265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCol, /* Index of the column to extract */
68266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regOut /* Extract the valud into this register */
68267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
68268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iCol<0 || iCol==pTab->iPKey ){
68269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut);
68270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
68271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int op = IsVirtual(pTab) ? OP_VColumn : OP_Column;
68272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, op, iTabCur, iCol, regOut);
68273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
68274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iCol>=0 ){
68275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ColumnDefault(v, pTab, iCol, regOut);
68276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
68277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63765 68278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
63766 68279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
63767 68280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Generate code that will extract the iColumn-th column from
63768 68281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** table pTab and store the column value in a register. An effort
63769 68282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is made to store the column value in register iReg, but this is
@@ -63789,17 +68302,11 @@
63789 68302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ExprCachePinRegister(pParse, p->iReg);
63790 68303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return p->iReg;
63791 68304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
63792 68305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
63793 68306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( v!=0 );
63794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iColumn<0 ){
63795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Rowid, iTable, iReg);
63796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( ALWAYS(pTab!=0) ){
63797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int op = IsVirtual(pTab) ? OP_VColumn : OP_Column;
63798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, op, iTable, iColumn, iReg);
63799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ColumnDefault(v, pTab, iColumn, iReg);
63800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
68307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iTable, iColumn, iReg);
63801 68308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ExprCacheStore(pParse, iTable, iColumn, iReg);
63802 68309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return iReg;
63803 68310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
63804 68311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
63805 68312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -64032,31 +68539,16 @@
64032 68539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC);
64033 68540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
64034 68541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
64035 68542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
64036 68543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case TK_VARIABLE: {
64037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- VdbeOp *pOp;
64038 68544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !ExprHasProperty(pExpr, EP_IntValue) );
64039 68545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pExpr->u.zToken!=0 );
64040 68546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pExpr->u.zToken[0]!=0 );
64041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->u.zToken[1]==0
64042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && (pOp = sqlite3VdbeGetOp(v, -1))->opcode==OP_Variable
64043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && pOp->p1+pOp->p3==pExpr->iColumn
64044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && pOp->p2+pOp->p3==target
64045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && pOp->p4.z==0
64046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
64047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If the previous instruction was a copy of the previous unnamed
64048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** parameter into the previous register, then simply increment the
64049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** repeat count on the prior instruction rather than making a new
64050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** instruction.
64051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
64052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOp->p3++;
64053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
64054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Variable, pExpr->iColumn, target, 1);
64055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->u.zToken[1]!=0 ){
64056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeChangeP4(v, -1, pExpr->u.zToken, 0);
64057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
68547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target);
68548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->u.zToken[1]!=0 ){
68549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP4(v, -1, pExpr->u.zToken, 0);
64058 68550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
64059 68551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
64060 68552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
64061 68553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case TK_REGISTER: {
64062 68554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inReg = pExpr->iTable;
@@ -65119,11 +69611,10 @@
65119 69611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** this routine is used, it does not hurt to get an extra 2 - that
65120 69612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** just might result in some slightly slower code. But returning
65121 69613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an incorrect 0 or 1 could lead to a malfunction.
65122 69614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
65123 69615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3ExprCompare(Expr *pA, Expr *pB){
65124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
65125 69616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pA==0||pB==0 ){
65126 69617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return pB==pA ? 0 : 2;
65127 69618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
65128 69619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !ExprHasAnyProperty(pA, EP_TokenOnly|EP_Reduced) );
65129 69620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !ExprHasAnyProperty(pB, EP_TokenOnly|EP_Reduced) );
@@ -65132,22 +69623,11 @@
65132 69623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
65133 69624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2;
65134 69625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pA->op!=pB->op ) return 2;
65135 69626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 2;
65136 69627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 2;
65137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
65138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pA->x.pList && pB->x.pList ){
65139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pA->x.pList->nExpr!=pB->x.pList->nExpr ) return 2;
65140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<pA->x.pList->nExpr; i++){
65141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Expr *pExprA = pA->x.pList->a[i].pExpr;
65142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Expr *pExprB = pB->x.pList->a[i].pExpr;
65143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3ExprCompare(pExprA, pExprB) ) return 2;
65144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
65145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( pA->x.pList || pB->x.pList ){
65146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 2;
65147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
65148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
69628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList) ) return 2;
65149 69629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 2;
65150 69630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( ExprHasProperty(pA, EP_IntValue) ){
65151 69631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !ExprHasProperty(pB, EP_IntValue) || pA->u.iValue!=pB->u.iValue ){
65152 69632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 2;
65153 69633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -65160,10 +69640,35 @@
65160 69640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (pA->flags & EP_ExpCollate)!=(pB->flags & EP_ExpCollate) ) return 1;
65161 69641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (pA->flags & EP_ExpCollate)!=0 && pA->pColl!=pB->pColl ) return 2;
65162 69642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
65163 69643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
65164 69644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
69645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
69646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Compare two ExprList objects. Return 0 if they are identical and
69647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** non-zero if they differ in any way.
69648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
69649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine might return non-zero for equivalent ExprLists. The
69650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** only consequence will be disabled optimizations. But this routine
69651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** must never return 0 if the two ExprList objects are different, or
69652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a malfunction will result.
69653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
69654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Two NULL pointers are considered to be the same. But a NULL pointer
69655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** always differs from a non-NULL pointer.
69656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
69657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB){
69658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
69659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pA==0 && pB==0 ) return 0;
69660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pA==0 || pB==0 ) return 1;
69661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pA->nExpr!=pB->nExpr ) return 1;
69662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pA->nExpr; i++){
69663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pExprA = pA->a[i].pExpr;
69664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pExprB = pB->a[i].pExpr;
69665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pA->a[i].sortOrder!=pB->a[i].sortOrder ) return 1;
69666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3ExprCompare(pExprA, pExprB) ) return 1;
69667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
69668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
69669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
65165 69670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
65166 69671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
65167 69672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Add a new element to the pAggInfo->aCol[] array. Return the index of
65168 69673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the new element. Return a negative number if malloc fails.
65169 69674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -65656,21 +70161,27 @@
65656 70161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* !SQLITE_OMIT_TRIGGER */
65657 70162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
65658 70163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
65659 70164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Register built-in functions used to help implement ALTER TABLE
65660 70165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
65661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE void sqlite3AlterFunctions(sqlite3 *db){
65662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3CreateFunc(db, "sqlite_rename_table", 2, SQLITE_UTF8, 0,
65663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- renameTableFunc, 0, 0);
70166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3AlterFunctions(void){
70167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static SQLITE_WSD FuncDef aAlterTableFuncs[] = {
70168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FUNCTION(sqlite_rename_table, 2, 0, 0, renameTableFunc),
65664 70169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_TRIGGER
65665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3CreateFunc(db, "sqlite_rename_trigger", 2, SQLITE_UTF8, 0,
65666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- renameTriggerFunc, 0, 0);
70170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FUNCTION(sqlite_rename_trigger, 2, 0, 0, renameTriggerFunc),
65667 70171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
65668 70172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_FOREIGN_KEY
65669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3CreateFunc(db, "sqlite_rename_parent", 3, SQLITE_UTF8, 0,
65670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- renameParentFunc, 0, 0);
70173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FUNCTION(sqlite_rename_parent, 3, 0, 0, renameParentFunc),
65671 70174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
70175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
70176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
70177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
70178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aAlterTableFuncs);
70179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
70180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<ArraySize(aAlterTableFuncs); i++){
70181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3FuncDefInsert(pHash, &aFunc[i]);
70182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
65672 70183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
65673 70184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
65674 70185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
65675 70186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is used to create the text of expressions of the form:
65676 70187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -65810,19 +70321,22 @@
65810 70321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Vdbe *v;
65811 70322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_TRIGGER
65812 70323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zWhere = 0; /* Where clause to locate temp triggers */
65813 70324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
65814 70325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */
65815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
70326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int savedDbFlags; /* Saved value of db->flags */
70327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
70328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ savedDbFlags = db->flags;
65816 70329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( NEVER(db->mallocFailed) ) goto exit_rename_table;
65817 70330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pSrc->nSrc==1 );
65818 70331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
65819 70332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
65820 70333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTab = sqlite3LocateTable(pParse, 0, pSrc->a[0].zName, pSrc->a[0].zDatabase);
65821 70334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !pTab ) goto exit_rename_table;
65822 70335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
65823 70336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zDb = db->aDb[iDb].zName;
70337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->flags |= SQLITE_PreferBuiltin;
65824 70338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
65825 70339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Get a NULL terminated version of the new table name. */
65826 70340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zName = sqlite3NameFromToken(db, pName);
65827 70341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !zName ) goto exit_rename_table;
65828 70342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -65986,10 +70500,11 @@
65986 70500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reloadTableSchema(pParse, pTab, zName);
65987 70501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
65988 70502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
exit_rename_table:
65989 70503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3SrcListDelete(db, pSrc);
65990 70504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, zName);
70505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->flags = savedDbFlags;
65991 70506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
65992 70507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
65993 70508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
65994 70509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
65995 70510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Generate code to make sure the file format number is at least minFormat.
@@ -66105,21 +70620,24 @@
66105 70620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
66106 70621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Modify the CREATE TABLE statement. */
66107 70622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n);
66108 70623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zCol ){
66109 70624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zEnd = &zCol[pColDef->n-1];
70625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int savedDbFlags = db->flags;
66110 70626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( zEnd>zCol && (*zEnd==';' || sqlite3Isspace(*zEnd)) ){
66111 70627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*zEnd-- = '\0';
66112 70628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
70629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->flags |= SQLITE_PreferBuiltin;
66113 70630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3NestedParse(pParse,
66114 70631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"UPDATE \"%w\".%s SET "
66115 70632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) "
66116 70633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"WHERE type = 'table' AND name = %Q",
66117 70634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zDb, SCHEMA_TABLE(iDb), pNew->addColOffset, zCol, pNew->addColOffset+1,
66118 70635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zTab
66119 70636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
66120 70637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, zCol);
70638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->flags = savedDbFlags;
66121 70639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
66122 70640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
66123 70641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the default value of the new column is NULL, then set the file
66124 70642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** format to 2. If the default value of the new column is not NULL,
66125 70643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the file format becomes 3.
@@ -66261,11 +70779,11 @@
66261 70779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Parse *pParse, /* Parsing context */
66262 70780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iDb, /* The database we are looking in */
66263 70781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iStatCur, /* Open the sqlite_stat1 table on this cursor */
66264 70782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zWhere /* Delete entries associated with this table */
66265 70783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
66266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static struct {
70784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const struct {
66267 70785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName;
66268 70786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zCols;
66269 70787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} aTable[] = {
66270 70788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{ "sqlite_stat1", "tbl,idx,stat" },
66271 70789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_ENABLE_STAT2
@@ -67019,11 +71537,12 @@
67019 71537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"attached databases must use the same text encoding as main database");
67020 71538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_ERROR;
67021 71539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
67022 71540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPager = sqlite3BtreePager(aNew->pBt);
67023 71541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3PagerLockingMode(pPager, db->dfltLockMode);
67024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3PagerJournalMode(pPager, db->dfltJournalMode);
71542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* journal_mode set by the OP_JournalMode opcode that will following
71543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the OP_Function opcode that invoked this function. */
67025 71544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BtreeSecureDelete(aNew->pBt,
67026 71545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BtreeSecureDelete(db->aDb[0].pBt,-1) );
67027 71546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
67028 71547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aNew->safety_level = 3;
67029 71548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aNew->zName = sqlite3DbStrDup(db, zName);
@@ -67164,11 +71683,11 @@
67164 71683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite_detach() or sqlite_attach() SQL user functions.
67165 71684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
67166 71685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void codeAttach(
67167 71686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Parse *pParse, /* The parser context */
67168 71687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int type, /* Either SQLITE_ATTACH or SQLITE_DETACH */
67169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FuncDef *pFunc, /* FuncDef wrapper for detachFunc() or attachFunc() */
71688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FuncDef const *pFunc,/* FuncDef wrapper for detachFunc() or attachFunc() */
67170 71689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pAuthArg, /* Expression to pass to authorization callback */
67171 71690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pFilename, /* Name of database file */
67172 71691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pDbname, /* Name of the database to use internally */
67173 71692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pKey /* Database key for encryption extension */
67174 71693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
@@ -67214,10 +71733,21 @@
67214 71733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( v ){
67215 71734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_Function, 0, regArgs+3-pFunc->nArg, regArgs+3);
67216 71735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFunc->nArg==-1 || (pFunc->nArg&0xff)==pFunc->nArg );
67217 71736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeP5(v, (u8)(pFunc->nArg));
67218 71737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeP4(v, -1, (char *)pFunc, P4_FUNCDEF);
71738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
71739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( type==SQLITE_ATTACH ){
71740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* On an attach, also set the journal mode. Note that
71741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3VdbeUsesBtree() is not call here since the iDb index
71742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** will be out of range prior to the new database being attached.
71743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The OP_JournalMode opcode will all sqlite3VdbeUsesBtree() for us.
71744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
71745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_JournalMode, db->nDb, regArgs+3,
71746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->dfltJournalMode);
71747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP5(v, 1);
71748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
67219 71749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
67220 71750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this
67221 71751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** statement only). For DETACH, set it to false (expire all existing
67222 71752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** statements).
67223 71753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -67234,11 +71764,11 @@
67234 71764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Called by the parser to compile a DETACH statement.
67235 71765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
67236 71766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** DETACH pDbname
67237 71767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
67238 71768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Detach(Parse *pParse, Expr *pDbname){
67239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static FuncDef detach_func = {
71769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const FuncDef detach_func = {
67240 71770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1, /* nArg */
67241 71771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_UTF8, /* iPrefEnc */
67242 71772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* flags */
67243 71773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* pUserData */
67244 71774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* pNext */
@@ -67255,11 +71785,11 @@
67255 71785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Called by the parser to compile an ATTACH statement.
67256 71786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
67257 71787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ATTACH p AS pDbname KEY pKey
67258 71788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
67259 71789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){
67260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static FuncDef attach_func = {
71790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const FuncDef attach_func = {
67261 71791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
3, /* nArg */
67262 71792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_UTF8, /* iPrefEnc */
67263 71793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* flags */
67264 71794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* pUserData */
67265 71795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* pNext */
@@ -71050,11 +75580,11 @@
71050 75580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Savepoint(Parse *pParse, int op, Token *pName){
71051 75581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zName = sqlite3NameFromToken(pParse->db, pName);
71052 75582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zName ){
71053 75583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Vdbe *v = sqlite3GetVdbe(pParse);
71054 75584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_AUTHORIZATION
71055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const char *az[] = { "BEGIN", "RELEASE", "ROLLBACK" };
75585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char * const az[] = { "BEGIN", "RELEASE", "ROLLBACK" };
71056 75586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !SAVEPOINT_BEGIN && SAVEPOINT_RELEASE==1 && SAVEPOINT_ROLLBACK==2 );
71057 75587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
71058 75588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !v || sqlite3AuthCheck(pParse, SQLITE_SAVEPOINT, az[op], zName, 0) ){
71059 75589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(pParse->db, zName);
71060 75590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
@@ -71090,11 +75620,11 @@
71090 75620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( db->aDb[1].pSchema );
71091 75621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){
71092 75622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->mallocFailed = 1;
71093 75623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
71094 75624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
71095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3PagerJournalMode(sqlite3BtreePager(pBt), db->dfltJournalMode);
75625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3PagerSetJournalMode(sqlite3BtreePager(pBt), db->dfltJournalMode);
71096 75626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
71097 75627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
71098 75628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
71099 75629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
71100 75630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -71729,19 +76259,24 @@
71729 76259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
71730 76260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p = p->pNext;
71731 76261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
71732 76262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
71733 76263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If no match is found, search the built-in functions.
76264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the SQLITE_PreferBuiltin flag is set, then search the built-in
76266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** functions even if a prior app-defined function was found. And give
76267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** priority to built-in functions.
71734 76268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
71735 76269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Except, if createFlag is true, that means that we are trying to
71736 76270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** install a new function. Whatever FuncDef structure is returned will
71737 76271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** have fields overwritten with new information appropriate for the
71738 76272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** new function. But the FuncDefs for built-in functions are read-only.
71739 76273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** So we must not search for built-ins when creating a new function.
71740 76274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
71741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !createFlag && !pBest ){
76275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !createFlag && (pBest==0 || (db->flags & SQLITE_PreferBuiltin)!=0) ){
71742 76276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
76277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bestScore = 0;
71743 76278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p = functionSearch(pHash, h, zName, nName);
71744 76279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( p ){
71745 76280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int score = matchQuality(p, nArg, enc);
71746 76281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( score>bestScore ){
71747 76282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pBest = p;
@@ -72337,13 +76872,11 @@
72337 76872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Populate the OLD.* pseudo-table register array. These values will be
72338 76873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** used by any BEFORE and AFTER triggers that exist. */
72339 76874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Copy, iRowid, iOld);
72340 76875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(iCol=0; iCol<pTab->nCol; iCol++){
72341 76876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( mask==0xffffffff || mask&(1<<iCol) ){
72342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iTarget = iOld + iCol + 1;
72343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Column, iCur, iCol, iTarget);
72344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ColumnDefault(v, pTab, iCol, iTarget);
76877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol, iOld+iCol+1);
72345 76878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
72346 76879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
72347 76880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
72348 76881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Invoke BEFORE DELETE trigger programs. */
72349 76882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3CodeRowTrigger(pParse, pTrigger,
@@ -73875,24 +78408,19 @@
73875 78408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
73876 78409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
73877 78410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
73878 78411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
73879 78412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
73880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This function registered all of the above C functions as SQL
73881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** functions. This should be the only routine in this file with
73882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** external linkage.
78413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine does per-connection function registration. Most
78414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the built-in functions above are part of the global function set.
78415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine only deals with those that are not global.
73883 78416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
73884 78417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
73885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifndef SQLITE_OMIT_ALTERTABLE
73886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3AlterFunctions(db);
73887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
73888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !db->mallocFailed ){
73889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = sqlite3_overload_function(db, "MATCH", 2);
73890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
73891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_NOMEM ){
73892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db->mallocFailed = 1;
73893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
78418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = sqlite3_overload_function(db, "MATCH", 2);
78419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
78420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_NOMEM ){
78421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->mallocFailed = 1;
73894 78422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
73895 78423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
73896 78424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
73897 78425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
73898 78426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Set the LIKEOPT flag on the 2-argument function with the given name.
@@ -74056,10 +78584,13 @@
74056 78584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
74057 78585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<ArraySize(aBuiltinFunc); i++){
74058 78586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3FuncDefInsert(pHash, &aFunc[i]);
74059 78587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
74060 78588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3RegisterDateTimeFunctions();
78589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_ALTERTABLE
78590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3AlterFunctions();
78591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
74061 78592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
74062 78593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
74063 78594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** End of func.c ************************************************/
74064 78595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Begin file fkey.c ********************************************/
74065 78596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -78480,10 +83011,35 @@
78480 83011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
78481 83012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return zName;
78482 83013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
78483 83014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
78484 83015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
83016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
83017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
83018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Parameter eMode must be one of the PAGER_JOURNALMODE_XXX constants
83019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** defined in pager.h. This function returns the associated lowercase
83020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** journal-mode name.
83021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
83022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE const char *sqlite3JournalModename(int eMode){
83023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static char * const azModeName[] = {
83024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "delete", "persist", "off", "truncate", "memory"
83025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
83026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ , "wal"
83027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
83028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
83029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( PAGER_JOURNALMODE_DELETE==0 );
83030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( PAGER_JOURNALMODE_PERSIST==1 );
83031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( PAGER_JOURNALMODE_OFF==2 );
83032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( PAGER_JOURNALMODE_TRUNCATE==3 );
83033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( PAGER_JOURNALMODE_MEMORY==4 );
83034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( PAGER_JOURNALMODE_WAL==5 );
83035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eMode>=0 && eMode<=ArraySize(azModeName) );
83036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
83037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eMode==ArraySize(azModeName) ) return 0;
83038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return azModeName[eMode];
83039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
83040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
78485 83041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
78486 83042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Process a pragma statement.
78487 83043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
78488 83044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Pragmas are of this form:
78489 83045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -78552,15 +83108,15 @@
78552 83108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** page cache size. The value returned is the maximum number of
78553 83109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pages in the page cache. The second form sets both the current
78554 83110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** page cache size value and the persistent page cache size value
78555 83111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** stored in the database file.
78556 83112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
78557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The default cache size is stored in meta-value 2 of page 1 of the
78558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** database file. The cache size is actually the absolute value of
78559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** this memory location. The sign of meta-value 2 determines the
78560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** synchronous setting. A negative value means synchronous is off
78561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** and a positive value means synchronous is on.
83113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Older versions of SQLite would set the default cache size to a
83114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** negative number to indicate synchronous=OFF. These days, synchronous
83115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is always on by default regardless of the sign of the default cache
83116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** size. But continue to take the absolute value of the default cache
83117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** size of historical compatibility.
78562 83118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
78563 83119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3StrICmp(zLeft,"default_cache_size")==0 ){
78564 83120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const VdbeOpList getCacheSize[] = {
78565 83121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{ OP_Transaction, 0, 0, 0}, /* 0 */
78566 83122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{ OP_ReadCookie, 0, 1, BTREE_DEFAULT_CACHE_SIZE}, /* 1 */
@@ -78585,14 +83141,10 @@
78585 83141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
78586 83142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int size = atoi(zRight);
78587 83143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( size<0 ) size = -size;
78588 83144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BeginWriteOperation(pParse, 0, iDb);
78589 83145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Integer, size, 1);
78590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, 2, BTREE_DEFAULT_CACHE_SIZE);
78591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- addr = sqlite3VdbeAddOp2(v, OP_IfPos, 2, 0);
78592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Integer, -size, 1);
78593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeJumpHere(v, addr);
78594 83146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, 1);
78595 83147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pDb->pSchema->cache_size = size;
78596 83148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size);
78597 83149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
78598 83150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
@@ -78733,66 +83285,62 @@
78733 83285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
78734 83286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
78735 83287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
78736 83288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
78737 83289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PRAGMA [database.]journal_mode
78738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** PRAGMA [database.]journal_mode = (delete|persist|off|truncate|memory)
83290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** PRAGMA [database.]journal_mode =
83291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (delete|persist|off|truncate|memory|wal|off)
78739 83292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
78740 83293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3StrICmp(zLeft,"journal_mode")==0 ){
78741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int eMode;
78742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static char * const azModeName[] = {
78743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "delete", "persist", "off", "truncate", "memory"
78744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
83294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int eMode; /* One of the PAGER_JOURNALMODE_XXX symbols */
83295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
83296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeSetNumCols(v, 1);
83297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "journal_mode", SQLITE_STATIC);
78745 83298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
78746 83299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zRight==0 ){
78747 83300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eMode = PAGER_JOURNALMODE_QUERY;
78748 83301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
83302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zMode;
78749 83303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n = sqlite3Strlen30(zRight);
78750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eMode = sizeof(azModeName)/sizeof(azModeName[0]) - 1;
78751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( eMode>=0 && sqlite3StrNICmp(zRight, azModeName[eMode], n)!=0 ){
78752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eMode--;
83304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(eMode=0; (zMode = sqlite3JournalModename(eMode)); eMode++){
83305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3StrNICmp(zRight, zMode, n)==0 ) break;
83306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
83307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !zMode ){
83308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eMode = PAGER_JOURNALMODE_QUERY;
78753 83309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
78754 83310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
78755 83311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pId2->n==0 && eMode==PAGER_JOURNALMODE_QUERY ){
78756 83312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Simple "PRAGMA journal_mode;" statement. This is a query for
78757 83313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the current default journal mode (which may be different to
78758 83314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the journal-mode of the main database).
78759 83315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
78760 83316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eMode = db->dfltJournalMode;
83317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_String8, 0, 1);
83318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP4(v, -1, sqlite3JournalModename(eMode), P4_STATIC);
78761 83319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
78762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Pager *pPager;
83320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ii;
83321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
78763 83322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pId2->n==0 ){
78764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* This indicates that no database name was specified as part
78765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of the PRAGMA command. In this case the journal-mode must be
78766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** set on all attached databases, as well as the main db file.
83323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* When there is no database name before the "journal_mode" keyword
83324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in the PRAGMA, then the journal-mode will be set on
83325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** all attached databases, as well as the main db file.
78767 83326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
78768 83327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Also, the sqlite3.dfltJournalMode variable is set so that
78769 83328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** any subsequently attached databases also use the specified
78770 83329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** journal mode.
78771 83330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
78772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ii;
78773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert(pDb==&db->aDb[0]);
78774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(ii=1; ii<db->nDb; ii++){
78775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( db->aDb[ii].pBt ){
78776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPager = sqlite3BtreePager(db->aDb[ii].pBt);
78777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3PagerJournalMode(pPager, eMode);
78778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
78779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
78780 83331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->dfltJournalMode = (u8)eMode;
78781 83332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
78782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPager = sqlite3BtreePager(pDb->pBt);
78783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eMode = sqlite3PagerJournalMode(pPager, eMode);
78784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
78785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( eMode==PAGER_JOURNALMODE_DELETE
78786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || eMode==PAGER_JOURNALMODE_TRUNCATE
78787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || eMode==PAGER_JOURNALMODE_PERSIST
78788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || eMode==PAGER_JOURNALMODE_OFF
78789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || eMode==PAGER_JOURNALMODE_MEMORY );
78790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeSetNumCols(v, 1);
78791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "journal_mode", SQLITE_STATIC);
78792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0,
78793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- azModeName[eMode], P4_STATIC);
83333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
83334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(ii=db->nDb-1; ii>=0; ii--){
83335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){
83336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeUsesBtree(v, ii);
83337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_JournalMode, ii, 1, eMode);
83338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
83339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
83340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
83341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
78794 83342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
78795 83343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
78796 83344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
78797 83345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
78798 83346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** PRAGMA [database.]journal_size_limit
@@ -79605,10 +84153,40 @@
79605 84153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zOpt, 0);
79606 84154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
79607 84155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
79608 84156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
79609 84157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
84158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
84159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
84160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
84161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** PRAGMA [database.]wal_checkpoint
84162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
84163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Checkpoint the database.
84164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
84165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3StrICmp(zLeft, "wal_checkpoint")==0 ){
84166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3ReadSchema(pParse) ) goto pragma_out;
84167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Checkpoint, pId2->z?iDb:SQLITE_MAX_ATTACHED, 0, 0);
84168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else
84169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
84170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
84171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** PRAGMA wal_autocheckpoint
84172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** PRAGMA wal_autocheckpoint = N
84173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
84174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Configure a database connection to automatically checkpoint a database
84175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** after accumulating N frames in the log. Or query for the current value
84176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of N.
84177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
84178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3StrICmp(zLeft, "wal_autocheckpoint")==0 ){
84179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zRight ){
84180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nAuto = atoi(zRight);
84181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_wal_autocheckpoint(db, nAuto);
84182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
84183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ returnSingleInt(pParse, "wal_autocheckpoint",
84184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->xWalCallback==sqlite3WalDefaultHook ?
84185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PTR_TO_INT(db->pWalArg) : 0);
84186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else
84187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
79610 84188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
79611 84189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST)
79612 84190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
79613 84191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Report the current state of file logs for all databases
79614 84192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -84278,10 +88856,22 @@
84278 88856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pGroupBy = sqlite3ExprListDup(db, p->pEList, 0);
84279 88857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pGroupBy = p->pGroupBy;
84280 88858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->selFlags &= ~SF_Distinct;
84281 88859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isDistinct = 0;
84282 88860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
88861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
88862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If there is both a GROUP BY and an ORDER BY clause and they are
88863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** identical, then disable the ORDER BY clause since the GROUP BY
88864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** will cause elements to come out in the correct order. This is
88865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an optimization - the correct answer should result regardless.
88866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the SQLITE_GroupByOrder flag with SQLITE_TESTCTRL_OPTIMIZER
88867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to disable this optimization for testing purposes.
88868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
88869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3ExprListCompare(p->pGroupBy, pOrderBy)==0
88870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (db->flags & SQLITE_GroupByOrder)==0 ){
88871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOrderBy = 0;
88872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
84283 88873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
84284 88874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there is an ORDER BY clause, then this sorting
84285 88875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** index might end up being unused if the data can be
84286 88876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** extracted in pre-sorted order. If that is the case, then the
84287 88877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** OP_OpenEphemeral instruction will be changed to an OP_Noop once
@@ -86161,11 +90751,11 @@
86161 90751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
86162 90752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** May you do good and not evil.
86163 90753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** May you find forgiveness for yourself and forgive others.
86164 90754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** May you share freely, never taking more than you give.
86165 90755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
86166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *************************************************************************
90756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite*************************************************************************
86167 90757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This file contains C code routines that are called by the parser
86168 90758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to handle UPDATE statements.
86169 90759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
86170 90760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
86171 90761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_VIRTUALTABLE
@@ -86548,12 +91138,11 @@
86548 91138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
oldmask |= sqlite3TriggerColmask(pParse,
86549 91139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError
86550 91140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
86551 91141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<pTab->nCol; i++){
86552 91142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( aXRef[i]<0 || oldmask==0xffffffff || (oldmask & (1<<i)) ){
86553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regOld+i);
86554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ColumnDefault(v, pTab, i, regOld+i);
91143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, i, regOld+i);
86555 91144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
86556 91145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Null, 0, regOld+i);
86557 91146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
86558 91147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
86559 91148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( chngRowid==0 ){
@@ -86922,11 +91511,12 @@
86922 91511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int saved_nChange; /* Saved value of db->nChange */
86923 91512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int saved_nTotalChange; /* Saved value of db->nTotalChange */
86924 91513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*saved_xTrace)(void*,const char*); /* Saved db->xTrace */
86925 91514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Db *pDb = 0; /* Database to detach at end of vacuum */
86926 91515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isMemDb; /* True if vacuuming a :memory: database */
86927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nRes;
91516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRes; /* Bytes of reserved space at the end of each page */
91517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nDb; /* Number of attached databases */
86928 91518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
86929 91519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !db->autoCommit ){
86930 91520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction");
86931 91521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_ERROR;
86932 91522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -86936,11 +91526,11 @@
86936 91526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** disable CHECK and foreign key constraints. */
86937 91527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
saved_flags = db->flags;
86938 91528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
saved_nChange = db->nChange;
86939 91529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
saved_nTotalChange = db->nTotalChange;
86940 91530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
saved_xTrace = db->xTrace;
86941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks;
91531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_PreferBuiltin;
86942 91532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder);
86943 91533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->xTrace = 0;
86944 91534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
86945 91535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pMain = db->aDb[0].pBt;
86946 91536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isMemDb = sqlite3PagerIsMemdb(sqlite3BtreePager(pMain));
@@ -86957,19 +91547,22 @@
86957 91547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** actually occurs when doing a vacuum since the vacuum_db is initially
86958 91548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** empty. Only the journal header is written. Apparently it takes more
86959 91549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** time to parse and run the PRAGMA to turn journalling off than it does
86960 91550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to write the journal header file.
86961 91551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
91552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDb = db->nDb;
86962 91553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3TempInMemory(db) ){
86963 91554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zSql = "ATTACH ':memory:' AS vacuum_db;";
86964 91555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
86965 91556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zSql = "ATTACH '' AS vacuum_db;";
86966 91557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
86967 91558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = execSql(db, pzErrMsg, zSql);
91559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db->nDb>nDb ){
91560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDb = &db->aDb[db->nDb-1];
91561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( strcmp(pDb->zName,"vacuum_db")==0 );
91562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
86968 91563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) goto end_of_vacuum;
86969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pDb = &db->aDb[db->nDb-1];
86970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( strcmp(db->aDb[db->nDb-1].zName,"vacuum_db")==0 );
86971 91564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTemp = db->aDb[db->nDb-1].pBt;
86972 91565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
86973 91566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The call to execSql() to attach the temp database has left the file
86974 91567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** locked (as there was more than one active statement when the transaction
86975 91568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to read the schema was concluded. Unlock it here so that this doesn't
@@ -86986,10 +91579,16 @@
86986 91579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zKey;
86987 91580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey);
86988 91581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nKey ) db->nextPagesize = 0;
86989 91582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
86990 91583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
91584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
91585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Do not attempt to change the page size for a WAL database */
91586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3PagerGetJournalMode(sqlite3BtreePager(pMain))
91587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ==PAGER_JOURNALMODE_WAL ){
91588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->nextPagesize = 0;
91589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
86991 91590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
86992 91591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes, 0)
86993 91592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes, 0))
86994 91593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| NEVER(db->mallocFailed)
86995 91594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
@@ -87123,10 +91722,11 @@
87123 91722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Restore the original value of db->flags */
87124 91723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->flags = saved_flags;
87125 91724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->nChange = saved_nChange;
87126 91725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->nTotalChange = saved_nTotalChange;
87127 91726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->xTrace = saved_xTrace;
91727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3BtreeSetPageSize(pMain, -1, -1, 1);
87128 91728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
87129 91729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Currently there is an SQL level transaction open on the vacuum
87130 91730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** database. No locks are held on any other files (since the main file
87131 91731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** was committed at the btree level). So it safe to end the transaction
87132 91732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by manually setting the autoCommit flag to true and detaching the
@@ -90988,11 +95588,11 @@
90988 95588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** as we can without disabling too much. If we disabled in (1), we'd get
90989 95589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the wrong answer. See ticket #813.
90990 95590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
90991 95591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
90992 95592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTerm
90993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && ALWAYS((pTerm->wtFlags & TERM_CODED)==0)
95593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (pTerm->wtFlags & TERM_CODED)==0
90994 95594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin))
90995 95595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
90996 95596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTerm->wtFlags |= TERM_CODED;
90997 95597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTerm->iParent>=0 ){
90998 95598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereTerm *pOther = &pTerm->pWC->a[pTerm->iParent];
@@ -91186,11 +95786,13 @@
91186 95786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(j=0; j<nEq; j++){
91187 95787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int r1;
91188 95788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int k = pIdx->aiColumn[j];
91189 95789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTerm = findTerm(pWC, iCur, k, notReady, pLevel->plan.wsFlags, pIdx);
91190 95790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( NEVER(pTerm==0) ) break;
91191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( (pTerm->wtFlags & TERM_CODED)==0 );
95791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The following true for indices with redundant columns.
95792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */
95793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ testcase( (pTerm->wtFlags & TERM_CODED)!=0 );
91192 95794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
r1 = codeEqualityTerm(pParse, pTerm, pLevel, regBase+j);
91193 95795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( r1!=regBase+j ){
91194 95796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nReg==1 ){
91195 95797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ReleaseTempReg(pParse, regBase);
91196 95798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
regBase = r1;
@@ -91473,11 +96075,12 @@
91473 96075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nConstraint; /* Number of constraint terms */
91474 96076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *pIdx; /* The index we will be using */
91475 96077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iIdxCur; /* The VDBE cursor for the index */
91476 96078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nExtraReg = 0; /* Number of extra registers needed */
91477 96079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int op; /* Instruction opcode */
91478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zAff;
96080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zStartAff; /* Affinity for start of range constraint */
96081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zEndAff; /* Affinity for end of range constraint */
91479 96082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
91480 96083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdx = pLevel->plan.u.pIdx;
91481 96084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iIdxCur = pLevel->iIdxCur;
91482 96085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
k = pIdx->aiColumn[nEq]; /* Column for inequality constraints */
91483 96086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -91514,12 +96117,13 @@
91514 96117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Generate code to evaluate all constraint terms using == or IN
91515 96118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and store the values of those terms in an array of registers
91516 96119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** starting at regBase.
91517 96120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
91518 96121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
regBase = codeAllEqualityTerms(
91519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pParse, pLevel, pWC, notReady, nExtraReg, &zAff
96122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse, pLevel, pWC, notReady, nExtraReg, &zStartAff
91520 96123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
96124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zEndAff = sqlite3DbStrDup(pParse->db, zStartAff);
91521 96125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
addrNxt = pLevel->addrNxt;
91522 96126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
91523 96127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If we are doing a reverse order scan on an ascending index, or
91524 96128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a forward order scan on a descending index, interchange the
91525 96129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** start and end terms (pRangeStart and pRangeEnd).
@@ -91540,29 +96144,29 @@
91540 96144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nConstraint = nEq;
91541 96145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pRangeStart ){
91542 96146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pRight = pRangeStart->pExpr->pRight;
91543 96147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ExprCode(pParse, pRight, regBase+nEq);
91544 96148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ExprCodeIsNullJump(v, pRight, regBase+nEq, addrNxt);
91545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zAff ){
91546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE){
96149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zStartAff ){
96150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3CompareAffinity(pRight, zStartAff[nEq])==SQLITE_AFF_NONE){
91547 96151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Since the comparison is to be performed with no conversions
91548 96152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** applied to the operands, set the affinity to apply to pRight to
91549 96153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SQLITE_AFF_NONE. */
91550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zAff[nConstraint] = SQLITE_AFF_NONE;
96154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zStartAff[nEq] = SQLITE_AFF_NONE;
91551 96155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
91552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[nConstraint]) ){
91553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zAff[nConstraint] = SQLITE_AFF_NONE;
96156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3ExprNeedsNoAffinityChange(pRight, zStartAff[nEq]) ){
96157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zStartAff[nEq] = SQLITE_AFF_NONE;
91554 96158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
91555 96159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
91556 96160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nConstraint++;
91557 96161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( isMinQuery ){
91558 96162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq);
91559 96163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nConstraint++;
91560 96164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
startEq = 0;
91561 96165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
start_constraints = 1;
91562 96166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
91563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- codeApplyAffinity(pParse, regBase, nConstraint, zAff);
96167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ codeApplyAffinity(pParse, regBase, nConstraint, zStartAff);
91564 96168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev];
91565 96169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( op!=0 );
91566 96170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( op==OP_Rewind );
91567 96171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( op==OP_Last );
91568 96172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( op==OP_SeekGt );
@@ -91578,25 +96182,26 @@
91578 96182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pRangeEnd ){
91579 96183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pRight = pRangeEnd->pExpr->pRight;
91580 96184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ExprCacheRemove(pParse, regBase+nEq, 1);
91581 96185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ExprCode(pParse, pRight, regBase+nEq);
91582 96186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ExprCodeIsNullJump(v, pRight, regBase+nEq, addrNxt);
91583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zAff ){
91584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE){
96187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zEndAff ){
96188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3CompareAffinity(pRight, zEndAff[nEq])==SQLITE_AFF_NONE){
91585 96189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Since the comparison is to be performed with no conversions
91586 96190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** applied to the operands, set the affinity to apply to pRight to
91587 96191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SQLITE_AFF_NONE. */
91588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zAff[nConstraint] = SQLITE_AFF_NONE;
96192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zEndAff[nEq] = SQLITE_AFF_NONE;
91589 96193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
91590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[nConstraint]) ){
91591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zAff[nConstraint] = SQLITE_AFF_NONE;
96194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3ExprNeedsNoAffinityChange(pRight, zEndAff[nEq]) ){
96195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zEndAff[nEq] = SQLITE_AFF_NONE;
91592 96196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
91593 96197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
91594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- codeApplyAffinity(pParse, regBase, nEq+1, zAff);
96198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ codeApplyAffinity(pParse, regBase, nEq+1, zEndAff);
91595 96199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nConstraint++;
91596 96200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
91597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3DbFree(pParse->db, zAff);
96201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DbFree(pParse->db, zStartAff);
96202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DbFree(pParse->db, zEndAff);
91598 96203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
91599 96204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Top of the loop body */
91600 96205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pLevel->p2 = sqlite3VdbeCurrentAddr(v);
91601 96206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
91602 96207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check if the index cursor is past the end of the range. */
@@ -97936,11 +102541,11 @@
97936 102541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SQLITE_IOERR */ "disk I/O error",
97937 102542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SQLITE_CORRUPT */ "database disk image is malformed",
97938 102543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SQLITE_NOTFOUND */ 0,
97939 102544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SQLITE_FULL */ "database or disk is full",
97940 102545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SQLITE_CANTOPEN */ "unable to open database file",
97941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* SQLITE_PROTOCOL */ 0,
102546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* SQLITE_PROTOCOL */ "locking protocol",
97942 102547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SQLITE_EMPTY */ "table contains no data",
97943 102548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SQLITE_SCHEMA */ "database schema has changed",
97944 102549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SQLITE_TOOBIG */ "string or blob too big",
97945 102550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SQLITE_CONSTRAINT */ "constraint failed",
97946 102551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* SQLITE_MISMATCH */ "datatype mismatch",
@@ -98346,10 +102951,149 @@
98346 102951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->pRollbackArg = pArg;
98347 102952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_mutex_leave(db->mutex);
98348 102953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return pRet;
98349 102954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
98350 102955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
102956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
102957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
102958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint().
102959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Invoke sqlite3_wal_checkpoint if the number of frames in the log file
102960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is greater than sqlite3.pWalArg cast to an integer (the value configured by
102961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wal_autocheckpoint()).
102962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
102963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3WalDefaultHook(
102964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pClientData, /* Argument */
102965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3 *db, /* Connection */
102966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zDb, /* Database */
102967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nFrame /* Size of WAL */
102968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
102969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nFrame>=SQLITE_PTR_TO_INT(pClientData) ){
102970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3BeginBenignMalloc();
102971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_wal_checkpoint(db, zDb);
102972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3EndBenignMalloc();
102973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
102974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
102975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
102976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_OMIT_WAL */
102977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
102978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
102979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Configure an sqlite3_wal_hook() callback to automatically checkpoint
102980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a database after committing a transaction if there are nFrame or
102981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** more frames in the log file. Passing zero or a negative value as the
102982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** nFrame parameter disables automatic checkpoints entirely.
102983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
102984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The callback registered by this function replaces any existing callback
102985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** registered using sqlite3_wal_hook(). Likewise, registering a callback
102986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** using sqlite3_wal_hook() disables the automatic checkpoint mechanism
102987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** configured by this function.
102988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
102989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int nFrame){
102990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
102991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nFrame>0 ){
102992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_wal_hook(db, sqlite3WalDefaultHook, SQLITE_INT_TO_PTR(nFrame));
102993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
102994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_wal_hook(db, 0, 0);
102995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
102996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
102997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
102998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
102999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
103001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Register a callback to be invoked each time a transaction is written
103002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** into the write-ahead-log by this database connection.
103003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
103004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_API void *sqlite3_wal_hook(
103005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3 *db, /* Attach the hook to this db handle */
103006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int(*xCallback)(void *, sqlite3*, const char*, int),
103007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pArg /* First argument passed to xCallback() */
103008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
103009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
103010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pRet;
103011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_enter(db->mutex);
103012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet = db->pWalArg;
103013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->xWalCallback = xCallback;
103014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->pWalArg = pArg;
103015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_leave(db->mutex);
103016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return pRet;
103017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
103018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
103019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
103020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
103024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Checkpoint database zDb. If zDb is NULL, or if the buffer zDb points
103025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to contains a zero-length string, all attached databases are
103026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** checkpointed.
103027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
103028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){
103029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_OMIT_WAL
103030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
103031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
103032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
103033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iDb = SQLITE_MAX_ATTACHED; /* sqlite3.aDb[] index of db to checkpoint */
103034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_enter(db->mutex);
103036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zDb && zDb[0] ){
103037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDb = sqlite3FindDbName(db, zDb);
103038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iDb<0 ){
103040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_ERROR;
103041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Error(db, SQLITE_ERROR, "unknown database: %s", zDb);
103042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
103043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Checkpoint(db, iDb);
103044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Error(db, rc, 0);
103045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3ApiExit(db, rc);
103047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_leave(db->mutex);
103048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
103049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
103050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WAL
103053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
103054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Run a checkpoint on database iDb. This is a no-op if database iDb is
103055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** not currently open in WAL mode.
103056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
103057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If a transaction is open on the database being checkpointed, this
103058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function returns SQLITE_LOCKED and a checkpoint is not attempted. If
103059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an error occurs while running the checkpoint, an SQLite error code is
103060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** returned (i.e. SQLITE_IOERR). Otherwise, SQLITE_OK.
103061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
103062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The mutex on database handle db should be held by the caller. The mutex
103063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** associated with the specific b-tree being checkpointed is taken by
103064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this function while the checkpoint is running.
103065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
103066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If iDb is passed SQLITE_MAX_ATTACHED, then all attached databases are
103067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** checkpointed. If an error is encountered it is returned immediately -
103068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** no attempt is made to checkpoint any remaining databases.
103069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
103070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3 *db, int iDb){
103071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Return code */
103072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Used to iterate through attached dbs */
103073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( sqlite3_mutex_held(db->mutex) );
103075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<db->nDb && rc==SQLITE_OK; i++){
103077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i==iDb || iDb==SQLITE_MAX_ATTACHED ){
103078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Btree *pBt = db->aDb[i].pBt;
103079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pBt ){
103080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3BtreeIsInReadTrans(pBt) ){
103081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_LOCKED;
103082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
103083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3BtreeEnter(pBt);
103084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3PagerCheckpoint(sqlite3BtreePager(pBt));
103085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3BtreeLeave(pBt);
103086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
103092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_OMIT_WAL */
103094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
98351 103095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
98352 103096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function returns true if main-memory should be used instead of
98353 103097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a temporary file for transient pager files and statement journals.
98354 103098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The value returned depends on the value of db->temp_store (runtime
98355 103099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** parameter) and the compile time value of SQLITE_TEMP_STORE. The
@@ -98906,10 +103650,12 @@
98906 103650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
98907 103651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Enable the lookaside-malloc subsystem */
98908 103652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside,
98909 103653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3GlobalConfig.nLookaside);
98910 103654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
103655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_wal_autocheckpoint(db, SQLITE_DEFAULT_WAL_AUTOCHECKPOINT);
103656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
98911 103657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
opendb_out:
98912 103658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db ){
98913 103659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( db->mutex!=0 || isThreadsafe==0 || sqlite3GlobalConfig.bFullMutex==0 );
98914 103660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_mutex_leave(db->mutex);
98915 103661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -99400,13 +104146,17 @@
99400 104146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an incompatible database file format. Changing the PENDING byte
99401 104147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** while any database connection is open results in undefined and
99402 104148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** dileterious behavior.
99403 104149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
99404 104150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_TESTCTRL_PENDING_BYTE: {
99405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned int newVal = va_arg(ap, unsigned int);
99406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3PendingByte;
99407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( newVal ) sqlite3PendingByte = newVal;
104151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = PENDING_BYTE;
104152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_WSD
104153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
104154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int newVal = va_arg(ap, unsigned int);
104155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( newVal ) sqlite3PendingByte = newVal;
104156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
104157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
99408 104158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
99409 104159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99410 104160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99411 104161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
99412 104162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, int X)
@@ -99505,10 +104255,19 @@
99505 104255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n = sqlite3Strlen30(zWord);
99506 104256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = (sqlite3KeywordCode((u8*)zWord, n)!=TK_ID) ? SQLITE_N_KEYWORD : 0;
99507 104257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
99508 104258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99509 104259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
104260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
104261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* sqlite3_test_control(SQLITE_TESTCTRL_PGHDRSZ)
104262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
104263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the size of a pcache header in bytes.
104264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
104265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_TESTCTRL_PGHDRSZ: {
104266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sizeof(PgHdr);
104267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
104268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
99510 104269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99511 104270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99512 104271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
va_end(ap);
99513 104272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_BUILTIN_TEST */
99514 104273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
@@ -99671,10 +104430,11 @@
99671 104430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_mutex_enter(db->mutex);
99672 104431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
enterMutex();
99673 104432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99674 104433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( xNotify==0 ){
99675 104434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
removeFromBlockedList(db);
104435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->pBlockingConnection = 0;
99676 104436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->pUnlockConnection = 0;
99677 104437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->xUnlockNotify = 0;
99678 104438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->pUnlockArg = 0;
99679 104439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( 0==db->pBlockingConnection ){
99680 104440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The blocking transaction has been concluded. Or there never was a
99681 104441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!