379 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			379 lines
		
	
	
		
			16 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>Custom Builds Of SQLite</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>
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| <h1 align="center">
 | |
| Custom Builds Of SQLite<br>
 | |
| or<br>
 | |
| Porting SQLite To New Operating Systems
 | |
| </h1>
 | |
| 
 | |
| <h2>1.0 Introduction</h2>
 | |
| 
 | |
| <p>For most applications, the recommended method for building
 | |
| SQLite is to use <a href="amalgamation.html">the amalgamation</a> code
 | |
| file, <b>sqlite3.c</b>, and its corresponding header file
 | |
| <b>sqlite3.h</b>.  The sqlite3.c code file should compile and
 | |
| run on any unix, Windows system without any changes
 | |
| or special compiler options.  Most applications can simply include
 | |
| the sqlite3.c file together with the other C code files that make
 | |
| up the application, compile them all together, and have working
 | |
| and well configured version of SQLite.</p>
 | |
| 
 | |
| <blockquote><i>Most applications work great with SQLite in its
 | |
| default configuration and with no special compile-time configuration.
 | |
| Most developers should be able to completely ignore this document
 | |
| and simply build SQLite from
 | |
| <a href="amalgamation.html">the amalgamation</a> without any
 | |
| special knowledge and without taking any special actions.</i></blockquote>
 | |
| 
 | |
| <p>However, highly tuned and specialized
 | |
| applications may want or need to replace some of
 | |
| SQLite's built-in system interfaces with alternative implementations
 | |
| more suitable for the needs of the application.  SQLite is designed
 | |
| to be easily reconfigured at compile-time to meet the specific
 | |
| needs of individual projects.  Among the compile-time configuration
 | |
| options for SQLite are these:</p>
 | |
| 
 | |
| <ul>
 | |
| <li><p> Replace the built-in mutex subsystem with an alternative
 | |
|         implementation.  </p></li>
 | |
| 
 | |
| <li><p> Completely disable all mutexing for use in single-threaded
 | |
|         applications. </p></li>
 | |
| 
 | |
| <li><p> Reconfigure the memory allocation subsystem to use a memory
 | |
|         allocator other the malloc() implementation from the standard
 | |
|         library. </p></li>
 | |
| 
 | |
| <li><p> Realign the memory allocation subsystem so that it never calls
 | |
|         malloc() at all but instead satisfies all memory requests using
 | |
|         a fixed-size memory buffer assigned to SQLite at startup. </p></li>
 | |
| 
 | |
| <li><p> Replace the interface to the file system with an alternative
 | |
|         design.  In other words, override all of the system calls that
 | |
|         SQLite makes in order to talk to the disk with a completely different
 | |
|         set of system calls. </p></li>
 | |
| 
 | |
| <li><p> Override other operating system interfaces such as calls to obtain
 | |
|         Zulu or local time. </p></li>
 | |
| </ul>
 | |
| 
 | |
| <p>Generally speaking, there are three separate subsystems within
 | |
| SQLite that can be modified or overridden at compile-time.  The
 | |
| mutex subsystem is used to serialize access to SQLite resources that
 | |
| are shared among threads.  The memory allocation subsystem is used
 | |
| to allocate memory required by SQLite objects and for the database
 | |
| cache.  Finally, the <a href="c3ref/vfs.html">Virtual File System</a> subsystem is
 | |
| used to provide a portable interface between SQLite and the underlying
 | |
| operating system and especially the file system.  We call these three
 | |
| subsystems the "interface" subsystems of SQLite.</p>
 | |
| 
 | |
| <p>We emphasis that most applications are well-served by the 
 | |
| built-in default implementations of the SQLite interface subsystems.
 | |
| Developers are encouraged to use the
 | |
| default built-in implementations whenever possible
 | |
| and to build SQLite without any special compile-time options or parameters.
 | |
| However, some highly specialized applications may benefit from
 | |
| substituting or modifying one or more of these built-in SQLite
 | |
| interface subsystems.
 | |
| Or, if SQLite is used on an operating system other than
 | |
| Unix (Linux or Mac OS X), Windows (Win32 or WinCE), or OS/2 then none
 | |
| of the interface subsystems that come built into SQLite will work
 | |
| and the application will need to provide alternative implementations
 | |
| suitable for the target platform.</p>
 | |
| 
 | |
| <h2>2.0 Configuring Or Replacing The Mutex Subsystem</h2>
 | |
| 
 | |
| <p>In a multithreaded environment, SQLite uses mutexes to serialize
 | |
| access to shared resources.
 | |
| The mutex subsystem is only required for applications that access
 | |
| SQLite from multiple threads.  For single-threaded applications, or
 | |
| applications which only call SQLite from a single thread, the mutex
 | |
| subsystem can be completely disabled by recompiling with the following
 | |
| option:</p>
 | |
| 
 | |
| <blockquote><pre>
 | |
| -DSQLITE_THREADSAFE=0
 | |
| </pre></blockquote>
 | |
| 
 | |
| <p>Mutexes are cheap but they are not free, so performance will be better
 | |
| when mutexes are completely disabled.  The resulting library footprint
 | |
| will also be a little smaller.  Disabling the mutexes at compile-time
 | |
| is a recommended optimization for applications where it makes sense.</p>
 | |
| 
 | |
| <p>When using SQLite as a shared library, an application can test to see
 | |
| whether or not mutexes have been disabled using the
 | |
| <a href="c3ref/threadsafe.html">sqlite3_threadsafe()</a> API.  Applications that link against SQLite at
 | |
| run-time and use SQLite from multiple threads should probably check this
 | |
| API to make sure they did not accidentally get linked against a version of
 | |
| the SQLite library that has its mutexes disabled.  Single-threaded
 | |
| applications will, of course, work correctly regardless of whether or
 | |
| not SQLite is configured to be threadsafe, though they will be a little
 | |
| bit faster when using versions of SQLite with mutexes disabled.</p>
 | |
| 
 | |
| <p>SQLite mutexes can also be disabled at run-time using the
 | |
| <a href="c3ref/config.html">sqlite3_config()</a> interface.  To completely disable all mutexing,
 | |
| the application can invoke:</p>
 | |
| 
 | |
| <blockquote><pre>
 | |
| sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
 | |
| </pre></blockquote>
 | |
| 
 | |
| <p>Disabling mutexes at run-time is not as effective as disabling them
 | |
| at compile-time since SQLite still must do a test of a boolean variable
 | |
| to see if mutexes are enabled or disabled at each point where a mutex
 | |
| might be required.  But there is still a performance advantage for
 | |
| disabling mutexes at run-time.</p>
 | |
| 
 | |
| <p>For multi-threaded applications that are careful about how they
 | |
| manage threads, SQLite supports an alternative run-time configuration
 | |
| that is half way between not using any mutexes and the default situation
 | |
| of mutexing everything in sight.  This in-the-middle mutex alignment can
 | |
| be established as follows:</p>
 | |
| 
 | |
| <blockquote><pre>
 | |
| sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
 | |
| sqlite3_config(SQLITE_CONFIG_MEMSTATUS, 0);
 | |
| </pre></blockquote>
 | |
| 
 | |
| <p>There are two separate configuration changes here which can
 | |
| be used either togethr or separately. The
 | |
| <a href="c3ref/c_config_covering_index_scan.html#sqliteconfigmultithread">SQLITE_CONFIG_MULTITHREAD</a> setting disables the mutexes that
 | |
| serialize access to <a href="c3ref/sqlite3.html">database connection</a> objects and 
 | |
| <a href="c3ref/stmt.html">prepared statement</a> objects.  With this setting, the application
 | |
| is free to use SQLite from multiple threads, but it must make sure
 | |
| than no two threads try to access the same <a href="c3ref/sqlite3.html">database connection</a>
 | |
| or any <a href="c3ref/stmt.html">prepared statements</a> associated with the same 
 | |
| <a href="c3ref/sqlite3.html">database connection</a> at the same time.  Two threads can use SQLite
 | |
| at the same time, but they must use separate <a href="c3ref/sqlite3.html">database connections</a>.
 | |
| The second <a href="c3ref/c_config_covering_index_scan.html#sqliteconfigmemstatus">SQLITE_CONFIG_MEMSTATUS</a> setting disables the mechanism
 | |
| in SQLite that tracks the total size of all outstanding memory
 | |
| allocation requests.  This omits the need to mutex each call
 | |
| to <a href="c3ref/free.html">sqlite3_malloc()</a> and <a href="c3ref/free.html">sqlite3_free()</a>, which saves a huge
 | |
| number of mutex operations.  But a consequence of disabling the
 | |
| memory statistics mechanism is that the 
 | |
| <a href="c3ref/memory_highwater.html">sqlite3_memory_used()</a>, <a href="c3ref/memory_highwater.html">sqlite3_memory_highwater()</a>, and
 | |
| <a href="c3ref/hard_heap_limit64.html">sqlite3_soft_heap_limit64()</a> interfaces cease to work.
 | |
| </p>
 | |
| 
 | |
| <p>SQLite uses pthreads for its mutex implementation on Unix and
 | |
| SQLite requires a recursive mutex.  Most modern pthread implementations
 | |
| support recursive mutexes, but not all do.  For systems that do not
 | |
| support recursive mutexes, it is recommended that applications operate
 | |
| in single-threaded mode only.  If this is not possible, SQLite provides
 | |
| an alternative recursive mutex implementation built on top of the
 | |
| standard "fast" mutexes of pthreads.  This alternative
 | |
| implementation should work correctly as long as pthread_equal() is
 | |
| atomic and the processor has a coherent data cache.  The alternative
 | |
| recursive mutex implementation is enabled by the following
 | |
| compiler command-line switch:</p>
 | |
| 
 | |
| <blockquote><pre>
 | |
| -DSQLITE_HOMEGROWN_RECURSIVE_MUTEX=1
 | |
| </pre></blockquote>
 | |
| 
 | |
| <p>When porting SQLite to a new operating system, it is usually necessary
 | |
| to completely replace the built-in mutex subsystem with an alternative
 | |
| built around the mutex primitives of the new operating system.  This
 | |
| is accomplished by compiling SQLite with the following option:</p>
 | |
| 
 | |
| <blockquote><pre>
 | |
| -DSQLITE_MUTEX_APPDEF=1
 | |
| </pre></blockquote>
 | |
| 
 | |
| <p>When SQLite is compiled with the SQLITE_MUTEX_APPDEF=1 option, it
 | |
| completely omits the implementation of its 
 | |
| <a href="c3ref/mutex_alloc.html">mutex primitive functions</a>.  But the SQLite
 | |
| library still attempts to call these functions where necessary, so the
 | |
| application must itself implement the
 | |
| <a href="c3ref/mutex_alloc.html">mutex primitive functions</a> and link them together
 | |
| with SQLite.</p>
 | |
| 
 | |
| <h2>3.0 Configuring Or Replacing The Memory Allocation Subsystem</h2>
 | |
| 
 | |
| <p>By default, SQLite obtains the memory it needs for objects and
 | |
| cache from the malloc()/free() implementation of the standard library.
 | |
| There is also on-going work with experimental memory allocators that
 | |
| satisfy all memory requests from a single fixed memory buffer handed
 | |
| to SQLite at application start.  Additional information on these
 | |
| experimental memory allocators will be provided in a future revision
 | |
| of this document.</p>
 | |
| 
 | |
| <p>SQLite supports the ability of an application to specify an alternative
 | |
| memory allocator at run-time by filling in an instance of the
 | |
| <a href="c3ref/mem_methods.html">sqlite3_mem_methods</a> object with pointers to the routines of the
 | |
| alternative implementation then registering the new alternative
 | |
| implementation using the <a href="c3ref/config.html">sqlite3_config()</a> interface.
 | |
| For example:</p>
 | |
| 
 | |
| <blockquote><pre>
 | |
| sqlite3_config(SQLITE_CONFIG_MALLOC, &my_malloc_implementation);
 | |
| </pre></blockquote>
 | |
| 
 | |
| <p>SQLite makes a copy of the content of the <a href="c3ref/mem_methods.html">sqlite3_mem_methods</a> object
 | |
| so the object can be modified after the <a href="c3ref/config.html">sqlite3_config()</a> call returns.</p>
 | |
| 
 | |
| <h2>4.0 Adding New Virtual File Systems</h2>
 | |
| 
 | |
| <p>Since <a href="releaselog/3_5_0.html">version 3.5.0</a> (2007-09-04), 
 | |
| SQLite has supported an interface called the
 | |
| <a href="c3ref/vfs.html">virtual file system</a> or "VFS".
 | |
| This object is somewhat misnamed since it
 | |
| is really an interface to the whole underlying operating system, not
 | |
| just the filesystem.</p>
 | |
| 
 | |
| <p> One of the interesting features
 | |
| of the VFS interface is that SQLite can support multiple VFSes at the
 | |
| same time.  Each <a href="c3ref/sqlite3.html">database connection</a> has to choose a single VFS for its
 | |
| use when the connection is first opened using <a href="c3ref/open.html">sqlite3_open_v2()</a>.
 | |
| But if a process contains multiple <a href="c3ref/sqlite3.html">database connections</a> each can choose
 | |
| a different VFS.  VFSes can be added at run-time using the
 | |
| <a href="c3ref/vfs_find.html">sqlite3_vfs_register()</a> interface.</p>
 | |
| 
 | |
| <p>The default builds for SQLite on Unix, Windows, and OS/2 include 
 | |
| a VFS appropriate for the target platform.  SQLite builds for other
 | |
| operating systems do not contain a VFS by default, but the application
 | |
| can register one or more at run-time.</p>
 | |
| 
 | |
| <h2>5.0 Porting SQLite To A New Operating System</h2>
 | |
| 
 | |
| <p>In order to port SQLite to a new operating system - an operating
 | |
| system not supported by default - the application
 | |
| must provide...</p>
 | |
| 
 | |
| <ul>
 | |
| <li> a working mutex subsystem (but only if it is multithreaded), </li>
 | |
| <li> a working memory allocation subsystem (assuming it lacks malloc()
 | |
| in its standard library), and</li>
 | |
| <li> a working VFS implementation.</li>
 | |
| </ul>
 | |
| 
 | |
| <p>All of these things can be provided in a single auxiliary C code file
 | |
| and then linked with the stock "sqlite3.c" code file to generate a working
 | |
| SQLite build for the target operating system.  In addition to the
 | |
| alternative mutex and memory allocation subsystems and the new VFS,
 | |
| the auxiliary C code file should contain implementations for the
 | |
| following two routines:</p>
 | |
| 
 | |
| <ul>
 | |
| <li> <a href="c3ref/initialize.html">sqlite3_os_init()</a> </li>
 | |
| <li> <a href="c3ref/initialize.html">sqlite3_os_end()</a> </li>
 | |
| </ul>
 | |
| 
 | |
| <p>The "sqlite3.c" code file contains default implementations of a VFS
 | |
| and of the <a href="c3ref/initialize.html">sqlite3_initialize()</a> and <a href="c3ref/initialize.html">sqlite3_shutdown()</a> functions that
 | |
| are appropriate for Unix, Windows, and OS/2.
 | |
| To prevent one of these default components from being loaded when sqlite3.c
 | |
| is compiled, it is necessary to add the following compile-time
 | |
| option:</p>
 | |
| 
 | |
| <blockquote><pre>
 | |
| -DSQLITE_OS_OTHER=1
 | |
| </pre></blockquote>
 | |
| 
 | |
| 
 | |
| <p>The SQLite core will call <a href="c3ref/initialize.html">sqlite3_initialize()</a> early.  The auxiliary
 | |
| C code file can contain an implementation of sqlite3_initialize() that
 | |
| registers an appropriate VFS and also perhaps initializes an alternative
 | |
| mutex system (if mutexes are required) or does any memory allocation
 | |
| subsystem initialization that is required.
 | |
| The SQLite core never calls <a href="c3ref/initialize.html">sqlite3_shutdown()</a> but it is part of the
 | |
| official SQLite API and is not otherwise provided when compiled with
 | |
| -DSQLITE_OS_OTHER=1, so the auxiliary C code file should probably provide
 | |
| it for completeness.</p>
 | |
| 
 |