313 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			313 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | |
| <html><head>
 | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 | |
| <link href="../sqlite.css" rel="stylesheet">
 | |
| <title>OS Interface Object</title>
 | |
| <!-- path=../ -->
 | |
| </head>
 | |
| <body>
 | |
| <div class=nosearch>
 | |
| <a href="../index.html">
 | |
| <img class="logo" src="../images/sqlite370_banner.gif" alt="SQLite" border="0">
 | |
| </a>
 | |
| <div><!-- IE hack to prevent disappearing logo --></div>
 | |
| <div class="tagline desktoponly">
 | |
| Small. Fast. Reliable.<br>Choose any three.
 | |
| </div>
 | |
| <div class="menu mainmenu">
 | |
| <ul>
 | |
| <li><a href="../index.html">Home</a>
 | |
| <li class='mobileonly'><a href="javascript:void(0)" onclick='toggle_div("submenu")'>Menu</a>
 | |
| <li class='wideonly'><a href='../about.html'>About</a>
 | |
| <li class='desktoponly'><a href="../docs.html">Documentation</a>
 | |
| <li class='desktoponly'><a href="../download.html">Download</a>
 | |
| <li class='wideonly'><a href='../copyright.html'>License</a>
 | |
| <li class='desktoponly'><a href="../support.html">Support</a>
 | |
| <li class='desktoponly'><a href="../prosupport.html">Purchase</a>
 | |
| <li class='search' id='search_menubutton'>
 | |
| <a href="javascript:void(0)" onclick='toggle_search()'>Search</a>
 | |
| </ul>
 | |
| </div>
 | |
| <div class="menu submenu" id="submenu">
 | |
| <ul>
 | |
| <li><a href='../about.html'>About</a>
 | |
| <li><a href='../docs.html'>Documentation</a>
 | |
| <li><a href='../download.html'>Download</a>
 | |
| <li><a href='../support.html'>Support</a>
 | |
| <li><a href='../prosupport.html'>Purchase</a>
 | |
| </ul>
 | |
| </div>
 | |
| <div class="searchmenu" id="searchmenu">
 | |
| <form method="GET" action="../search">
 | |
| <select name="s" id="searchtype">
 | |
| <option value="d">Search Documentation</option>
 | |
| <option value="c">Search Changelog</option>
 | |
| </select>
 | |
| <input type="text" name="q" id="searchbox" value="">
 | |
| <input type="submit" value="Go">
 | |
| </form>
 | |
| </div>
 | |
| </div>
 | |
| <script>
 | |
| function toggle_div(nm) {
 | |
| var w = document.getElementById(nm);
 | |
| if( w.style.display=="block" ){
 | |
| w.style.display = "none";
 | |
| }else{
 | |
| w.style.display = "block";
 | |
| }
 | |
| }
 | |
| function toggle_search() {
 | |
| var w = document.getElementById("searchmenu");
 | |
| if( w.style.display=="block" ){
 | |
| w.style.display = "none";
 | |
| } else {
 | |
| w.style.display = "block";
 | |
| setTimeout(function(){
 | |
| document.getElementById("searchbox").focus()
 | |
| }, 30);
 | |
| }
 | |
| }
 | |
| function div_off(nm){document.getElementById(nm).style.display="none";}
 | |
| window.onbeforeunload = function(e){div_off("submenu");}
 | |
| /* Disable the Search feature if we are not operating from CGI, since */
 | |
| /* Search is accomplished using CGI and will not work without it. */
 | |
| if( !location.origin || !location.origin.match || !location.origin.match(/http/) ){
 | |
| document.getElementById("search_menubutton").style.display = "none";
 | |
| }
 | |
| /* Used by the Hide/Show button beside syntax diagrams, to toggle the */
 | |
| function hideorshow(btn,obj){
 | |
| var x = document.getElementById(obj);
 | |
| var b = document.getElementById(btn);
 | |
| if( x.style.display!='none' ){
 | |
| x.style.display = 'none';
 | |
| b.innerHTML='show';
 | |
| }else{
 | |
| x.style.display = '';
 | |
| b.innerHTML='hide';
 | |
| }
 | |
| return false;
 | |
| }
 | |
| </script>
 | |
| </div>
 | |
| <!-- keywords: sqlite3_vfs -->
 | |
| <div class=nosearch>
 | |
| <a href="intro.html"><h2>SQLite C Interface</h2></a>
 | |
| <h2>OS Interface Object</h2>
 | |
| </div>
 | |
| <blockquote><pre>
 | |
| typedef struct sqlite3_vfs sqlite3_vfs;
 | |
| typedef void (*sqlite3_syscall_ptr)(void);
 | |
| struct sqlite3_vfs {
 | |
|   int iVersion;            /* Structure version number (currently 3) */
 | |
|   int szOsFile;            /* Size of subclassed sqlite3_file */
 | |
|   int mxPathname;          /* Maximum file pathname length */
 | |
|   sqlite3_vfs *pNext;      /* Next registered VFS */
 | |
|   const char *zName;       /* Name of this virtual file system */
 | |
|   void *pAppData;          /* Pointer to application-specific data */
 | |
|   int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*,
 | |
|                int flags, int *pOutFlags);
 | |
|   int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir);
 | |
|   int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut);
 | |
|   int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut);
 | |
|   void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename);
 | |
|   void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg);
 | |
|   void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void);
 | |
|   void (*xDlClose)(sqlite3_vfs*, void*);
 | |
|   int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut);
 | |
|   int (*xSleep)(sqlite3_vfs*, int microseconds);
 | |
|   int (*xCurrentTime)(sqlite3_vfs*, double*);
 | |
|   int (*xGetLastError)(sqlite3_vfs*, int, char *);
 | |
|   /*
 | |
|   ** The methods above are in version 1 of the sqlite_vfs object
 | |
|   ** definition.  Those that follow are added in version 2 or later
 | |
|   */
 | |
|   int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*);
 | |
|   /*
 | |
|   ** The methods above are in versions 1 and 2 of the sqlite_vfs object.
 | |
|   ** Those below are for version 3 and greater.
 | |
|   */
 | |
|   int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr);
 | |
|   sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName);
 | |
|   const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName);
 | |
|   /*
 | |
|   ** The methods above are in versions 1 through 3 of the sqlite_vfs object.
 | |
|   ** New fields may be appended in future versions.  The iVersion
 | |
|   ** value will increment whenever this happens.
 | |
|   */
 | |
| };
 | |
| </pre></blockquote>
 | |
| <p>
 | |
| An instance of the sqlite3_vfs object defines the interface between
 | |
| the SQLite core and the underlying operating system.  The "vfs"
 | |
| in the name of the object stands for "virtual file system".  See
 | |
| the <a href="../vfs.html">VFS documentation</a> for further information.</p>
 | |
| 
 | |
| <p>The VFS interface is sometimes extended by adding new methods onto
 | |
| the end.  Each time such an extension occurs, the iVersion field
 | |
| is incremented.  The iVersion value started out as 1 in
 | |
| SQLite <a href="../releaselog/3_5_0.html">version 3.5.0</a> on 2007-09-04, then increased to 2
 | |
| with SQLite <a href="../releaselog/3_7_0.html">version 3.7.0</a> on 2010-07-21, and then increased
 | |
| to 3 with SQLite <a href="../releaselog/3_7_6.html">version 3.7.6</a> on 2011-04-12.  Additional fields
 | |
| may be appended to the sqlite3_vfs object and the iVersion value
 | |
| may increase again in future versions of SQLite.
 | |
| Note that due to an oversight, the structure
 | |
| of the sqlite3_vfs object changed in the transition from
 | |
| SQLite <a href="../releaselog/3_5_9.html">version 3.5.9</a> to <a href="../releaselog/3_6_0.html">version 3.6.0</a> on 2008-07-16
 | |
| and yet the iVersion field was not increased.</p>
 | |
| 
 | |
| <p>The szOsFile field is the size of the subclassed <a href="../c3ref/file.html">sqlite3_file</a>
 | |
| structure used by this VFS.  mxPathname is the maximum length of
 | |
| a pathname in this VFS.</p>
 | |
| 
 | |
| <p>Registered sqlite3_vfs objects are kept on a linked list formed by
 | |
| the pNext pointer.  The <a href="../c3ref/vfs_find.html">sqlite3_vfs_register()</a>
 | |
| and <a href="../c3ref/vfs_find.html">sqlite3_vfs_unregister()</a> interfaces manage this list
 | |
| in a thread-safe way.  The <a href="../c3ref/vfs_find.html">sqlite3_vfs_find()</a> interface
 | |
| searches the list.  Neither the application code nor the VFS
 | |
| implementation should use the pNext pointer.</p>
 | |
| 
 | |
| <p>The pNext field is the only field in the sqlite3_vfs
 | |
| structure that SQLite will ever modify.  SQLite will only access
 | |
| or modify this field while holding a particular static mutex.
 | |
| The application should never modify anything within the sqlite3_vfs
 | |
| object once the object has been registered.</p>
 | |
| 
 | |
| <p>The zName field holds the name of the VFS module.  The name must
 | |
| be unique across all VFS modules.</p>
 | |
| 
 | |
| <p><a name="sqlite3vfsxopen"></a>
 | |
| 
 | |
| SQLite guarantees that the zFilename parameter to xOpen
 | |
| is either a NULL pointer or string obtained
 | |
| from xFullPathname() with an optional suffix added.
 | |
| If a suffix is added to the zFilename parameter, it will
 | |
| consist of a single "-" character followed by no more than
 | |
| 11 alphanumeric and/or "-" characters.
 | |
| SQLite further guarantees that
 | |
| the string will be valid and unchanged until xClose() is
 | |
| called. Because of the previous sentence,
 | |
| the <a href="../c3ref/file.html">sqlite3_file</a> can safely store a pointer to the
 | |
| filename if it needs to remember the filename for some reason.
 | |
| If the zFilename parameter to xOpen is a NULL pointer then xOpen
 | |
| must invent its own temporary name for the file.  Whenever the
 | |
| xFilename parameter is NULL it will also be the case that the
 | |
| flags parameter will include <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_DELETEONCLOSE</a>.</p>
 | |
| 
 | |
| <p>The flags argument to xOpen() includes all bits set in
 | |
| the flags argument to <a href="../c3ref/open.html">sqlite3_open_v2()</a>.  Or if <a href="../c3ref/open.html">sqlite3_open()</a>
 | |
| or <a href="../c3ref/open.html">sqlite3_open16()</a> is used, then flags includes at least
 | |
| <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_READWRITE</a> | <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_CREATE</a>.
 | |
| If xOpen() opens a file read-only then it sets *pOutFlags to
 | |
| include <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_READONLY</a>.  Other bits in *pOutFlags may be set.</p>
 | |
| 
 | |
| <p>SQLite will also add one of the following flags to the xOpen()
 | |
| call, depending on the object being opened:</p>
 | |
| 
 | |
| <p><ul>
 | |
| <li>  <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_MAIN_DB</a>
 | |
| <li>  <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_MAIN_JOURNAL</a>
 | |
| <li>  <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_TEMP_DB</a>
 | |
| <li>  <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_TEMP_JOURNAL</a>
 | |
| <li>  <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_TRANSIENT_DB</a>
 | |
| <li>  <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_SUBJOURNAL</a>
 | |
| <li>  <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_SUPER_JOURNAL</a>
 | |
| <li>  <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_WAL</a>
 | |
| </ul></p>
 | |
| 
 | |
| <p>The file I/O implementation can use the object type flags to
 | |
| change the way it deals with files.  For example, an application
 | |
| that does not care about crash recovery or rollback might make
 | |
| the open of a journal file a no-op.  Writes to this journal would
 | |
| also be no-ops, and any attempt to read the journal would return
 | |
| SQLITE_IOERR.  Or the implementation might recognize that a database
 | |
| file will be doing page-aligned sector reads and writes in a random
 | |
| order and set up its I/O subsystem accordingly.</p>
 | |
| 
 | |
| <p>SQLite might also add one of the following flags to the xOpen method:</p>
 | |
| 
 | |
| <p><ul>
 | |
| <li> <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_DELETEONCLOSE</a>
 | |
| <li> <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_EXCLUSIVE</a>
 | |
| </ul></p>
 | |
| 
 | |
| <p>The <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_DELETEONCLOSE</a> flag means the file should be
 | |
| deleted when it is closed.  The <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_DELETEONCLOSE</a>
 | |
| will be set for TEMP databases and their journals, transient
 | |
| databases, and subjournals.</p>
 | |
| 
 | |
| <p>The <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_EXCLUSIVE</a> flag is always used in conjunction
 | |
| with the <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_CREATE</a> flag, which are both directly
 | |
| analogous to the O_EXCL and O_CREAT flags of the POSIX open()
 | |
| API.  The SQLITE_OPEN_EXCLUSIVE flag, when paired with the
 | |
| SQLITE_OPEN_CREATE, is used to indicate that file should always
 | |
| be created, and that it is an error if it already exists.
 | |
| It is <i>not</i> used to indicate the file should be opened
 | |
| for exclusive access.</p>
 | |
| 
 | |
| <p>At least szOsFile bytes of memory are allocated by SQLite
 | |
| to hold the <a href="../c3ref/file.html">sqlite3_file</a> structure passed as the third
 | |
| argument to xOpen.  The xOpen method does not have to
 | |
| allocate the structure; it should just fill it in.  Note that
 | |
| the xOpen method must set the sqlite3_file.pMethods to either
 | |
| a valid <a href="../c3ref/io_methods.html">sqlite3_io_methods</a> object or to NULL.  xOpen must do
 | |
| this even if the open fails.  SQLite expects that the sqlite3_file.pMethods
 | |
| element will be valid after xOpen returns regardless of the success
 | |
| or failure of the xOpen call.</p>
 | |
| 
 | |
| <p><a name="sqlite3vfsxaccess"></a>
 | |
| 
 | |
| The flags argument to xAccess() may be <a href="../c3ref/c_access_exists.html">SQLITE_ACCESS_EXISTS</a>
 | |
| to test for the existence of a file, or <a href="../c3ref/c_access_exists.html">SQLITE_ACCESS_READWRITE</a> to
 | |
| test whether a file is readable and writable, or <a href="../c3ref/c_access_exists.html">SQLITE_ACCESS_READ</a>
 | |
| to test whether a file is at least readable.  The SQLITE_ACCESS_READ
 | |
| flag is never actually used and is not implemented in the built-in
 | |
| VFSes of SQLite.  The file is named by the second argument and can be a
 | |
| directory. The xAccess method returns <a href="../rescode.html#ok">SQLITE_OK</a> on success or some
 | |
| non-zero error code if there is an I/O error or if the name of
 | |
| the file given in the second argument is illegal.  If SQLITE_OK
 | |
| is returned, then non-zero or zero is written into *pResOut to indicate
 | |
| whether or not the file is accessible.</p>
 | |
| 
 | |
| <p>SQLite will always allocate at least mxPathname+1 bytes for the
 | |
| output buffer xFullPathname.  The exact size of the output buffer
 | |
| is also passed as a parameter to both  methods. If the output buffer
 | |
| is not large enough, <a href="../rescode.html#cantopen">SQLITE_CANTOPEN</a> should be returned. Since this is
 | |
| handled as a fatal error by SQLite, vfs implementations should endeavor
 | |
| to prevent this by setting mxPathname to a sufficiently large value.</p>
 | |
| 
 | |
| <p>The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64()
 | |
| interfaces are not strictly a part of the filesystem, but they are
 | |
| included in the VFS structure for completeness.
 | |
| The xRandomness() function attempts to return nBytes bytes
 | |
| of good-quality randomness into zOut.  The return value is
 | |
| the actual number of bytes of randomness obtained.
 | |
| The xSleep() method causes the calling thread to sleep for at
 | |
| least the number of microseconds given.  The xCurrentTime()
 | |
| method returns a Julian Day Number for the current date and time as
 | |
| a floating point value.
 | |
| The xCurrentTimeInt64() method returns, as an integer, the Julian
 | |
| Day Number multiplied by 86400000 (the number of milliseconds in
 | |
| a 24-hour day).
 | |
| SQLite will use the xCurrentTimeInt64() method to get the current
 | |
| date and time if that method is available (if iVersion is 2 or
 | |
| greater and the function pointer is not NULL) and will fall back
 | |
| to xCurrentTime() if xCurrentTimeInt64() is unavailable.</p>
 | |
| 
 | |
| <p>The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces
 | |
| are not used by the SQLite core.  These optional interfaces are provided
 | |
| by some VFSes to facilitate testing of the VFS code. By overriding
 | |
| system calls with functions under its control, a test program can
 | |
| simulate faults and error conditions that would otherwise be difficult
 | |
| or impossible to induce.  The set of system calls that can be overridden
 | |
| varies from one VFS to another, and from one version of the same VFS to the
 | |
| next.  Applications that use these interfaces must be prepared for any
 | |
| or all of these interfaces to be NULL or for their behavior to change
 | |
| from one release to the next.  Applications must not attempt to access
 | |
| any of these methods if the iVersion of the VFS is less than 3.
 | |
| </p><p>See also lists of
 | |
|   <a href="objlist.html">Objects</a>,
 | |
|   <a href="constlist.html">Constants</a>, and
 | |
|   <a href="funclist.html">Functions</a>.</p>
 |