From 8cae12b13bf5d37b3c4ae65542a0ea4784125c96 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 27 Oct 1997 16:59:20 +0000 Subject: [PATCH] Add new html development tools, and flow chart. --- src/tools/BACKEND_DIRS | 47 ----------------- src/tools/flow.fig | 112 +++++++++++++++++++++++++++++++++++++++++ src/tools/flow.gif | Bin 0 -> 8444 bytes 3 files changed, 112 insertions(+), 47 deletions(-) delete mode 100644 src/tools/BACKEND_DIRS create mode 100644 src/tools/flow.fig create mode 100644 src/tools/flow.gif diff --git a/src/tools/BACKEND_DIRS b/src/tools/BACKEND_DIRS deleted file mode 100644 index 92131e128f..0000000000 --- a/src/tools/BACKEND_DIRS +++ /dev/null @@ -1,47 +0,0 @@ -access various index access methods -access/common common access routines -access/gist easy-to-define access method system -access/hash hash -access/heap heap -access/index index handling -access/nbtree btree -access/rtree rtree -access/transam transaction manager (BEGIN/ABORT/COMMIT) -bootstrap handles initdb requests to create initial template database -catalog system catalog manipulation -commands commands that do not require executor -executor executes complex node plans from optimizer -include include files -lib support library -libpq communication to client libpq library routines -main passes control to postmaster or postgres -nodes creation/manipulation of nodes -optimizer creates path and plan -optimizer/path creates path from parser output -optimizer/plan optmizes path output -optimizer/prep handle special plan cases -optimizer/util optimizer support routines -parser converts SQL query to query tree -postmaster controls postgres server startup/termination -regex regular expression library -rewrite rules system -storage manages various storage systems -storage/buffer shared buffer pool manager -storage/file file manager -storage/ipc semaphores and shared memory -storage/large_object large objects -storage/lmgr lock manager -storage/page page manager -storage/smgr storage(disk) manager -tcop traffic cop, dispatches request to proper module -tioga array handling? -utils support routines -utils/adt built-in data type routines -utils/cache system/relation/function cache routines -utils/error error reporting routines -utils/fmgr function manager -utils/hash hash routines for internal algorithms -utils/init initialization stuff -utils/mmgr memory manager(process-local memory) -utils/sort sort routines for internal algorithms -utils/time transaction time qualification routines diff --git a/src/tools/flow.fig b/src/tools/flow.fig new file mode 100644 index 0000000000..f609590fe7 --- /dev/null +++ b/src/tools/flow.fig @@ -0,0 +1,112 @@ +#FIG 3.1 +Landscape +Center +Inches +1200 2 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 6900 1200 6900 600 4500 600 4500 1200 6900 1200 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5700 1200 5700 1800 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 6900 2400 6900 1800 4500 1800 4500 2400 6900 2400 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 6900 3600 6900 3000 4500 3000 4500 3600 6900 3600 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5700 2400 5700 3000 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 10800 3600 10800 3000 8400 3000 8400 3600 10800 3600 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5700 2400 9600 3000 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 2700 5100 2700 4500 300 4500 300 5100 2700 5100 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5700 3600 1500 4500 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 2700 6300 2700 5700 300 5700 300 6300 2700 6300 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 1500 5100 1500 5700 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 6900 5100 6900 4500 4500 4500 4500 5100 6900 5100 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 6 + 0 0 1.00 60.00 120.00 + 1500 6300 1500 6600 3900 6600 3900 4200 5700 4200 5700 4500 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 6900 6300 6900 5700 4500 5700 4500 6300 6900 6300 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5700 5100 5700 5700 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 6900 7500 6900 6900 4500 6900 4500 7500 6900 7500 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5700 6300 5700 6900 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 6900 8700 6900 8100 4500 8100 4500 8700 6900 8700 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5700 7500 5700 8100 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 6900 9600 6900 9000 4500 9000 4500 9600 6900 9600 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5700 8700 5700 9000 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 10800 6300 10800 5700 8400 5700 8400 6300 10800 6300 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 6900 6000 8400 6000 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 2700 7500 2700 6900 300 6900 300 7500 2700 7500 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 2700 8400 2700 7800 300 7800 300 8400 2700 8400 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 3 + 0 0 1.00 60.00 120.00 + 4500 9300 3900 9300 3900 6600 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 4 + 0 0 1.00 60.00 120.00 + 10800 6000 11400 6000 11400 4200 5700 4200 +2 4 0 1 -1 7 0 0 -1 0.000 0 0 7 0 0 5 + 2700 9300 2700 8700 300 8700 300 9300 2700 9300 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 1 + 2700 8100 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 1 2 + 0 0 1.00 60.00 120.00 + 0 0 1.00 60.00 120.00 + 2700 7200 3300 7200 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 1 2 + 0 0 1.00 60.00 120.00 + 0 0 1.00 60.00 120.00 + 2700 8100 3300 8100 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 1 2 + 0 0 1.00 60.00 120.00 + 0 0 1.00 60.00 120.00 + 2700 9000 3300 9000 +4 1 -1 0 0 28 18 0.0000 4 195 630 5670 990 Main\001 +4 1 -1 0 0 28 18 0.0000 4 195 1470 5685 2190 Postmaster\001 +4 1 -1 0 0 28 18 0.0000 4 240 1110 9585 3375 Postgres\001 +4 1 -1 0 0 28 18 0.0000 4 240 1110 5700 3390 Postgres\001 +4 1 -1 0 0 28 18 0.0000 4 195 1710 1500 4905 Initialization\001 +4 1 -1 0 0 28 18 0.0000 4 195 1215 1470 5940 Attach to\001 +4 1 -1 0 0 28 18 0.0000 4 195 2340 1485 6270 Shared Resources\001 +4 1 -1 0 0 28 18 0.0000 4 240 915 9600 5970 Simple\001 +4 1 -1 0 0 28 18 0.0000 4 195 1980 5685 7455 Generate Paths\001 +4 1 -1 0 0 28 18 0.0000 4 195 1275 5715 7170 Rewrite &\001 +4 1 -1 0 0 28 18 0.0000 4 255 1500 5715 6090 Traffic Cop\001 +4 1 -1 0 0 28 18 0.0000 4 195 825 5685 4875 Parser\001 +4 1 -1 0 0 28 18 0.0000 4 195 1140 5685 9420 Executor\001 +4 1 -1 0 0 28 18 0.0000 4 195 2100 1485 7305 Access Methods\001 +4 1 -1 0 0 28 18 0.0000 4 195 1050 1485 9090 Utilities\001 +4 1 -1 0 0 28 18 0.0000 4 240 2325 1515 8190 Storage Managers\001 +4 1 -1 0 0 28 18 0.0000 4 195 1485 9600 6255 Commands\001 +4 1 -1 0 0 28 18 0.0000 4 195 1830 5715 8670 Generate Plan\001 +4 1 -1 0 0 28 18 0.0000 4 195 1890 5700 8400 Choose Path &\001 +4 1 -1 0 0 28 18 0.0000 4 240 900 7605 5925 simple\001 +4 1 -1 0 0 28 18 0.0000 4 240 1125 5715 6660 complex\001 +4 0 -1 0 0 0 24 0.0000 4 330 1290 600 1470 Program\001 +4 0 -1 0 0 0 24 0.0000 4 255 735 600 1890 Flow\001 +4 0 -1 0 0 0 24 0.0000 4 330 1800 600 1050 PostgreSQL\001 diff --git a/src/tools/flow.gif b/src/tools/flow.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d697a39f069ce69ba72e8913949e553a4549c7e GIT binary patch literal 8444 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 literal 0 HcmV?d00001 -- 2.50.0