222 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			9.9 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 File Virtual Methods 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_io_methods -->
 | |
| <div class=nosearch>
 | |
| <a href="intro.html"><h2>SQLite C Interface</h2></a>
 | |
| <h2>OS Interface File Virtual Methods Object</h2>
 | |
| </div>
 | |
| <blockquote><pre>
 | |
| typedef struct sqlite3_io_methods sqlite3_io_methods;
 | |
| struct sqlite3_io_methods {
 | |
|   int iVersion;
 | |
|   int (*xClose)(sqlite3_file*);
 | |
|   int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
 | |
|   int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst);
 | |
|   int (*xTruncate)(sqlite3_file*, sqlite3_int64 size);
 | |
|   int (*xSync)(sqlite3_file*, int flags);
 | |
|   int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize);
 | |
|   int (*xLock)(sqlite3_file*, int);
 | |
|   int (*xUnlock)(sqlite3_file*, int);
 | |
|   int (*xCheckReservedLock)(sqlite3_file*, int *pResOut);
 | |
|   int (*xFileControl)(sqlite3_file*, int op, void *pArg);
 | |
|   int (*xSectorSize)(sqlite3_file*);
 | |
|   int (*xDeviceCharacteristics)(sqlite3_file*);
 | |
|   /* Methods above are valid for version 1 */
 | |
|   int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
 | |
|   int (*xShmLock)(sqlite3_file*, int offset, int n, int flags);
 | |
|   void (*xShmBarrier)(sqlite3_file*);
 | |
|   int (*xShmUnmap)(sqlite3_file*, int deleteFlag);
 | |
|   /* Methods above are valid for version 2 */
 | |
|   int (*xFetch)(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
 | |
|   int (*xUnfetch)(sqlite3_file*, sqlite3_int64 iOfst, void *p);
 | |
|   /* Methods above are valid for version 3 */
 | |
|   /* Additional methods may be added in future releases */
 | |
| };
 | |
| </pre></blockquote>
 | |
| <p>
 | |
| Every file opened by the <a href="../c3ref/vfs.html#sqlite3vfsxopen">sqlite3_vfs.xOpen</a> method populates an
 | |
| <a href="../c3ref/file.html">sqlite3_file</a> object (or, more commonly, a subclass of the
 | |
| <a href="../c3ref/file.html">sqlite3_file</a> object) with a pointer to an instance of this object.
 | |
| This object defines the methods used to perform various operations
 | |
| against the open file represented by the <a href="../c3ref/file.html">sqlite3_file</a> object.</p>
 | |
| 
 | |
| <p>If the <a href="../c3ref/vfs.html#sqlite3vfsxopen">sqlite3_vfs.xOpen</a> method sets the sqlite3_file.pMethods element
 | |
| to a non-NULL pointer, then the sqlite3_io_methods.xClose method
 | |
| may be invoked even if the <a href="../c3ref/vfs.html#sqlite3vfsxopen">sqlite3_vfs.xOpen</a> reported that it failed.  The
 | |
| only way to prevent a call to xClose following a failed <a href="../c3ref/vfs.html#sqlite3vfsxopen">sqlite3_vfs.xOpen</a>
 | |
| is for the <a href="../c3ref/vfs.html#sqlite3vfsxopen">sqlite3_vfs.xOpen</a> to set the sqlite3_file.pMethods element
 | |
| to NULL.</p>
 | |
| 
 | |
| <p>The flags argument to xSync may be one of <a href="../c3ref/c_sync_dataonly.html">SQLITE_SYNC_NORMAL</a> or
 | |
| <a href="../c3ref/c_sync_dataonly.html">SQLITE_SYNC_FULL</a>.  The first choice is the normal fsync().
 | |
| The second choice is a Mac OS X style fullsync.  The <a href="../c3ref/c_sync_dataonly.html">SQLITE_SYNC_DATAONLY</a>
 | |
| flag may be ORed in to indicate that only the data of the file
 | |
| and not its inode needs to be synced.</p>
 | |
| 
 | |
| <p>The integer values to xLock() and xUnlock() are one of
 | |
| <ul>
 | |
| <li> <a href="../c3ref/c_lock_exclusive.html">SQLITE_LOCK_NONE</a>,
 | |
| <li> <a href="../c3ref/c_lock_exclusive.html">SQLITE_LOCK_SHARED</a>,
 | |
| <li> <a href="../c3ref/c_lock_exclusive.html">SQLITE_LOCK_RESERVED</a>,
 | |
| <li> <a href="../c3ref/c_lock_exclusive.html">SQLITE_LOCK_PENDING</a>, or
 | |
| <li> <a href="../c3ref/c_lock_exclusive.html">SQLITE_LOCK_EXCLUSIVE</a>.
 | |
| </ul>
 | |
| xLock() increases the lock. xUnlock() decreases the lock.
 | |
| The xCheckReservedLock() method checks whether any database connection,
 | |
| either in this process or in some other process, is holding a RESERVED,
 | |
| PENDING, or EXCLUSIVE lock on the file.  It returns true
 | |
| if such a lock exists and false otherwise.</p>
 | |
| 
 | |
| <p>The xFileControl() method is a generic interface that allows custom
 | |
| VFS implementations to directly control an open file using the
 | |
| <a href="../c3ref/file_control.html">sqlite3_file_control()</a> interface.  The second "op" argument is an
 | |
| integer opcode.  The third argument is a generic pointer intended to
 | |
| point to a structure that may contain arguments or space in which to
 | |
| write return values.  Potential uses for xFileControl() might be
 | |
| functions to enable blocking locks with timeouts, to change the
 | |
| locking strategy (for example to use dot-file locks), to inquire
 | |
| about the status of a lock, or to break stale locks.  The SQLite
 | |
| core reserves all opcodes less than 100 for its own use.
 | |
| A <a href="../c3ref/c_fcntl_begin_atomic_write.html">list of opcodes</a> less than 100 is available.
 | |
| Applications that define a custom xFileControl method should use opcodes
 | |
| greater than 100 to avoid conflicts.  VFS implementations should
 | |
| return <a href="../rescode.html#notfound">SQLITE_NOTFOUND</a> for file control opcodes that they do not
 | |
| recognize.</p>
 | |
| 
 | |
| <p>The xSectorSize() method returns the sector size of the
 | |
| device that underlies the file.  The sector size is the
 | |
| minimum write that can be performed without disturbing
 | |
| other bytes in the file.  The xDeviceCharacteristics()
 | |
| method returns a bit vector describing behaviors of the
 | |
| underlying device:</p>
 | |
| 
 | |
| <p><ul>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_ATOMIC</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_ATOMIC512</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_ATOMIC1K</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_ATOMIC2K</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_ATOMIC4K</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_ATOMIC8K</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_ATOMIC16K</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_ATOMIC32K</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_ATOMIC64K</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_SAFE_APPEND</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_SEQUENTIAL</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_POWERSAFE_OVERWRITE</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_IMMUTABLE</a>
 | |
| <li> <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_BATCH_ATOMIC</a>
 | |
| </ul></p>
 | |
| 
 | |
| <p>The SQLITE_IOCAP_ATOMIC property means that all writes of
 | |
| any size are atomic.  The SQLITE_IOCAP_ATOMICnnn values
 | |
| mean that writes of blocks that are nnn bytes in size and
 | |
| are aligned to an address which is an integer multiple of
 | |
| nnn are atomic.  The SQLITE_IOCAP_SAFE_APPEND value means
 | |
| that when data is appended to a file, the data is appended
 | |
| first then the size of the file is extended, never the other
 | |
| way around.  The SQLITE_IOCAP_SEQUENTIAL property means that
 | |
| information is written to disk in the same order as calls
 | |
| to xWrite().</p>
 | |
| 
 | |
| <p>If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill
 | |
| in the unread portions of the buffer with zeros.  A VFS that
 | |
| fails to zero-fill short reads might seem to work.  However,
 | |
| failure to zero-fill short reads will eventually lead to
 | |
| database corruption.
 | |
| </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>
 |