xref: /sqlite-3.40.0/src/test_devsym.c (revision 822a5162)
1bf260978Sdanielk1977 /*
2bf260978Sdanielk1977 ** 2008 Jan 22
3bf260978Sdanielk1977 **
4bf260978Sdanielk1977 ** The author disclaims copyright to this source code.  In place of
5bf260978Sdanielk1977 ** a legal notice, here is a blessing:
6bf260978Sdanielk1977 **
7bf260978Sdanielk1977 **    May you do good and not evil.
8bf260978Sdanielk1977 **    May you find forgiveness for yourself and forgive others.
9bf260978Sdanielk1977 **    May you share freely, never taking more than you give.
10bf260978Sdanielk1977 **
11bf260978Sdanielk1977 ******************************************************************************
12bf260978Sdanielk1977 **
13bf260978Sdanielk1977 ** This file contains code that modified the OS layer in order to simulate
14bf260978Sdanielk1977 ** different device types (by overriding the return values of the
15bf260978Sdanielk1977 ** xDeviceCharacteristics() and xSectorSize() methods).
16*822a5162Sdanielk1977 **
17*822a5162Sdanielk1977 ** $Id: test_devsym.c,v 1.4 2008/05/16 04:51:55 danielk1977 Exp $
18bf260978Sdanielk1977 */
19bf260978Sdanielk1977 #if SQLITE_TEST          /* This file is used for testing only */
20bf260978Sdanielk1977 
21fb80d20aSmlcreech #include "sqlite3.h"
22bf260978Sdanielk1977 #include "sqliteInt.h"
23bf260978Sdanielk1977 
24bf260978Sdanielk1977 /*
25bf260978Sdanielk1977 ** Maximum pathname length supported by the devsym backend.
26bf260978Sdanielk1977 */
27bf260978Sdanielk1977 #define DEVSYM_MAX_PATHNAME 512
28bf260978Sdanielk1977 
29bf260978Sdanielk1977 /*
30bf260978Sdanielk1977 ** Name used to identify this VFS.
31bf260978Sdanielk1977 */
32bf260978Sdanielk1977 #define DEVSYM_VFS_NAME "devsym"
33bf260978Sdanielk1977 
34bf260978Sdanielk1977 typedef struct devsym_file devsym_file;
35bf260978Sdanielk1977 struct devsym_file {
36bf260978Sdanielk1977   sqlite3_file base;
37bf260978Sdanielk1977   sqlite3_file *pReal;
38bf260978Sdanielk1977 };
39bf260978Sdanielk1977 
40bf260978Sdanielk1977 /*
41bf260978Sdanielk1977 ** Method declarations for devsym_file.
42bf260978Sdanielk1977 */
43bf260978Sdanielk1977 static int devsymClose(sqlite3_file*);
44bf260978Sdanielk1977 static int devsymRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
45bf260978Sdanielk1977 static int devsymWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
46bf260978Sdanielk1977 static int devsymTruncate(sqlite3_file*, sqlite3_int64 size);
47bf260978Sdanielk1977 static int devsymSync(sqlite3_file*, int flags);
48bf260978Sdanielk1977 static int devsymFileSize(sqlite3_file*, sqlite3_int64 *pSize);
49bf260978Sdanielk1977 static int devsymLock(sqlite3_file*, int);
50bf260978Sdanielk1977 static int devsymUnlock(sqlite3_file*, int);
51bf260978Sdanielk1977 static int devsymCheckReservedLock(sqlite3_file*);
52bf260978Sdanielk1977 static int devsymFileControl(sqlite3_file*, int op, void *pArg);
53bf260978Sdanielk1977 static int devsymSectorSize(sqlite3_file*);
54bf260978Sdanielk1977 static int devsymDeviceCharacteristics(sqlite3_file*);
55bf260978Sdanielk1977 
56bf260978Sdanielk1977 /*
57bf260978Sdanielk1977 ** Method declarations for devsym_vfs.
58bf260978Sdanielk1977 */
59bf260978Sdanielk1977 static int devsymOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
60bf260978Sdanielk1977 static int devsymDelete(sqlite3_vfs*, const char *zName, int syncDir);
61bf260978Sdanielk1977 static int devsymAccess(sqlite3_vfs*, const char *zName, int flags);
62bf260978Sdanielk1977 static int devsymGetTempName(sqlite3_vfs*, int nOut, char *zOut);
63bf260978Sdanielk1977 static int devsymFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
64bf260978Sdanielk1977 static void *devsymDlOpen(sqlite3_vfs*, const char *zFilename);
65bf260978Sdanielk1977 static void devsymDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
66bf260978Sdanielk1977 static void *devsymDlSym(sqlite3_vfs*,void*, const char *zSymbol);
67bf260978Sdanielk1977 static void devsymDlClose(sqlite3_vfs*, void*);
68bf260978Sdanielk1977 static int devsymRandomness(sqlite3_vfs*, int nByte, char *zOut);
69bf260978Sdanielk1977 static int devsymSleep(sqlite3_vfs*, int microseconds);
70bf260978Sdanielk1977 static int devsymCurrentTime(sqlite3_vfs*, double*);
71bf260978Sdanielk1977 
72bf260978Sdanielk1977 static sqlite3_vfs devsym_vfs = {
73bf260978Sdanielk1977   1,                     /* iVersion */
74bf260978Sdanielk1977   sizeof(devsym_file),      /* szOsFile */
75bf260978Sdanielk1977   DEVSYM_MAX_PATHNAME,      /* mxPathname */
76bf260978Sdanielk1977   0,                     /* pNext */
77bf260978Sdanielk1977   DEVSYM_VFS_NAME,          /* zName */
78bf260978Sdanielk1977   0,                     /* pAppData */
79bf260978Sdanielk1977   devsymOpen,               /* xOpen */
80bf260978Sdanielk1977   devsymDelete,             /* xDelete */
81bf260978Sdanielk1977   devsymAccess,             /* xAccess */
82bf260978Sdanielk1977   devsymGetTempName,        /* xGetTempName */
83bf260978Sdanielk1977   devsymFullPathname,       /* xFullPathname */
84bf260978Sdanielk1977   devsymDlOpen,             /* xDlOpen */
85bf260978Sdanielk1977   devsymDlError,            /* xDlError */
86bf260978Sdanielk1977   devsymDlSym,              /* xDlSym */
87bf260978Sdanielk1977   devsymDlClose,            /* xDlClose */
88bf260978Sdanielk1977   devsymRandomness,         /* xRandomness */
89bf260978Sdanielk1977   devsymSleep,              /* xSleep */
90bf260978Sdanielk1977   devsymCurrentTime         /* xCurrentTime */
91bf260978Sdanielk1977 };
92bf260978Sdanielk1977 
93bf260978Sdanielk1977 static sqlite3_io_methods devsym_io_methods = {
94bf260978Sdanielk1977   1,                            /* iVersion */
95bf260978Sdanielk1977   devsymClose,                      /* xClose */
96bf260978Sdanielk1977   devsymRead,                       /* xRead */
97bf260978Sdanielk1977   devsymWrite,                      /* xWrite */
98bf260978Sdanielk1977   devsymTruncate,                   /* xTruncate */
99bf260978Sdanielk1977   devsymSync,                       /* xSync */
100bf260978Sdanielk1977   devsymFileSize,                   /* xFileSize */
101bf260978Sdanielk1977   devsymLock,                       /* xLock */
102bf260978Sdanielk1977   devsymUnlock,                     /* xUnlock */
103bf260978Sdanielk1977   devsymCheckReservedLock,          /* xCheckReservedLock */
104bf260978Sdanielk1977   devsymFileControl,                /* xFileControl */
105bf260978Sdanielk1977   devsymSectorSize,                 /* xSectorSize */
106bf260978Sdanielk1977   devsymDeviceCharacteristics       /* xDeviceCharacteristics */
107bf260978Sdanielk1977 };
108bf260978Sdanielk1977 
109bf260978Sdanielk1977 struct DevsymGlobal {
110bf260978Sdanielk1977   sqlite3_vfs *pVfs;
111bf260978Sdanielk1977   int iDeviceChar;
112bf260978Sdanielk1977   int iSectorSize;
113bf260978Sdanielk1977 };
114bf260978Sdanielk1977 struct DevsymGlobal g = {0, 0, 512};
115bf260978Sdanielk1977 
116bf260978Sdanielk1977 /*
117bf260978Sdanielk1977 ** Close an devsym-file.
118bf260978Sdanielk1977 */
119bf260978Sdanielk1977 static int devsymClose(sqlite3_file *pFile){
120bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
121bf260978Sdanielk1977   return sqlite3OsClose(p->pReal);
122bf260978Sdanielk1977 }
123bf260978Sdanielk1977 
124bf260978Sdanielk1977 /*
125bf260978Sdanielk1977 ** Read data from an devsym-file.
126bf260978Sdanielk1977 */
127bf260978Sdanielk1977 static int devsymRead(
128bf260978Sdanielk1977   sqlite3_file *pFile,
129bf260978Sdanielk1977   void *zBuf,
130bf260978Sdanielk1977   int iAmt,
131bf260978Sdanielk1977   sqlite_int64 iOfst
132bf260978Sdanielk1977 ){
133bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
134bf260978Sdanielk1977   return sqlite3OsRead(p->pReal, zBuf, iAmt, iOfst);
135bf260978Sdanielk1977 }
136bf260978Sdanielk1977 
137bf260978Sdanielk1977 /*
138bf260978Sdanielk1977 ** Write data to an devsym-file.
139bf260978Sdanielk1977 */
140bf260978Sdanielk1977 static int devsymWrite(
141bf260978Sdanielk1977   sqlite3_file *pFile,
142bf260978Sdanielk1977   const void *zBuf,
143bf260978Sdanielk1977   int iAmt,
144bf260978Sdanielk1977   sqlite_int64 iOfst
145bf260978Sdanielk1977 ){
146bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
147bf260978Sdanielk1977   return sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst);
148bf260978Sdanielk1977 }
149bf260978Sdanielk1977 
150bf260978Sdanielk1977 /*
151bf260978Sdanielk1977 ** Truncate an devsym-file.
152bf260978Sdanielk1977 */
153bf260978Sdanielk1977 static int devsymTruncate(sqlite3_file *pFile, sqlite_int64 size){
154bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
155bf260978Sdanielk1977   return sqlite3OsTruncate(p->pReal, size);
156bf260978Sdanielk1977 }
157bf260978Sdanielk1977 
158bf260978Sdanielk1977 /*
159bf260978Sdanielk1977 ** Sync an devsym-file.
160bf260978Sdanielk1977 */
161bf260978Sdanielk1977 static int devsymSync(sqlite3_file *pFile, int flags){
162bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
163bf260978Sdanielk1977   return sqlite3OsSync(p->pReal, flags);
164bf260978Sdanielk1977 }
165bf260978Sdanielk1977 
166bf260978Sdanielk1977 /*
167bf260978Sdanielk1977 ** Return the current file-size of an devsym-file.
168bf260978Sdanielk1977 */
169bf260978Sdanielk1977 static int devsymFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
170bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
171bf260978Sdanielk1977   return sqlite3OsFileSize(p->pReal, pSize);
172bf260978Sdanielk1977 }
173bf260978Sdanielk1977 
174bf260978Sdanielk1977 /*
175bf260978Sdanielk1977 ** Lock an devsym-file.
176bf260978Sdanielk1977 */
177bf260978Sdanielk1977 static int devsymLock(sqlite3_file *pFile, int eLock){
178bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
179bf260978Sdanielk1977   return sqlite3OsLock(p->pReal, eLock);
180bf260978Sdanielk1977 }
181bf260978Sdanielk1977 
182bf260978Sdanielk1977 /*
183bf260978Sdanielk1977 ** Unlock an devsym-file.
184bf260978Sdanielk1977 */
185bf260978Sdanielk1977 static int devsymUnlock(sqlite3_file *pFile, int eLock){
186bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
187bf260978Sdanielk1977   return sqlite3OsUnlock(p->pReal, eLock);
188bf260978Sdanielk1977 }
189bf260978Sdanielk1977 
190bf260978Sdanielk1977 /*
191bf260978Sdanielk1977 ** Check if another file-handle holds a RESERVED lock on an devsym-file.
192bf260978Sdanielk1977 */
193bf260978Sdanielk1977 static int devsymCheckReservedLock(sqlite3_file *pFile){
194bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
195bf260978Sdanielk1977   return sqlite3OsCheckReservedLock(p->pReal);
196bf260978Sdanielk1977 }
197bf260978Sdanielk1977 
198bf260978Sdanielk1977 /*
199bf260978Sdanielk1977 ** File control method. For custom operations on an devsym-file.
200bf260978Sdanielk1977 */
201bf260978Sdanielk1977 static int devsymFileControl(sqlite3_file *pFile, int op, void *pArg){
202bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
203bf260978Sdanielk1977   return sqlite3OsFileControl(p->pReal, op, pArg);
204bf260978Sdanielk1977 }
205bf260978Sdanielk1977 
206bf260978Sdanielk1977 /*
207bf260978Sdanielk1977 ** Return the sector-size in bytes for an devsym-file.
208bf260978Sdanielk1977 */
209bf260978Sdanielk1977 static int devsymSectorSize(sqlite3_file *pFile){
210bf260978Sdanielk1977   return g.iSectorSize;
211bf260978Sdanielk1977 }
212bf260978Sdanielk1977 
213bf260978Sdanielk1977 /*
214bf260978Sdanielk1977 ** Return the device characteristic flags supported by an devsym-file.
215bf260978Sdanielk1977 */
216bf260978Sdanielk1977 static int devsymDeviceCharacteristics(sqlite3_file *pFile){
217bf260978Sdanielk1977   return g.iDeviceChar;
218bf260978Sdanielk1977 }
219bf260978Sdanielk1977 
220bf260978Sdanielk1977 /*
221bf260978Sdanielk1977 ** Open an devsym file handle.
222bf260978Sdanielk1977 */
223bf260978Sdanielk1977 static int devsymOpen(
224bf260978Sdanielk1977   sqlite3_vfs *pVfs,
225bf260978Sdanielk1977   const char *zName,
226bf260978Sdanielk1977   sqlite3_file *pFile,
227bf260978Sdanielk1977   int flags,
228bf260978Sdanielk1977   int *pOutFlags
229bf260978Sdanielk1977 ){
230bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
231bf260978Sdanielk1977   pFile->pMethods = &devsym_io_methods;
232bf260978Sdanielk1977   p->pReal = (sqlite3_file *)&p[1];
233bf260978Sdanielk1977   return sqlite3OsOpen(g.pVfs, zName, p->pReal, flags, pOutFlags);
234bf260978Sdanielk1977 }
235bf260978Sdanielk1977 
236bf260978Sdanielk1977 /*
237bf260978Sdanielk1977 ** Delete the file located at zPath. If the dirSync argument is true,
238bf260978Sdanielk1977 ** ensure the file-system modifications are synced to disk before
239bf260978Sdanielk1977 ** returning.
240bf260978Sdanielk1977 */
241bf260978Sdanielk1977 static int devsymDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
242bf260978Sdanielk1977   return sqlite3OsDelete(g.pVfs, zPath, dirSync);
243bf260978Sdanielk1977 }
244bf260978Sdanielk1977 
245bf260978Sdanielk1977 /*
246bf260978Sdanielk1977 ** Test for access permissions. Return true if the requested permission
247bf260978Sdanielk1977 ** is available, or false otherwise.
248bf260978Sdanielk1977 */
249bf260978Sdanielk1977 static int devsymAccess(sqlite3_vfs *pVfs, const char *zPath, int flags){
250bf260978Sdanielk1977   return sqlite3OsAccess(g.pVfs, zPath, flags);
251bf260978Sdanielk1977 }
252bf260978Sdanielk1977 
253bf260978Sdanielk1977 /*
254bf260978Sdanielk1977 ** Populate buffer zBufOut with a pathname suitable for use as a
255bf260978Sdanielk1977 ** temporary file. zBufOut is guaranteed to point to a buffer of
256bf260978Sdanielk1977 ** at least (DEVSYM_MAX_PATHNAME+1) bytes.
257bf260978Sdanielk1977 */
258bf260978Sdanielk1977 static int devsymGetTempName(sqlite3_vfs *pVfs, int nOut, char *zBufOut){
259bf260978Sdanielk1977   return sqlite3OsGetTempname(g.pVfs, nOut, zBufOut);
260bf260978Sdanielk1977 }
261bf260978Sdanielk1977 
262bf260978Sdanielk1977 /*
263bf260978Sdanielk1977 ** Populate buffer zOut with the full canonical pathname corresponding
264bf260978Sdanielk1977 ** to the pathname in zPath. zOut is guaranteed to point to a buffer
265bf260978Sdanielk1977 ** of at least (DEVSYM_MAX_PATHNAME+1) bytes.
266bf260978Sdanielk1977 */
267bf260978Sdanielk1977 static int devsymFullPathname(
268bf260978Sdanielk1977   sqlite3_vfs *pVfs,
269bf260978Sdanielk1977   const char *zPath,
270bf260978Sdanielk1977   int nOut,
271bf260978Sdanielk1977   char *zOut
272bf260978Sdanielk1977 ){
273bf260978Sdanielk1977   return sqlite3OsFullPathname(g.pVfs, zPath, nOut, zOut);
274bf260978Sdanielk1977 }
275bf260978Sdanielk1977 
276bf260978Sdanielk1977 /*
277bf260978Sdanielk1977 ** Open the dynamic library located at zPath and return a handle.
278bf260978Sdanielk1977 */
279bf260978Sdanielk1977 static void *devsymDlOpen(sqlite3_vfs *pVfs, const char *zPath){
280bf260978Sdanielk1977   return sqlite3OsDlOpen(g.pVfs, zPath);
281bf260978Sdanielk1977 }
282bf260978Sdanielk1977 
283bf260978Sdanielk1977 /*
284bf260978Sdanielk1977 ** Populate the buffer zErrMsg (size nByte bytes) with a human readable
285bf260978Sdanielk1977 ** utf-8 string describing the most recent error encountered associated
286bf260978Sdanielk1977 ** with dynamic libraries.
287bf260978Sdanielk1977 */
288bf260978Sdanielk1977 static void devsymDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
289bf260978Sdanielk1977   sqlite3OsDlError(g.pVfs, nByte, zErrMsg);
290bf260978Sdanielk1977 }
291bf260978Sdanielk1977 
292bf260978Sdanielk1977 /*
293bf260978Sdanielk1977 ** Return a pointer to the symbol zSymbol in the dynamic library pHandle.
294bf260978Sdanielk1977 */
295bf260978Sdanielk1977 static void *devsymDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){
296bf260978Sdanielk1977   return sqlite3OsDlSym(g.pVfs, pHandle, zSymbol);
297bf260978Sdanielk1977 }
298bf260978Sdanielk1977 
299bf260978Sdanielk1977 /*
300bf260978Sdanielk1977 ** Close the dynamic library handle pHandle.
301bf260978Sdanielk1977 */
302bf260978Sdanielk1977 static void devsymDlClose(sqlite3_vfs *pVfs, void *pHandle){
303bf260978Sdanielk1977   sqlite3OsDlClose(g.pVfs, pHandle);
304bf260978Sdanielk1977 }
305bf260978Sdanielk1977 
306bf260978Sdanielk1977 /*
307bf260978Sdanielk1977 ** Populate the buffer pointed to by zBufOut with nByte bytes of
308bf260978Sdanielk1977 ** random data.
309bf260978Sdanielk1977 */
310bf260978Sdanielk1977 static int devsymRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
311bf260978Sdanielk1977   return sqlite3OsRandomness(g.pVfs, nByte, zBufOut);
312bf260978Sdanielk1977 }
313bf260978Sdanielk1977 
314bf260978Sdanielk1977 /*
315bf260978Sdanielk1977 ** Sleep for nMicro microseconds. Return the number of microseconds
316bf260978Sdanielk1977 ** actually slept.
317bf260978Sdanielk1977 */
318bf260978Sdanielk1977 static int devsymSleep(sqlite3_vfs *pVfs, int nMicro){
319bf260978Sdanielk1977   return sqlite3OsSleep(g.pVfs, nMicro);
320bf260978Sdanielk1977 }
321bf260978Sdanielk1977 
322bf260978Sdanielk1977 /*
323bf260978Sdanielk1977 ** Return the current time as a Julian Day number in *pTimeOut.
324bf260978Sdanielk1977 */
325bf260978Sdanielk1977 static int devsymCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
326bf260978Sdanielk1977   return sqlite3OsCurrentTime(g.pVfs, pTimeOut);
327bf260978Sdanielk1977 }
328bf260978Sdanielk1977 
329bf260978Sdanielk1977 /*
330bf260978Sdanielk1977 ** This procedure registers the devsym vfs with SQLite. If the argument is
331bf260978Sdanielk1977 ** true, the devsym vfs becomes the new default vfs. It is the only publicly
332bf260978Sdanielk1977 ** available function in this file.
333bf260978Sdanielk1977 */
334bf260978Sdanielk1977 void devsym_register(int iDeviceChar, int iSectorSize){
335bf260978Sdanielk1977   if( g.pVfs==0 ){
336bf260978Sdanielk1977     g.pVfs = sqlite3_vfs_find(0);
337bf260978Sdanielk1977     devsym_vfs.szOsFile += g.pVfs->szOsFile;
338bf260978Sdanielk1977     sqlite3_vfs_register(&devsym_vfs, 0);
339bf260978Sdanielk1977   }
340bf260978Sdanielk1977   if( iDeviceChar>=0 ){
341bf260978Sdanielk1977     g.iDeviceChar = iDeviceChar;
342bf260978Sdanielk1977   }
343bf260978Sdanielk1977   if( iSectorSize>=0 ){
344bf260978Sdanielk1977     g.iSectorSize = iSectorSize;
345bf260978Sdanielk1977   }
346bf260978Sdanielk1977 }
347bf260978Sdanielk1977 
348bf260978Sdanielk1977 #endif
349