From fef9765507ec928041eb63f1505fd21e064f60cb Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Feb 2004 16:56:32 +0000 Subject: [PATCH] Begin updating the architecture description to better describe how things are currently put together. (CVS 1247) FossilOrigin-Name: 062ecc1368d6bb6d15da31e8d6f5953e8f5628b9 --- manifest | 14 +++--- manifest.uuid | 2 +- www/arch.tcl | 46 +++++++++++++++-- www/arch2.fig | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++ www/arch2.gif | Bin 0 -> 7196 bytes 5 files changed, 186 insertions(+), 12 deletions(-) create mode 100644 www/arch2.fig create mode 100644 www/arch2.gif diff --git a/manifest b/manifest index b6eca890bf..b1dc18ae51 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\smore\stests\sof\sthe\ssqlite_interrupt()\slogic\s-\slooking\sfor\sa\sreported\nmemory\sleak.\s\s(Didn't\sfind\sit.)\s(CVS\s1246) -D 2004-02-18T01:31:54 +C Begin\supdating\sthe\sarchitecture\sdescription\sto\sbetter\sdescribe\show\sthings\nare\scurrently\sput\stogether.\s(CVS\s1247) +D 2004-02-18T16:56:32 F Makefile.in cfd75c46b335881999333a9e4b982fa8491f200b F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -161,7 +161,9 @@ F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F www/arch.fig d5f9752a4dbf242e9cfffffd3f5762b6c63b3bcf F www/arch.png 82ef36db1143828a7abc88b1e308a5f55d4336f4 -F www/arch.tcl 44b589fc01d6829d43447ab40588b00aec5b9734 +F www/arch.tcl 1e5289d63fc45564c67e205bc503db74718436ca +F www/arch2.fig 613b5ac63511109064c2f93c5754ee662219937d +F www/arch2.gif 49c6bb36160f03ca2b89eaa5bfb1f560c7d68ee7 F www/audit.tcl 90e09d580f79c7efec0c7d6f447b7ec5c2dce5c0 F www/c_interface.tcl 17d8bd9e7b4fbdca47c30c8b9bcb728c351d55c0 F www/changes.tcl ca9871eb52fa669e40f2052ab45154dfe0b72985 @@ -184,7 +186,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P 50e67948f89380f2f4b536add0b8179e6db960a5 -R 0fd46cdcb719452c286af1cf356d38ce +P e4c8b1c3aa9d288f518c6394187354e6fa18978e +R 9c0d8e2f5a853263270cb382693ec393 U drh -Z 8eb9cfa9eaeb9d935dda443dd1d5d0a4 +Z 385597eeec31fcd3b70006a6664f87b7 diff --git a/manifest.uuid b/manifest.uuid index 32f20546ec..44b0a48c37 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e4c8b1c3aa9d288f518c6394187354e6fa18978e \ No newline at end of file +062ecc1368d6bb6d15da31e8d6f5953e8f5628b9 \ No newline at end of file diff --git a/www/arch.tcl b/www/arch.tcl index 628512e9fc..ef8a4799db 100644 --- a/www/arch.tcl +++ b/www/arch.tcl @@ -1,7 +1,7 @@ # # Run this Tcl script to generate the sqlite.html file. # -set rcsid {$Id: arch.tcl,v 1.9 2003/03/19 03:14:03 drh Exp $} +set rcsid {$Id: arch.tcl,v 1.10 2004/02/18 16:56:32 drh Exp $} puts { @@ -20,7 +20,7 @@ puts { - +
Block Diagram Of SQLite

This document describes the architecture of the SQLite library. The information here is useful to those who want to understand or @@ -33,11 +33,30 @@ and how they interrelate is shown at the right. The text that follows will provide a quick overview of each of these components.

+

History

+ +

+There are two main C interfaces to the SQLite library: +sqlite_exec() and sqlite_compile(). Prior to +version 2.8.0 (2003-Feb-16) only sqlite_exec() was supported. +For version 2.8.0, the sqlite_exec and sqlite_compile methods +existed as peers. Beginning with version 2.8.13, the sqlite_compile +method is the primary interface, and sqlite_exec is implemented +using sqlite_compile. Externally, there are API extensions but +not changes that break backwards compatibility. But internally, +the plumbing is very different. The diagram at the right shows +the structure of SQLite for version 2.8.13 and following. +

+

Interface

-

Most of the public interface to the SQLite library is implemented by -four functions found in the main.c source file. The +

Much of the public interface to the SQLite library is implemented by +functions found in the main.c source file though some routines are +scattered about in other files where they can have access to data +structures with file scope. The sqlite_get_table() routine is implemented in table.c. +sqlite_step() is found in vdbe.c. +sqlite_mprintf() is found in printf.c. The Tcl interface is implemented by tclsqlite.c. More information on the C interface to SQLite is available separately.

@@ -48,6 +67,10 @@ Those symbols that are intended for external use (in other words, those symbols which form the API for SQLite) begin with sqlite_.

+

SQL Command Process

+ +

+

Tokenizer

When a string containing SQL statements is to be executed, the @@ -117,7 +140,20 @@ source file vdbe.c. The virtual machine also has its own header file vdbe.h that defines an interface between the virtual machine and the rest of the SQLite library.

-

B-tree Driver

+

Backend

+ +

The backend is an abstraction layer that presents a uniform interface +to the virtual machine for either the B-Tree drivers for disk-based +databases or the Red/Black Tree driver for in-memory databases. +The btree.h source file contains the details.

+ +

Red/Black Tree

+ +

In-memory databases are stored in a red/black tree implementation +contain in the btree_rb.c source file. +

+ +

B-Tree

An SQLite database is maintained on disk using a B-tree implementation found in the btree.c source file. A separate B-tree is used for diff --git a/www/arch2.fig b/www/arch2.fig new file mode 100644 index 0000000000..97a1a38245 --- /dev/null +++ b/www/arch2.fig @@ -0,0 +1,136 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +0 32 #000000 +0 33 #868686 +0 34 #dfefd7 +0 35 #d7efef +0 36 #efdbef +0 37 #efdbd7 +0 38 #e7efcf +0 39 #9e9e9e +6 4950 4275 6525 4800 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 5025 4350 6525 4350 6525 4800 5025 4800 5025 4350 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 4950 4275 6450 4275 6450 4725 4950 4725 4950 4275 +4 1 0 50 0 2 12 0.0000 4 135 1335 5700 4575 Red/Black Tree\001 +-6 +6 5400 5475 6825 6000 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 5400 5475 6750 5475 6750 5925 5400 5925 5400 5475 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 5475 5550 6825 5550 6825 6000 5475 6000 5475 5550 +4 1 0 50 0 2 12 0.0000 4 135 630 6000 5775 Utilities\001 +-6 +6 5400 6300 6825 6825 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 5400 6300 6750 6300 6750 6750 5400 6750 5400 6300 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 5475 6375 6825 6375 6825 6825 5475 6825 5475 6375 +4 1 0 50 0 2 12 0.0000 4 135 855 6000 6600 Test Code\001 +-6 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 5475 2625 6825 2625 6825 3525 5475 3525 5475 2625 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 5400 2550 6750 2550 6750 3450 5400 3450 5400 2550 +2 3 0 1 0 35 55 0 20 0.000 0 0 -1 0 0 9 + 2850 3675 4875 3675 4875 3975 6750 3975 6750 5025 4875 5025 + 4875 6975 2850 6975 2850 3675 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 3225 6300 4575 6300 4575 6750 3225 6750 3225 6300 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 3300 6375 4650 6375 4650 6825 3300 6825 3300 6375 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 3225 5475 4575 5475 4575 5925 3225 5925 3225 5475 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 3300 5550 4650 5550 4650 6000 3300 6000 3300 5550 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 3225 4725 4575 4725 4575 5175 3225 5175 3225 4725 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 3300 4800 4650 4800 4650 5250 3300 5250 3300 4800 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 3225 3900 4575 3900 4575 4350 3225 4350 3225 3900 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 3300 3975 4650 3975 4650 4425 3300 4425 3300 3975 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 5400 1800 6750 1800 6750 2250 5400 2250 5400 1800 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 5475 1875 6825 1875 6825 2325 5475 2325 5475 1875 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 5400 1050 6750 1050 6750 1500 5400 1500 5400 1050 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 5475 1125 6825 1125 6825 1575 5475 1575 5475 1125 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 3225 1050 4575 1050 4575 1500 3225 1500 3225 1050 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 3300 1125 4650 1125 4650 1575 3300 1575 3300 1125 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 3225 1800 4575 1800 4575 2250 3225 2250 3225 1800 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 3300 1875 4650 1875 4650 2325 3300 2325 3300 1875 +2 2 0 1 0 7 51 0 20 0.000 0 0 -1 0 0 5 + 3225 2550 4575 2550 4575 3000 3225 3000 3225 2550 +2 2 0 0 0 33 52 0 20 0.000 0 0 -1 0 0 5 + 3300 2625 4650 2625 4650 3075 3300 3075 3300 2625 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3900 1500 3900 1800 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3900 2250 3900 2550 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3900 3000 3900 3900 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 4575 1950 5400 1350 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5400 2925 4650 2175 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3900 4350 3900 4725 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 4575 4200 4950 4500 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3900 5175 3900 5475 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3900 5925 3900 6300 +2 2 0 1 0 37 55 0 20 0.000 0 0 -1 0 0 5 + 5175 750 7200 750 7200 3750 5175 3750 5175 750 +2 2 0 1 0 34 55 0 20 0.000 0 0 -1 0 0 5 + 2850 750 4875 750 4875 3375 2850 3375 2850 750 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6075 1500 6075 1800 +2 1 0 1 0 38 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6075 2250 6075 2550 +2 2 0 1 0 38 55 0 20 0.000 0 0 -1 0 0 5 + 5175 5250 7200 5250 7200 6975 5175 6975 5175 5250 +4 1 0 50 0 2 12 0.0000 4 135 855 6075 1350 Tokenizer\001 +4 1 0 50 0 2 12 0.0000 4 135 570 6075 2100 Parser\001 +4 1 0 50 0 2 12 0.0000 4 135 420 6075 2925 Code\001 +4 1 0 50 0 2 12 0.0000 4 135 855 6075 3150 Generator\001 +4 1 0 50 0 2 12 0.0000 4 135 720 3900 4200 Backend\001 +4 1 0 50 0 2 12 0.0000 4 135 1050 3900 6600 OS Interface\001 +4 1 0 50 0 2 12 0.0000 4 135 615 3900 5025 B-Tree\001 +4 1 0 50 0 2 12 0.0000 4 180 495 3900 5775 Pager\001 +4 1 0 50 0 1 12 1.5708 4 180 1020 7125 2250 SQL Compiler\001 +4 1 0 50 0 1 12 1.5708 4 135 885 7125 6150 Accessories\001 +4 1 0 50 0 1 12 1.5708 4 135 645 3075 5250 Backend\001 +4 1 0 50 0 1 12 1.5708 4 135 345 3075 2025 Core\001 +4 1 0 50 0 2 12 0.0000 4 135 1290 3900 2850 Virtual Machine\001 +4 1 0 50 0 2 12 0.0000 4 165 1185 3900 1995 SQL Command\001 +4 1 0 50 0 2 12 0.0000 4 135 855 3900 2183 Processor\001 +4 1 0 50 0 2 14 0.0000 4 150 870 3900 1350 Interface\001 diff --git a/www/arch2.gif b/www/arch2.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef91eacdccfbb1a74ac4a0f6eec5378d0e186f0b GIT binary patch literal 7196 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 e$4Sm|n)96KOs6{6$