xref: /sqlite-3.40.0/src/test_devsym.c (revision 73b64e4d)
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).
16bf260978Sdanielk1977 */
17bf260978Sdanielk1977 #if SQLITE_TEST          /* This file is used for testing only */
18bf260978Sdanielk1977 
19fb80d20aSmlcreech #include "sqlite3.h"
20bf260978Sdanielk1977 #include "sqliteInt.h"
21bf260978Sdanielk1977 
22bf260978Sdanielk1977 /*
23bf260978Sdanielk1977 ** Maximum pathname length supported by the devsym backend.
24bf260978Sdanielk1977 */
25bf260978Sdanielk1977 #define DEVSYM_MAX_PATHNAME 512
26bf260978Sdanielk1977 
27bf260978Sdanielk1977 /*
28bf260978Sdanielk1977 ** Name used to identify this VFS.
29bf260978Sdanielk1977 */
30bf260978Sdanielk1977 #define DEVSYM_VFS_NAME "devsym"
31bf260978Sdanielk1977 
32bf260978Sdanielk1977 typedef struct devsym_file devsym_file;
33bf260978Sdanielk1977 struct devsym_file {
34bf260978Sdanielk1977   sqlite3_file base;
35bf260978Sdanielk1977   sqlite3_file *pReal;
36bf260978Sdanielk1977 };
37bf260978Sdanielk1977 
38bf260978Sdanielk1977 /*
39bf260978Sdanielk1977 ** Method declarations for devsym_file.
40bf260978Sdanielk1977 */
41bf260978Sdanielk1977 static int devsymClose(sqlite3_file*);
42bf260978Sdanielk1977 static int devsymRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
43bf260978Sdanielk1977 static int devsymWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
44bf260978Sdanielk1977 static int devsymTruncate(sqlite3_file*, sqlite3_int64 size);
45bf260978Sdanielk1977 static int devsymSync(sqlite3_file*, int flags);
46bf260978Sdanielk1977 static int devsymFileSize(sqlite3_file*, sqlite3_int64 *pSize);
47bf260978Sdanielk1977 static int devsymLock(sqlite3_file*, int);
48bf260978Sdanielk1977 static int devsymUnlock(sqlite3_file*, int);
49861f7456Sdanielk1977 static int devsymCheckReservedLock(sqlite3_file*, int *);
50bf260978Sdanielk1977 static int devsymFileControl(sqlite3_file*, int op, void *pArg);
51bf260978Sdanielk1977 static int devsymSectorSize(sqlite3_file*);
52bf260978Sdanielk1977 static int devsymDeviceCharacteristics(sqlite3_file*);
53365e2d25Sdrh static int devsymShmOpen(sqlite3_file*);
54365e2d25Sdrh static int devsymShmSize(sqlite3_file*,int,int*);
555939f443Sdrh static int devsymShmGet(sqlite3_file*,int,int*,volatile void**);
56365e2d25Sdrh static int devsymShmRelease(sqlite3_file*);
57*73b64e4dSdrh static int devsymShmLock(sqlite3_file*,int,int,int);
58286a2884Sdrh static void devsymShmBarrier(sqlite3_file*);
59365e2d25Sdrh static int devsymShmClose(sqlite3_file*,int);
60bf260978Sdanielk1977 
61bf260978Sdanielk1977 /*
62bf260978Sdanielk1977 ** Method declarations for devsym_vfs.
63bf260978Sdanielk1977 */
64bf260978Sdanielk1977 static int devsymOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
65bf260978Sdanielk1977 static int devsymDelete(sqlite3_vfs*, const char *zName, int syncDir);
66861f7456Sdanielk1977 static int devsymAccess(sqlite3_vfs*, const char *zName, int flags, int *);
67bf260978Sdanielk1977 static int devsymFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
6875998ab3Sshane #ifndef SQLITE_OMIT_LOAD_EXTENSION
69bf260978Sdanielk1977 static void *devsymDlOpen(sqlite3_vfs*, const char *zFilename);
70bf260978Sdanielk1977 static void devsymDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
71ec1724e8Sdrh static void (*devsymDlSym(sqlite3_vfs*,void*, const char *zSymbol))(void);
72bf260978Sdanielk1977 static void devsymDlClose(sqlite3_vfs*, void*);
7375998ab3Sshane #endif /* SQLITE_OMIT_LOAD_EXTENSION */
74bf260978Sdanielk1977 static int devsymRandomness(sqlite3_vfs*, int nByte, char *zOut);
75bf260978Sdanielk1977 static int devsymSleep(sqlite3_vfs*, int microseconds);
76bf260978Sdanielk1977 static int devsymCurrentTime(sqlite3_vfs*, double*);
77bf260978Sdanielk1977 
78bf260978Sdanielk1977 static sqlite3_vfs devsym_vfs = {
796ddb4bf9Sdan   2,                     /* iVersion */
80bf260978Sdanielk1977   sizeof(devsym_file),      /* szOsFile */
81bf260978Sdanielk1977   DEVSYM_MAX_PATHNAME,      /* mxPathname */
82bf260978Sdanielk1977   0,                     /* pNext */
83bf260978Sdanielk1977   DEVSYM_VFS_NAME,          /* zName */
84bf260978Sdanielk1977   0,                     /* pAppData */
85bf260978Sdanielk1977   devsymOpen,               /* xOpen */
86bf260978Sdanielk1977   devsymDelete,             /* xDelete */
87bf260978Sdanielk1977   devsymAccess,             /* xAccess */
88bf260978Sdanielk1977   devsymFullPathname,       /* xFullPathname */
8975998ab3Sshane #ifndef SQLITE_OMIT_LOAD_EXTENSION
90bf260978Sdanielk1977   devsymDlOpen,             /* xDlOpen */
91bf260978Sdanielk1977   devsymDlError,            /* xDlError */
92bf260978Sdanielk1977   devsymDlSym,              /* xDlSym */
93bf260978Sdanielk1977   devsymDlClose,            /* xDlClose */
9475998ab3Sshane #else
9575998ab3Sshane   0,                        /* xDlOpen */
9675998ab3Sshane   0,                        /* xDlError */
9775998ab3Sshane   0,                        /* xDlSym */
9875998ab3Sshane   0,                        /* xDlClose */
9975998ab3Sshane #endif /* SQLITE_OMIT_LOAD_EXTENSION */
100bf260978Sdanielk1977   devsymRandomness,         /* xRandomness */
101bf260978Sdanielk1977   devsymSleep,              /* xSleep */
102f2424c52Sdrh   devsymCurrentTime,        /* xCurrentTime */
1036ddb4bf9Sdan   0,                        /* xGetLastError */
104d9e5c4f6Sdrh   0,                        /* xRename */
105d9e5c4f6Sdrh   0                         /* xCurrentTimeInt64 */
106bf260978Sdanielk1977 };
107bf260978Sdanielk1977 
108bf260978Sdanielk1977 static sqlite3_io_methods devsym_io_methods = {
109d9e5c4f6Sdrh   2,                                /* iVersion */
110bf260978Sdanielk1977   devsymClose,                      /* xClose */
111bf260978Sdanielk1977   devsymRead,                       /* xRead */
112bf260978Sdanielk1977   devsymWrite,                      /* xWrite */
113bf260978Sdanielk1977   devsymTruncate,                   /* xTruncate */
114bf260978Sdanielk1977   devsymSync,                       /* xSync */
115bf260978Sdanielk1977   devsymFileSize,                   /* xFileSize */
116bf260978Sdanielk1977   devsymLock,                       /* xLock */
117bf260978Sdanielk1977   devsymUnlock,                     /* xUnlock */
118bf260978Sdanielk1977   devsymCheckReservedLock,          /* xCheckReservedLock */
119bf260978Sdanielk1977   devsymFileControl,                /* xFileControl */
120bf260978Sdanielk1977   devsymSectorSize,                 /* xSectorSize */
121d9e5c4f6Sdrh   devsymDeviceCharacteristics,      /* xDeviceCharacteristics */
122365e2d25Sdrh   devsymShmOpen,                    /* xShmOpen */
123365e2d25Sdrh   devsymShmSize,                    /* xShmSize */
124365e2d25Sdrh   devsymShmGet,                     /* xShmGet */
125365e2d25Sdrh   devsymShmRelease,                 /* xShmRelease */
126365e2d25Sdrh   devsymShmLock,                    /* xShmLock */
127286a2884Sdrh   devsymShmBarrier,                 /* xShmBarrier */
128365e2d25Sdrh   devsymShmClose                    /* xShmClose */
129bf260978Sdanielk1977 };
130bf260978Sdanielk1977 
131bf260978Sdanielk1977 struct DevsymGlobal {
132bf260978Sdanielk1977   sqlite3_vfs *pVfs;
133bf260978Sdanielk1977   int iDeviceChar;
134bf260978Sdanielk1977   int iSectorSize;
135bf260978Sdanielk1977 };
136bf260978Sdanielk1977 struct DevsymGlobal g = {0, 0, 512};
137bf260978Sdanielk1977 
138bf260978Sdanielk1977 /*
139bf260978Sdanielk1977 ** Close an devsym-file.
140bf260978Sdanielk1977 */
141bf260978Sdanielk1977 static int devsymClose(sqlite3_file *pFile){
142bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
143bf260978Sdanielk1977   return sqlite3OsClose(p->pReal);
144bf260978Sdanielk1977 }
145bf260978Sdanielk1977 
146bf260978Sdanielk1977 /*
147bf260978Sdanielk1977 ** Read data from an devsym-file.
148bf260978Sdanielk1977 */
149bf260978Sdanielk1977 static int devsymRead(
150bf260978Sdanielk1977   sqlite3_file *pFile,
151bf260978Sdanielk1977   void *zBuf,
152bf260978Sdanielk1977   int iAmt,
153bf260978Sdanielk1977   sqlite_int64 iOfst
154bf260978Sdanielk1977 ){
155bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
156bf260978Sdanielk1977   return sqlite3OsRead(p->pReal, zBuf, iAmt, iOfst);
157bf260978Sdanielk1977 }
158bf260978Sdanielk1977 
159bf260978Sdanielk1977 /*
160bf260978Sdanielk1977 ** Write data to an devsym-file.
161bf260978Sdanielk1977 */
162bf260978Sdanielk1977 static int devsymWrite(
163bf260978Sdanielk1977   sqlite3_file *pFile,
164bf260978Sdanielk1977   const void *zBuf,
165bf260978Sdanielk1977   int iAmt,
166bf260978Sdanielk1977   sqlite_int64 iOfst
167bf260978Sdanielk1977 ){
168bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
169bf260978Sdanielk1977   return sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst);
170bf260978Sdanielk1977 }
171bf260978Sdanielk1977 
172bf260978Sdanielk1977 /*
173bf260978Sdanielk1977 ** Truncate an devsym-file.
174bf260978Sdanielk1977 */
175bf260978Sdanielk1977 static int devsymTruncate(sqlite3_file *pFile, sqlite_int64 size){
176bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
177bf260978Sdanielk1977   return sqlite3OsTruncate(p->pReal, size);
178bf260978Sdanielk1977 }
179bf260978Sdanielk1977 
180bf260978Sdanielk1977 /*
181bf260978Sdanielk1977 ** Sync an devsym-file.
182bf260978Sdanielk1977 */
183bf260978Sdanielk1977 static int devsymSync(sqlite3_file *pFile, int flags){
184bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
185bf260978Sdanielk1977   return sqlite3OsSync(p->pReal, flags);
186bf260978Sdanielk1977 }
187bf260978Sdanielk1977 
188bf260978Sdanielk1977 /*
189bf260978Sdanielk1977 ** Return the current file-size of an devsym-file.
190bf260978Sdanielk1977 */
191bf260978Sdanielk1977 static int devsymFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
192bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
193bf260978Sdanielk1977   return sqlite3OsFileSize(p->pReal, pSize);
194bf260978Sdanielk1977 }
195bf260978Sdanielk1977 
196bf260978Sdanielk1977 /*
197bf260978Sdanielk1977 ** Lock an devsym-file.
198bf260978Sdanielk1977 */
199bf260978Sdanielk1977 static int devsymLock(sqlite3_file *pFile, int eLock){
200bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
201bf260978Sdanielk1977   return sqlite3OsLock(p->pReal, eLock);
202bf260978Sdanielk1977 }
203bf260978Sdanielk1977 
204bf260978Sdanielk1977 /*
205bf260978Sdanielk1977 ** Unlock an devsym-file.
206bf260978Sdanielk1977 */
207bf260978Sdanielk1977 static int devsymUnlock(sqlite3_file *pFile, int eLock){
208bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
209bf260978Sdanielk1977   return sqlite3OsUnlock(p->pReal, eLock);
210bf260978Sdanielk1977 }
211bf260978Sdanielk1977 
212bf260978Sdanielk1977 /*
213bf260978Sdanielk1977 ** Check if another file-handle holds a RESERVED lock on an devsym-file.
214bf260978Sdanielk1977 */
215861f7456Sdanielk1977 static int devsymCheckReservedLock(sqlite3_file *pFile, int *pResOut){
216bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
217861f7456Sdanielk1977   return sqlite3OsCheckReservedLock(p->pReal, pResOut);
218bf260978Sdanielk1977 }
219bf260978Sdanielk1977 
220bf260978Sdanielk1977 /*
221bf260978Sdanielk1977 ** File control method. For custom operations on an devsym-file.
222bf260978Sdanielk1977 */
223bf260978Sdanielk1977 static int devsymFileControl(sqlite3_file *pFile, int op, void *pArg){
224bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
225bf260978Sdanielk1977   return sqlite3OsFileControl(p->pReal, op, pArg);
226bf260978Sdanielk1977 }
227bf260978Sdanielk1977 
228bf260978Sdanielk1977 /*
229bf260978Sdanielk1977 ** Return the sector-size in bytes for an devsym-file.
230bf260978Sdanielk1977 */
231bf260978Sdanielk1977 static int devsymSectorSize(sqlite3_file *pFile){
232bf260978Sdanielk1977   return g.iSectorSize;
233bf260978Sdanielk1977 }
234bf260978Sdanielk1977 
235bf260978Sdanielk1977 /*
236bf260978Sdanielk1977 ** Return the device characteristic flags supported by an devsym-file.
237bf260978Sdanielk1977 */
238bf260978Sdanielk1977 static int devsymDeviceCharacteristics(sqlite3_file *pFile){
239bf260978Sdanielk1977   return g.iDeviceChar;
240bf260978Sdanielk1977 }
241bf260978Sdanielk1977 
242bf260978Sdanielk1977 /*
243365e2d25Sdrh ** Shared-memory methods are all pass-thrus.
244365e2d25Sdrh */
245365e2d25Sdrh static int devsymShmOpen(sqlite3_file *pFile){
246365e2d25Sdrh   devsym_file *p = (devsym_file *)pFile;
247365e2d25Sdrh   return sqlite3OsShmOpen(p->pReal);
248365e2d25Sdrh }
249365e2d25Sdrh static int devsymShmSize(sqlite3_file *pFile, int reqSize, int *pSize){
250365e2d25Sdrh   devsym_file *p = (devsym_file *)pFile;
251365e2d25Sdrh   return sqlite3OsShmSize(p->pReal, reqSize, pSize);
252365e2d25Sdrh }
2535939f443Sdrh static int devsymShmGet(
2545939f443Sdrh   sqlite3_file *pFile,
2555939f443Sdrh   int reqSz,
2565939f443Sdrh   int *pSize,
2575939f443Sdrh   void volatile **pp
2585939f443Sdrh ){
259365e2d25Sdrh   devsym_file *p = (devsym_file *)pFile;
260365e2d25Sdrh   return sqlite3OsShmGet(p->pReal, reqSz, pSize, pp);
261365e2d25Sdrh }
262365e2d25Sdrh static int devsymShmRelease(sqlite3_file *pFile){
263365e2d25Sdrh   devsym_file *p = (devsym_file *)pFile;
264365e2d25Sdrh   return sqlite3OsShmRelease(p->pReal);
265365e2d25Sdrh }
266*73b64e4dSdrh static int devsymShmLock(sqlite3_file *pFile, int ofst, int n, int flags){
267365e2d25Sdrh   devsym_file *p = (devsym_file *)pFile;
268*73b64e4dSdrh   return sqlite3OsShmLock(p->pReal, ofst, n, flags);
269365e2d25Sdrh }
270286a2884Sdrh static void devsymShmBarrier(sqlite3_file *pFile){
271286a2884Sdrh   devsym_file *p = (devsym_file *)pFile;
272286a2884Sdrh   sqlite3OsShmBarrier(p->pReal);
273286a2884Sdrh }
274365e2d25Sdrh static int devsymShmClose(sqlite3_file *pFile, int delFlag){
275365e2d25Sdrh   devsym_file *p = (devsym_file *)pFile;
276365e2d25Sdrh   return sqlite3OsShmClose(p->pReal, delFlag);
277365e2d25Sdrh }
278365e2d25Sdrh 
279365e2d25Sdrh 
280365e2d25Sdrh 
281365e2d25Sdrh /*
282bf260978Sdanielk1977 ** Open an devsym file handle.
283bf260978Sdanielk1977 */
284bf260978Sdanielk1977 static int devsymOpen(
285bf260978Sdanielk1977   sqlite3_vfs *pVfs,
286bf260978Sdanielk1977   const char *zName,
287bf260978Sdanielk1977   sqlite3_file *pFile,
288bf260978Sdanielk1977   int flags,
289bf260978Sdanielk1977   int *pOutFlags
290bf260978Sdanielk1977 ){
291755339ecSdanielk1977   int rc;
292bf260978Sdanielk1977   devsym_file *p = (devsym_file *)pFile;
293bf260978Sdanielk1977   p->pReal = (sqlite3_file *)&p[1];
294755339ecSdanielk1977   rc = sqlite3OsOpen(g.pVfs, zName, p->pReal, flags, pOutFlags);
295755339ecSdanielk1977   if( p->pReal->pMethods ){
296755339ecSdanielk1977     pFile->pMethods = &devsym_io_methods;
297755339ecSdanielk1977   }
298755339ecSdanielk1977   return rc;
299bf260978Sdanielk1977 }
300bf260978Sdanielk1977 
301bf260978Sdanielk1977 /*
302bf260978Sdanielk1977 ** Delete the file located at zPath. If the dirSync argument is true,
303bf260978Sdanielk1977 ** ensure the file-system modifications are synced to disk before
304bf260978Sdanielk1977 ** returning.
305bf260978Sdanielk1977 */
306bf260978Sdanielk1977 static int devsymDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
307bf260978Sdanielk1977   return sqlite3OsDelete(g.pVfs, zPath, dirSync);
308bf260978Sdanielk1977 }
309bf260978Sdanielk1977 
310bf260978Sdanielk1977 /*
311bf260978Sdanielk1977 ** Test for access permissions. Return true if the requested permission
312bf260978Sdanielk1977 ** is available, or false otherwise.
313bf260978Sdanielk1977 */
314861f7456Sdanielk1977 static int devsymAccess(
315861f7456Sdanielk1977   sqlite3_vfs *pVfs,
316861f7456Sdanielk1977   const char *zPath,
317861f7456Sdanielk1977   int flags,
318861f7456Sdanielk1977   int *pResOut
319861f7456Sdanielk1977 ){
320861f7456Sdanielk1977   return sqlite3OsAccess(g.pVfs, zPath, flags, pResOut);
321bf260978Sdanielk1977 }
322bf260978Sdanielk1977 
323bf260978Sdanielk1977 /*
324bf260978Sdanielk1977 ** Populate buffer zOut with the full canonical pathname corresponding
325bf260978Sdanielk1977 ** to the pathname in zPath. zOut is guaranteed to point to a buffer
326bf260978Sdanielk1977 ** of at least (DEVSYM_MAX_PATHNAME+1) bytes.
327bf260978Sdanielk1977 */
328bf260978Sdanielk1977 static int devsymFullPathname(
329bf260978Sdanielk1977   sqlite3_vfs *pVfs,
330bf260978Sdanielk1977   const char *zPath,
331bf260978Sdanielk1977   int nOut,
332bf260978Sdanielk1977   char *zOut
333bf260978Sdanielk1977 ){
334bf260978Sdanielk1977   return sqlite3OsFullPathname(g.pVfs, zPath, nOut, zOut);
335bf260978Sdanielk1977 }
336bf260978Sdanielk1977 
33775998ab3Sshane #ifndef SQLITE_OMIT_LOAD_EXTENSION
338bf260978Sdanielk1977 /*
339bf260978Sdanielk1977 ** Open the dynamic library located at zPath and return a handle.
340bf260978Sdanielk1977 */
341bf260978Sdanielk1977 static void *devsymDlOpen(sqlite3_vfs *pVfs, const char *zPath){
342bf260978Sdanielk1977   return sqlite3OsDlOpen(g.pVfs, zPath);
343bf260978Sdanielk1977 }
344bf260978Sdanielk1977 
345bf260978Sdanielk1977 /*
346bf260978Sdanielk1977 ** Populate the buffer zErrMsg (size nByte bytes) with a human readable
347bf260978Sdanielk1977 ** utf-8 string describing the most recent error encountered associated
348bf260978Sdanielk1977 ** with dynamic libraries.
349bf260978Sdanielk1977 */
350bf260978Sdanielk1977 static void devsymDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
351bf260978Sdanielk1977   sqlite3OsDlError(g.pVfs, nByte, zErrMsg);
352bf260978Sdanielk1977 }
353bf260978Sdanielk1977 
354bf260978Sdanielk1977 /*
355bf260978Sdanielk1977 ** Return a pointer to the symbol zSymbol in the dynamic library pHandle.
356bf260978Sdanielk1977 */
357ec1724e8Sdrh static void (*devsymDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
358ec1724e8Sdrh   return sqlite3OsDlSym(g.pVfs, p, zSym);
359bf260978Sdanielk1977 }
360bf260978Sdanielk1977 
361bf260978Sdanielk1977 /*
362bf260978Sdanielk1977 ** Close the dynamic library handle pHandle.
363bf260978Sdanielk1977 */
364bf260978Sdanielk1977 static void devsymDlClose(sqlite3_vfs *pVfs, void *pHandle){
365bf260978Sdanielk1977   sqlite3OsDlClose(g.pVfs, pHandle);
366bf260978Sdanielk1977 }
36775998ab3Sshane #endif /* SQLITE_OMIT_LOAD_EXTENSION */
368bf260978Sdanielk1977 
369bf260978Sdanielk1977 /*
370bf260978Sdanielk1977 ** Populate the buffer pointed to by zBufOut with nByte bytes of
371bf260978Sdanielk1977 ** random data.
372bf260978Sdanielk1977 */
373bf260978Sdanielk1977 static int devsymRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
374bf260978Sdanielk1977   return sqlite3OsRandomness(g.pVfs, nByte, zBufOut);
375bf260978Sdanielk1977 }
376bf260978Sdanielk1977 
377bf260978Sdanielk1977 /*
378bf260978Sdanielk1977 ** Sleep for nMicro microseconds. Return the number of microseconds
379bf260978Sdanielk1977 ** actually slept.
380bf260978Sdanielk1977 */
381bf260978Sdanielk1977 static int devsymSleep(sqlite3_vfs *pVfs, int nMicro){
382bf260978Sdanielk1977   return sqlite3OsSleep(g.pVfs, nMicro);
383bf260978Sdanielk1977 }
384bf260978Sdanielk1977 
385bf260978Sdanielk1977 /*
386bf260978Sdanielk1977 ** Return the current time as a Julian Day number in *pTimeOut.
387bf260978Sdanielk1977 */
388bf260978Sdanielk1977 static int devsymCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
389b7e8ea20Sdrh   return g.pVfs->xCurrentTime(g.pVfs, pTimeOut);
390bf260978Sdanielk1977 }
391bf260978Sdanielk1977 
3926ddb4bf9Sdan 
393bf260978Sdanielk1977 /*
394bf260978Sdanielk1977 ** This procedure registers the devsym vfs with SQLite. If the argument is
395bf260978Sdanielk1977 ** true, the devsym vfs becomes the new default vfs. It is the only publicly
396bf260978Sdanielk1977 ** available function in this file.
397bf260978Sdanielk1977 */
398bf260978Sdanielk1977 void devsym_register(int iDeviceChar, int iSectorSize){
399bf260978Sdanielk1977   if( g.pVfs==0 ){
400bf260978Sdanielk1977     g.pVfs = sqlite3_vfs_find(0);
401bf260978Sdanielk1977     devsym_vfs.szOsFile += g.pVfs->szOsFile;
402bf260978Sdanielk1977     sqlite3_vfs_register(&devsym_vfs, 0);
403bf260978Sdanielk1977   }
404bf260978Sdanielk1977   if( iDeviceChar>=0 ){
405bf260978Sdanielk1977     g.iDeviceChar = iDeviceChar;
40647f18f72Sdrh   }else{
40747f18f72Sdrh     g.iDeviceChar = 0;
408bf260978Sdanielk1977   }
409bf260978Sdanielk1977   if( iSectorSize>=0 ){
410bf260978Sdanielk1977     g.iSectorSize = iSectorSize;
41147f18f72Sdrh   }else{
41247f18f72Sdrh     g.iSectorSize = 512;
413bf260978Sdanielk1977   }
414bf260978Sdanielk1977 }
415bf260978Sdanielk1977 
416bf260978Sdanielk1977 #endif
417