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