14# define PATH_MAX FILENAME_MAX
16#if SQLITE_VERSION_NUMBER
< 3040000
17typedef const char *sqlite3_filename;
23struct Vfs : sqlite3_vfs {
28struct File : sqlite3_file {
31 QtFile(
const QString &name,
bool removeOnClose)
33 , removeOnClose(removeOnClose)
50 auto file =
static_cast<
File *>(sfile);
56int xRead(sqlite3_file *sfile,
void *ptr,
int iAmt, sqlite3_int64 iOfst)
58 auto file =
static_cast<
File *>(sfile);
60 return SQLITE_IOERR_READ;
62 auto sz = file
->pFile->read(
static_cast<
char *>(ptr), iAmt);
64 memset(
static_cast<
char *>(ptr) + sz, 0, size_t(iAmt - sz));
65 return SQLITE_IOERR_SHORT_READ;
70int xWrite(sqlite3_file *sfile,
const void *data,
int iAmt, sqlite3_int64 iOfst)
72 auto file =
static_cast<
File *>(sfile);
74 return SQLITE_IOERR_SEEK;
75 return file
->pFile->write(
reinterpret_cast<
const char*>(data), iAmt) == iAmt ? SQLITE_OK : SQLITE_IOERR_WRITE;
78int xTruncate(sqlite3_file *sfile, sqlite3_int64 size)
80 auto file =
static_cast<
File *>(sfile);
81 return file
->pFile->resize(size) ? SQLITE_OK : SQLITE_IOERR_TRUNCATE;
84int xSync(sqlite3_file *sfile,
int )
90int xFileSize(sqlite3_file *sfile, sqlite3_int64 *pSize)
92 auto file =
static_cast<
File *>(sfile);
99int xLock(sqlite3_file *,
int) {
return SQLITE_OK; }
101int xUnlock(sqlite3_file *,
int) {
return SQLITE_OK; }
109int xFileControl(sqlite3_file *,
int,
void *) {
return SQLITE_NOTFOUND; }
121int xOpen(sqlite3_vfs *svfs, sqlite3_filename zName, sqlite3_file *sfile,
122 int flags,
int *pOutFlags)
124 auto vfs =
static_cast<
Vfs *>(svfs);
125 auto file =
static_cast<
File *>(sfile);
126 memset(file, 0,
sizeof(
File));
127 QIODeviceBase::OpenMode mode = QIODeviceBase::NotOpen;
128 if (!zName || (flags & SQLITE_OPEN_MEMORY))
130 if ((flags & SQLITE_OPEN_READONLY) &&
131 !(flags & SQLITE_OPEN_READWRITE) &&
132 !(flags & SQLITE_OPEN_CREATE) &&
133 !(flags & SQLITE_OPEN_DELETEONCLOSE)) {
134 mode |= QIODeviceBase::OpenModeFlag::ReadOnly;
137
138
139
140
141
142
143
144
145
146 if ((flags & SQLITE_OPEN_CREATE) && (flags & SQLITE_OPEN_EXCLUSIVE))
147 mode |= QIODeviceBase::OpenModeFlag::NewOnly;
149 if (flags & SQLITE_OPEN_READWRITE)
150 mode |= QIODeviceBase::OpenModeFlag::ReadWrite;
154 file->pFile =
new File::QtFile(QString::fromUtf8(zName),
bool(flags & SQLITE_OPEN_DELETEONCLOSE));
156 return SQLITE_CANTOPEN;
163int xDelete(sqlite3_vfs *,
const char *zName,
int)
165 return QFile::remove(QString::fromUtf8(zName)) ? SQLITE_OK : SQLITE_ERROR;
168int xAccess(sqlite3_vfs *,
const char *zName,
int flags,
int *pResOut)
172 case SQLITE_ACCESS_EXISTS:
173 case SQLITE_ACCESS_READ:
174 *pResOut = QFile::exists(QString::fromUtf8(zName));
188 for (;zName[i] && i < nOut; ++i)
200 auto vfs =
static_cast<
Vfs *>(svfs)
->pVfs;
201 return vfs->xRandomness(vfs, nByte, zOut);
204int xSleep(sqlite3_vfs *svfs,
int microseconds)
206 auto vfs =
static_cast<
Vfs *>(svfs)
->pVfs;
207 return vfs->xSleep(vfs, microseconds);
212 auto vfs =
static_cast<
Vfs *>(svfs)
->pVfs;
213 return vfs->xCurrentTime(vfs, zOut);
223 auto vfs =
static_cast<
Vfs *>(svfs)
->pVfs;
224 return vfs->xCurrentTimeInt64(vfs, zOut);
231 memset(&vfs, 0,
sizeof(
Vfs));
233 vfs.szOsFile =
sizeof(
File);
245 vfs
.pVfs = sqlite3_vfs_find(
nullptr);
260 sqlite3_vfs_register(&vfs, 0);
QtFile(const QString &name, bool removeOnClose)
int xRandomness(sqlite3_vfs *svfs, int nByte, char *zOut)
int xWrite(sqlite3_file *sfile, const void *data, int iAmt, sqlite3_int64 iOfst)
int xLock(sqlite3_file *, int)
int xSleep(sqlite3_vfs *svfs, int microseconds)
int xOpen(sqlite3_vfs *svfs, sqlite3_filename zName, sqlite3_file *sfile, int flags, int *pOutFlags)
int xGetLastError(sqlite3_vfs *, int, char *)
int xFileSize(sqlite3_file *sfile, sqlite3_int64 *pSize)
int xRead(sqlite3_file *sfile, void *ptr, int iAmt, sqlite3_int64 iOfst)
int xFullPathname(sqlite3_vfs *, const char *zName, int nOut, char *zOut)
int xAccess(sqlite3_vfs *, const char *zName, int flags, int *pResOut)
int xCurrentTime(sqlite3_vfs *svfs, double *zOut)
int xFileControl(sqlite3_file *, int, void *)
int xDeviceCharacteristics(sqlite3_file *)
int xCheckReservedLock(sqlite3_file *, int *pResOut)
int xSectorSize(sqlite3_file *)
int xUnlock(sqlite3_file *, int)
int xSync(sqlite3_file *sfile, int)
int xDelete(sqlite3_vfs *, const char *zName, int)
int xCurrentTimeInt64(sqlite3_vfs *svfs, sqlite3_int64 *zOut)
int xTruncate(sqlite3_file *sfile, sqlite3_int64 size)
int xClose(sqlite3_file *sfile)
sqlite3_io_methods ioMethods