mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
155e78f014
BitKeeper/deleted/.del-ex_access.wpj~3df6ae8c99bf7c5f: Delete: bdb/build_vxworks/ex_access/ex_access.wpj BitKeeper/deleted/.del-ex_btrec.wpj~a7622f1c6f432dc6: Delete: bdb/build_vxworks/ex_btrec/ex_btrec.wpj BitKeeper/deleted/.del-ex_dbclient.wpj~7345440f3b204cdd: Delete: bdb/build_vxworks/ex_dbclient/ex_dbclient.wpj BitKeeper/deleted/.del-ex_env.wpj~fbe1ab10b04e8b74: Delete: bdb/build_vxworks/ex_env/ex_env.wpj BitKeeper/deleted/.del-ex_mpool.wpj~4479cfd5c45f327d: Delete: bdb/build_vxworks/ex_mpool/ex_mpool.wpj BitKeeper/deleted/.del-ex_tpcb.wpj~f78093006e14bf41: Delete: bdb/build_vxworks/ex_tpcb/ex_tpcb.wpj BitKeeper/deleted/.del-db_buildall.dsp~bd749ff6da11682: Delete: bdb/build_win32/db_buildall.dsp BitKeeper/deleted/.del-cxx_app.cpp~ad8df8e0791011ed: Delete: bdb/cxx/cxx_app.cpp BitKeeper/deleted/.del-cxx_log.cpp~a50ff3118fe06952: Delete: bdb/cxx/cxx_log.cpp BitKeeper/deleted/.del-cxx_table.cpp~ecd751e79b055556: Delete: bdb/cxx/cxx_table.cpp BitKeeper/deleted/.del-namemap.txt~796a3acd3885d8fd: Delete: bdb/cxx/namemap.txt BitKeeper/deleted/.del-Design.fileop~3ca4da68f1727373: Delete: bdb/db/Design.fileop BitKeeper/deleted/.del-db185_int.h~61bee3736e7959ef: Delete: bdb/db185/db185_int.h BitKeeper/deleted/.del-acconfig.h~411e8854d67ad8b5: Delete: bdb/dist/acconfig.h BitKeeper/deleted/.del-mutex.m4~a13383cde18a64e1: Delete: bdb/dist/aclocal/mutex.m4 BitKeeper/deleted/.del-options.m4~b9d0ca637213750a: Delete: bdb/dist/aclocal/options.m4 BitKeeper/deleted/.del-programs.m4~3ce7890b47732b30: Delete: bdb/dist/aclocal/programs.m4 BitKeeper/deleted/.del-tcl.m4~f944e2db93c3b6db: Delete: bdb/dist/aclocal/tcl.m4 BitKeeper/deleted/.del-types.m4~59cae158c9a32cff: Delete: bdb/dist/aclocal/types.m4 BitKeeper/deleted/.del-script~d38f6d3a4f159cb4: Delete: bdb/dist/build/script BitKeeper/deleted/.del-configure.in~ac795a92c8fe049c: Delete: bdb/dist/configure.in BitKeeper/deleted/.del-ltconfig~66bbd007d8024af: Delete: bdb/dist/ltconfig BitKeeper/deleted/.del-rec_ctemp~a28554362534f00a: Delete: bdb/dist/rec_ctemp BitKeeper/deleted/.del-s_tcl~2ffe4326459fcd9f: Delete: bdb/dist/s_tcl BitKeeper/deleted/.del-.IGNORE_ME~d8148b08fa7d5d15: Delete: bdb/dist/template/.IGNORE_ME BitKeeper/deleted/.del-btree.h~179f2aefec1753d: Delete: bdb/include/btree.h BitKeeper/deleted/.del-cxx_int.h~6b649c04766508f8: Delete: bdb/include/cxx_int.h BitKeeper/deleted/.del-db.src~6b433ae615b16a8d: Delete: bdb/include/db.src BitKeeper/deleted/.del-db_185.h~ad8b373d9391d35c: Delete: bdb/include/db_185.h BitKeeper/deleted/.del-db_am.h~a714912b6b75932f: Delete: bdb/include/db_am.h BitKeeper/deleted/.del-db_cxx.h~fcafadf45f5d19e9: Delete: bdb/include/db_cxx.h BitKeeper/deleted/.del-db_dispatch.h~6844f20f7eb46904: Delete: bdb/include/db_dispatch.h BitKeeper/deleted/.del-db_int.src~419a3f48b6a01da7: Delete: bdb/include/db_int.src BitKeeper/deleted/.del-db_join.h~76f9747a42c3399a: Delete: bdb/include/db_join.h BitKeeper/deleted/.del-db_page.h~e302ca3a4db3abdc: Delete: bdb/include/db_page.h BitKeeper/deleted/.del-db_server_int.h~e1d20b6ba3bca1ab: Delete: bdb/include/db_server_int.h BitKeeper/deleted/.del-db_shash.h~5fbf2d696fac90f3: Delete: bdb/include/db_shash.h BitKeeper/deleted/.del-db_swap.h~1e60887550864a59: Delete: bdb/include/db_swap.h BitKeeper/deleted/.del-db_upgrade.h~c644eee73701fc8d: Delete: bdb/include/db_upgrade.h BitKeeper/deleted/.del-db_verify.h~b8d6c297c61f342e: Delete: bdb/include/db_verify.h BitKeeper/deleted/.del-debug.h~dc2b4f2cf27ccebc: Delete: bdb/include/debug.h BitKeeper/deleted/.del-hash.h~2aaa548b28882dfb: Delete: bdb/include/hash.h BitKeeper/deleted/.del-lock.h~a761c1b7de57b77f: Delete: bdb/include/lock.h BitKeeper/deleted/.del-log.h~ff20184238e35e4d: Delete: bdb/include/log.h BitKeeper/deleted/.del-mp.h~7e317597622f3411: Delete: bdb/include/mp.h BitKeeper/deleted/.del-mutex.h~d3ae7a2977a68137: Delete: bdb/include/mutex.h BitKeeper/deleted/.del-os.h~91867cc8757cd0e3: Delete: bdb/include/os.h BitKeeper/deleted/.del-os_jump.h~e1b939fa5151d4be: Delete: bdb/include/os_jump.h BitKeeper/deleted/.del-qam.h~6fad0c1b5723d597: Delete: bdb/include/qam.h BitKeeper/deleted/.del-queue.h~4c72c0826c123d5: Delete: bdb/include/queue.h BitKeeper/deleted/.del-region.h~513fe04d977ca0fc: Delete: bdb/include/region.h BitKeeper/deleted/.del-shqueue.h~525fc3e6c2025c36: Delete: bdb/include/shqueue.h BitKeeper/deleted/.del-tcl_db.h~c536fd61a844f23f: Delete: bdb/include/tcl_db.h BitKeeper/deleted/.del-txn.h~c8d94b221ec147e4: Delete: bdb/include/txn.h BitKeeper/deleted/.del-xa.h~ecc466493aae9d9a: Delete: bdb/include/xa.h BitKeeper/deleted/.del-DbRecoveryInit.java~756b52601a0b9023: Delete: bdb/java/src/com/sleepycat/db/DbRecoveryInit.java BitKeeper/deleted/.del-DbTxnRecover.java~74607cba7ab89d6d: Delete: bdb/java/src/com/sleepycat/db/DbTxnRecover.java BitKeeper/deleted/.del-lock_conflict.c~fc5e0f14cf597a2b: Delete: bdb/lock/lock_conflict.c BitKeeper/deleted/.del-log.src~53ac9e7b5cb023f2: Delete: bdb/log/log.src BitKeeper/deleted/.del-log_findckp.c~24287f008916e81f: Delete: bdb/log/log_findckp.c BitKeeper/deleted/.del-log_rec.c~d51711f2cac09297: Delete: bdb/log/log_rec.c BitKeeper/deleted/.del-log_register.c~b40bb4efac75ca15: Delete: bdb/log/log_register.c BitKeeper/deleted/.del-Design~b3d0f179f2767b: Delete: bdb/mp/Design BitKeeper/deleted/.del-os_finit.c~95dbefc6fe79b26c: Delete: bdb/os/os_finit.c BitKeeper/deleted/.del-os_abs.c~df95d1e7db81924: Delete: bdb/os_vxworks/os_abs.c BitKeeper/deleted/.del-os_finit.c~803b484bdb9d0122: Delete: bdb/os_vxworks/os_finit.c BitKeeper/deleted/.del-os_map.c~3a6d7926398b76d3: Delete: bdb/os_vxworks/os_map.c BitKeeper/deleted/.del-os_finit.c~19a227c6d3c78ad: Delete: bdb/os_win32/os_finit.c BitKeeper/deleted/.del-log-corruption.patch~1cf2ecc7c6408d5d: Delete: bdb/patches/log-corruption.patch BitKeeper/deleted/.del-Btree.pm~af6d0c5eaed4a98e: Delete: bdb/perl.BerkeleyDB/BerkeleyDB/Btree.pm BitKeeper/deleted/.del-BerkeleyDB.pm~7244036d4482643: Delete: bdb/perl.BerkeleyDB/BerkeleyDB.pm BitKeeper/deleted/.del-BerkeleyDB.pod~e7b18fd6132448e3: Delete: bdb/perl.BerkeleyDB/BerkeleyDB.pod BitKeeper/deleted/.del-Hash.pm~10292a26c06a5c95: Delete: bdb/perl.BerkeleyDB/BerkeleyDB/Hash.pm BitKeeper/deleted/.del-BerkeleyDB.pod.P~79f76a1495eda203: Delete: bdb/perl.BerkeleyDB/BerkeleyDB.pod.P BitKeeper/deleted/.del-BerkeleyDB.xs~80c99afbd98e392c: Delete: bdb/perl.BerkeleyDB/BerkeleyDB.xs BitKeeper/deleted/.del-Changes~729c1891efa60de9: Delete: bdb/perl.BerkeleyDB/Changes BitKeeper/deleted/.del-MANIFEST~63a1e34aecf157a0: Delete: bdb/perl.BerkeleyDB/MANIFEST BitKeeper/deleted/.del-Makefile.PL~c68797707d8df87a: Delete: bdb/perl.BerkeleyDB/Makefile.PL BitKeeper/deleted/.del-README~5f2f579b1a241407: Delete: bdb/perl.BerkeleyDB/README BitKeeper/deleted/.del-Todo~dca3c66c193adda9: Delete: bdb/perl.BerkeleyDB/Todo BitKeeper/deleted/.del-config.in~ae81681e450e0999: Delete: bdb/perl.BerkeleyDB/config.in BitKeeper/deleted/.del-dbinfo~28ad67d83be4f68e: Delete: bdb/perl.BerkeleyDB/dbinfo BitKeeper/deleted/.del-mkconsts~543ab60669c7a04e: Delete: bdb/perl.BerkeleyDB/mkconsts BitKeeper/deleted/.del-mkpod~182c0ca54e439afb: Delete: bdb/perl.BerkeleyDB/mkpod BitKeeper/deleted/.del-5.004~e008cb5a48805543: Delete: bdb/perl.BerkeleyDB/patches/5.004 BitKeeper/deleted/.del-irix_6_5.pl~61662bb08afcdec8: Delete: bdb/perl.BerkeleyDB/hints/irix_6_5.pl BitKeeper/deleted/.del-solaris.pl~6771e7182394e152: Delete: bdb/perl.BerkeleyDB/hints/solaris.pl BitKeeper/deleted/.del-typemap~783b8f5295b05f3d: Delete: bdb/perl.BerkeleyDB/typemap BitKeeper/deleted/.del-5.004_01~6081ce2fff7b0bc: Delete: bdb/perl.BerkeleyDB/patches/5.004_01 BitKeeper/deleted/.del-5.004_02~87214eac35ad9e6: Delete: bdb/perl.BerkeleyDB/patches/5.004_02 BitKeeper/deleted/.del-5.004_03~9a672becec7cb40f: Delete: bdb/perl.BerkeleyDB/patches/5.004_03 BitKeeper/deleted/.del-5.004_04~e326cb51af09d154: Delete: bdb/perl.BerkeleyDB/patches/5.004_04 BitKeeper/deleted/.del-5.004_05~7ab457a1e41a92fe: Delete: bdb/perl.BerkeleyDB/patches/5.004_05 BitKeeper/deleted/.del-5.005~f9e2d59b5964cd4b: Delete: bdb/perl.BerkeleyDB/patches/5.005 BitKeeper/deleted/.del-5.005_01~3eb9fb7b5842ea8e: Delete: bdb/perl.BerkeleyDB/patches/5.005_01 BitKeeper/deleted/.del-5.005_02~67477ce0bef717cb: Delete: bdb/perl.BerkeleyDB/patches/5.005_02 BitKeeper/deleted/.del-5.005_03~c4c29a1fb21e290a: Delete: bdb/perl.BerkeleyDB/patches/5.005_03 BitKeeper/deleted/.del-5.6.0~e1fb9897d124ee22: Delete: bdb/perl.BerkeleyDB/patches/5.6.0 BitKeeper/deleted/.del-btree.t~e4a1a3c675ddc406: Delete: bdb/perl.BerkeleyDB/t/btree.t BitKeeper/deleted/.del-db-3.0.t~d2c60991d84558f2: Delete: bdb/perl.BerkeleyDB/t/db-3.0.t BitKeeper/deleted/.del-db-3.1.t~6ee88cd13f55e018: Delete: bdb/perl.BerkeleyDB/t/db-3.1.t BitKeeper/deleted/.del-db-3.2.t~f73b6461f98fd1cf: Delete: bdb/perl.BerkeleyDB/t/db-3.2.t BitKeeper/deleted/.del-destroy.t~cc6a2ae1980a2ecd: Delete: bdb/perl.BerkeleyDB/t/destroy.t BitKeeper/deleted/.del-env.t~a8604a4499c4bd07: Delete: bdb/perl.BerkeleyDB/t/env.t BitKeeper/deleted/.del-examples.t~2571b77c3cc75574: Delete: bdb/perl.BerkeleyDB/t/examples.t BitKeeper/deleted/.del-examples.t.T~8228bdd75ac78b88: Delete: bdb/perl.BerkeleyDB/t/examples.t.T BitKeeper/deleted/.del-examples3.t.T~66a186897a87026d: Delete: bdb/perl.BerkeleyDB/t/examples3.t.T BitKeeper/deleted/.del-examples3.t~fe3822ba2f2d7f83: Delete: bdb/perl.BerkeleyDB/t/examples3.t BitKeeper/deleted/.del-filter.t~f87b045c1b708637: Delete: bdb/perl.BerkeleyDB/t/filter.t BitKeeper/deleted/.del-hash.t~616bfb4d644de3a3: Delete: bdb/perl.BerkeleyDB/t/hash.t BitKeeper/deleted/.del-join.t~29fc39f74a83ca22: Delete: bdb/perl.BerkeleyDB/t/join.t BitKeeper/deleted/.del-mldbm.t~31f5015341eea040: Delete: bdb/perl.BerkeleyDB/t/mldbm.t BitKeeper/deleted/.del-queue.t~8f338034ce44a641: Delete: bdb/perl.BerkeleyDB/t/queue.t BitKeeper/deleted/.del-recno.t~d4ddbd3743add63e: Delete: bdb/perl.BerkeleyDB/t/recno.t BitKeeper/deleted/.del-strict.t~6885cdd2ea71ca2d: Delete: bdb/perl.BerkeleyDB/t/strict.t BitKeeper/deleted/.del-subdb.t~aab62a5d5864c603: Delete: bdb/perl.BerkeleyDB/t/subdb.t BitKeeper/deleted/.del-txn.t~65033b8558ae1216: Delete: bdb/perl.BerkeleyDB/t/txn.t BitKeeper/deleted/.del-unknown.t~f3710458682665e1: Delete: bdb/perl.BerkeleyDB/t/unknown.t BitKeeper/deleted/.del-Changes~436f74a5c414c65b: Delete: bdb/perl.DB_File/Changes BitKeeper/deleted/.del-DB_File.pm~ae0951c6c7665a82: Delete: bdb/perl.DB_File/DB_File.pm BitKeeper/deleted/.del-DB_File.xs~89e49a0b5556f1d8: Delete: bdb/perl.DB_File/DB_File.xs BitKeeper/deleted/.del-DB_File_BS~290fad5dbbb87069: Delete: bdb/perl.DB_File/DB_File_BS BitKeeper/deleted/.del-MANIFEST~90ee581572bdd4ac: Delete: bdb/perl.DB_File/MANIFEST BitKeeper/deleted/.del-Makefile.PL~ac0567bb5a377e38: Delete: bdb/perl.DB_File/Makefile.PL BitKeeper/deleted/.del-README~77e924a5a9bae6b3: Delete: bdb/perl.DB_File/README BitKeeper/deleted/.del-config.in~ab4c2792b86a810b: Delete: bdb/perl.DB_File/config.in BitKeeper/deleted/.del-dbinfo~461c43b30fab2cb: Delete: bdb/perl.DB_File/dbinfo BitKeeper/deleted/.del-dynixptx.pl~50dcddfae25d17e9: Delete: bdb/perl.DB_File/hints/dynixptx.pl BitKeeper/deleted/.del-typemap~55cffb3288a9e587: Delete: bdb/perl.DB_File/typemap BitKeeper/deleted/.del-version.c~a4df0e646f8b3975: Delete: bdb/perl.DB_File/version.c BitKeeper/deleted/.del-5.004_01~d6830d0082702af7: Delete: bdb/perl.DB_File/patches/5.004_01 BitKeeper/deleted/.del-5.004_02~78b082dc80c91031: Delete: bdb/perl.DB_File/patches/5.004_02 BitKeeper/deleted/.del-5.004~4411ec2e3c9e008b: Delete: bdb/perl.DB_File/patches/5.004 BitKeeper/deleted/.del-sco.pl~1e795fe14fe4dcfe: Delete: bdb/perl.DB_File/hints/sco.pl BitKeeper/deleted/.del-5.004_03~33f274648b160d95: Delete: bdb/perl.DB_File/patches/5.004_03 BitKeeper/deleted/.del-5.004_04~8f3d1b3cf18bb20a: Delete: bdb/perl.DB_File/patches/5.004_04 BitKeeper/deleted/.del-5.004_05~9c0f02e7331e142: Delete: bdb/perl.DB_File/patches/5.004_05 BitKeeper/deleted/.del-5.005~c2108cb2e3c8d951: Delete: bdb/perl.DB_File/patches/5.005 BitKeeper/deleted/.del-5.005_01~3b45e9673afc4cfa: Delete: bdb/perl.DB_File/patches/5.005_01 BitKeeper/deleted/.del-5.005_02~9fe5766bb02a4522: Delete: bdb/perl.DB_File/patches/5.005_02 BitKeeper/deleted/.del-5.005_03~ffa1c38c19ae72ea: Delete: bdb/perl.DB_File/patches/5.005_03 BitKeeper/deleted/.del-5.6.0~373be3a5ce47be85: Delete: bdb/perl.DB_File/patches/5.6.0 BitKeeper/deleted/.del-db-btree.t~3231595a1c241eb3: Delete: bdb/perl.DB_File/t/db-btree.t BitKeeper/deleted/.del-db-hash.t~7c4ad0c795c7fad2: Delete: bdb/perl.DB_File/t/db-hash.t BitKeeper/deleted/.del-db-recno.t~6c2d3d80b9ba4a50: Delete: bdb/perl.DB_File/t/db-recno.t BitKeeper/deleted/.del-db_server.sed~cdb00ebcd48a64e2: Delete: bdb/rpc_server/db_server.sed BitKeeper/deleted/.del-db_server_proc.c~d46c8f409c3747f4: Delete: bdb/rpc_server/db_server_proc.c BitKeeper/deleted/.del-db_server_svc.sed~3f5e59f334fa4607: Delete: bdb/rpc_server/db_server_svc.sed BitKeeper/deleted/.del-db_server_util.c~a809f3a4629acda: Delete: bdb/rpc_server/db_server_util.c BitKeeper/deleted/.del-log.tcl~ff1b41f1355b97d7: Delete: bdb/test/log.tcl BitKeeper/deleted/.del-mpool.tcl~b0df4dc1b04db26c: Delete: bdb/test/mpool.tcl BitKeeper/deleted/.del-mutex.tcl~52fd5c73a150565: Delete: bdb/test/mutex.tcl BitKeeper/deleted/.del-txn.tcl~c4ff071550b5446e: Delete: bdb/test/txn.tcl BitKeeper/deleted/.del-README~e800a12a5392010a: Delete: bdb/test/upgrade/README BitKeeper/deleted/.del-pack-2.6.6.pl~89d5076d758d3e98: Delete: bdb/test/upgrade/generate-2.X/pack-2.6.6.pl BitKeeper/deleted/.del-test-2.6.patch~4a52dc83d447547b: Delete: bdb/test/upgrade/generate-2.X/test-2.6.patch
844 lines
26 KiB
Awk
844 lines
26 KiB
Awk
#!/bin/sh -
|
|
#
|
|
# See the file LICENSE for redistribution information.
|
|
#
|
|
# Copyright (c) 1996-2002
|
|
# Sleepycat Software. All rights reserved.
|
|
#
|
|
# $Id: gen_rec.awk,v 11.70 2002/08/08 15:44:47 bostic Exp $
|
|
#
|
|
|
|
# This awk script generates all the log, print, and read routines for the DB
|
|
# logging. It also generates a template for the recovery functions (these
|
|
# functions must still be edited, but are highly stylized and the initial
|
|
# template gets you a fair way along the path).
|
|
#
|
|
# For a given file prefix.src, we generate a file prefix_auto.c, and a file
|
|
# prefix_auto.h that contains:
|
|
#
|
|
# external declarations for the file's functions
|
|
# defines for the physical record types
|
|
# (logical types are defined in each subsystem manually)
|
|
# structures to contain the data unmarshalled from the log.
|
|
#
|
|
# This awk script requires that four variables be set when it is called:
|
|
#
|
|
# source_file -- the C source file being created
|
|
# header_file -- the C #include file being created
|
|
# template_file -- the template file being created
|
|
#
|
|
# And stdin must be the input file that defines the recovery setup.
|
|
#
|
|
# Within each file prefix.src, we use a number of public keywords (documented
|
|
# in the reference guide) as well as the following ones which are private to
|
|
# DB:
|
|
# DBPRIVATE Indicates that a file will be built as part of DB,
|
|
# rather than compiled independently, and so can use
|
|
# DB-private interfaces (such as DB_NOCOPY).
|
|
# DB A DB handle. Logs the dbreg fileid for that handle,
|
|
# and makes the *_log interface take a DB * instead of a
|
|
# DB_ENV *.
|
|
# PGDBT Just like DBT, only we know it stores a page or page
|
|
# header, so we can byte-swap it (once we write the
|
|
# byte-swapping code, which doesn't exist yet).
|
|
# WRLOCK
|
|
# WRLOCKNZ An ARG that stores a db_pgno_t, which the getpgnos
|
|
# function should acquire a lock on. WRLOCK implies
|
|
# that we should always get the lock; WRLOCKNZ implies
|
|
# that we should do so if and only if the pgno is non-zero
|
|
# (unfortunately, 0 is both PGNO_INVALID and the main
|
|
# metadata page number).
|
|
|
|
BEGIN {
|
|
if (source_file == "" ||
|
|
header_file == "" || template_file == "") {
|
|
print "Usage: gen_rec.awk requires three variables to be set:"
|
|
print "\tsource_file\t-- the C source file being created"
|
|
print "\theader_file\t-- the C #include file being created"
|
|
print "\ttemplate_file\t-- the template file being created"
|
|
exit
|
|
}
|
|
FS="[\t ][\t ]*"
|
|
CFILE=source_file
|
|
HFILE=header_file
|
|
TFILE=template_file
|
|
dbprivate = 0
|
|
}
|
|
/^[ ]*DBPRIVATE/ {
|
|
dbprivate = 1
|
|
}
|
|
/^[ ]*PREFIX/ {
|
|
prefix = $2
|
|
num_funcs = 0;
|
|
|
|
# Start .c file.
|
|
printf("/* Do not edit: automatically built by gen_rec.awk. */\n") \
|
|
> CFILE
|
|
|
|
# Start .h file, make the entire file conditional.
|
|
printf("/* Do not edit: automatically built by gen_rec.awk. */\n\n") \
|
|
> HFILE
|
|
printf("#ifndef\t%s_AUTO_H\n#define\t%s_AUTO_H\n", prefix, prefix) \
|
|
>> HFILE;
|
|
|
|
# Write recovery template file headers
|
|
# This assumes we're doing DB recovery.
|
|
printf("#include \"db_config.h\"\n\n") > TFILE
|
|
printf("#ifndef NO_SYSTEM_INCLUDES\n") >> TFILE
|
|
printf("#include <sys/types.h>\n\n") >> TFILE
|
|
printf("#include <string.h>\n") >> TFILE
|
|
printf("#endif\n\n") >> TFILE
|
|
printf("#include \"db_int.h\"\n") >> TFILE
|
|
printf("#include \"dbinc/db_page.h\"\n") >> TFILE
|
|
printf("#include \"dbinc/%s.h\"\n", prefix) >> TFILE
|
|
printf("#include \"dbinc/log.h\"\n\n") >> TFILE
|
|
}
|
|
/^[ ]*INCLUDE/ {
|
|
if ($3 == "")
|
|
printf("%s\n", $2) >> CFILE
|
|
else
|
|
printf("%s %s\n", $2, $3) >> CFILE
|
|
}
|
|
/^[ ]*(BEGIN|IGNORED)/ {
|
|
if (in_begin) {
|
|
print "Invalid format: missing END statement"
|
|
exit
|
|
}
|
|
in_begin = 1;
|
|
is_dbt = 0;
|
|
has_dbp = 0;
|
|
is_uint = 0;
|
|
need_log_function = ($1 == "BEGIN");
|
|
nvars = 0;
|
|
|
|
# number of locks that the getpgnos functions will return
|
|
nlocks = 0;
|
|
|
|
thisfunc = $2;
|
|
funcname = sprintf("%s_%s", prefix, $2);
|
|
|
|
rectype = $3;
|
|
|
|
funcs[num_funcs] = funcname;
|
|
++num_funcs;
|
|
}
|
|
/^[ ]*(DB|ARG|DBT|PGDBT|POINTER|WRLOCK|WRLOCKNZ)/ {
|
|
vars[nvars] = $2;
|
|
types[nvars] = $3;
|
|
atypes[nvars] = $1;
|
|
modes[nvars] = $1;
|
|
formats[nvars] = $NF;
|
|
for (i = 4; i < NF; i++)
|
|
types[nvars] = sprintf("%s %s", types[nvars], $i);
|
|
|
|
if ($1 == "DB") {
|
|
has_dbp = 1;
|
|
}
|
|
|
|
if ($1 == "DB" || $1 == "ARG" || $1 == "WRLOCK" || $1 == "WRLOCKNZ") {
|
|
sizes[nvars] = sprintf("sizeof(u_int32_t)");
|
|
is_uint = 1;
|
|
} else if ($1 == "POINTER")
|
|
sizes[nvars] = sprintf("sizeof(*%s)", $2);
|
|
else { # DBT, PGDBT
|
|
sizes[nvars] = \
|
|
sprintf("sizeof(u_int32_t) + (%s == NULL ? 0 : %s->size)", \
|
|
$2, $2);
|
|
is_dbt = 1;
|
|
}
|
|
nvars++;
|
|
}
|
|
/^[ ]*(WRLOCK|WRLOCKNZ)/ {
|
|
nlocks++;
|
|
|
|
if ($1 == "WRLOCK") {
|
|
lock_if_zero[nlocks] = 1;
|
|
} else {
|
|
lock_if_zero[nlocks] = 0;
|
|
}
|
|
|
|
lock_pgnos[nlocks] = $2;
|
|
}
|
|
/^[ ]*END/ {
|
|
if (!in_begin) {
|
|
print "Invalid format: missing BEGIN statement"
|
|
exit;
|
|
}
|
|
|
|
# Declare the record type.
|
|
printf("#define\tDB_%s\t%d\n", funcname, rectype) >> HFILE
|
|
|
|
# Structure declaration.
|
|
printf("typedef struct _%s_args {\n", funcname) >> HFILE
|
|
|
|
# Here are the required fields for every structure
|
|
printf("\tu_int32_t type;\n\tDB_TXN *txnid;\n") >> HFILE
|
|
printf("\tDB_LSN prev_lsn;\n") >>HFILE
|
|
|
|
# Here are the specified fields.
|
|
for (i = 0; i < nvars; i++) {
|
|
t = types[i];
|
|
if (modes[i] == "POINTER") {
|
|
ndx = index(t, "*");
|
|
t = substr(types[i], 0, ndx - 2);
|
|
}
|
|
printf("\t%s\t%s;\n", t, vars[i]) >> HFILE
|
|
}
|
|
printf("} %s_args;\n\n", funcname) >> HFILE
|
|
|
|
# Output the log, print, read, and getpgnos functions.
|
|
if (need_log_function) {
|
|
log_function();
|
|
|
|
# The getpgnos function calls DB-private (__rep_*) functions,
|
|
# so we only generate it for our own logging functions,
|
|
# not application-specific ones.
|
|
if (dbprivate) {
|
|
getpgnos_function();
|
|
}
|
|
}
|
|
print_function();
|
|
read_function();
|
|
|
|
# Recovery template
|
|
cmd = sprintf(\
|
|
"sed -e s/PREF/%s/ -e s/FUNC/%s/ < template/rec_ctemp >> %s",
|
|
prefix, thisfunc, TFILE)
|
|
system(cmd);
|
|
|
|
# Done writing stuff, reset and continue.
|
|
in_begin = 0;
|
|
}
|
|
|
|
END {
|
|
# End the conditional for the HFILE
|
|
printf("#endif\n") >> HFILE;
|
|
|
|
# Print initialization routine; function prototype
|
|
p[1] = sprintf("int %s_init_print %s%s", prefix,
|
|
"__P((DB_ENV *, int (***)(DB_ENV *, DBT *, DB_LSN *, ",
|
|
"db_recops, void *), size_t *));");
|
|
p[2] = "";
|
|
proto_format(p);
|
|
|
|
# Create the routine to call __db_add_recovery(print_fn, id)
|
|
printf("int\n%s_init_print(dbenv, dtabp, dtabsizep)\n", \
|
|
prefix) >> CFILE;
|
|
printf("\tDB_ENV *dbenv;\n") >> CFILE;;
|
|
printf("\tint (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *,") >> CFILE;
|
|
printf(" db_recops, void *));\n") >> CFILE;
|
|
printf("\tsize_t *dtabsizep;\n{\n") >> CFILE;
|
|
# If application-specific, the user will need a prototype for
|
|
# __db_add_recovery, since they won't have DB's.
|
|
if (!dbprivate) {
|
|
printf("\tint __db_add_recovery __P((DB_ENV *,\n") >> CFILE;
|
|
printf(\
|
|
"\t int (***)(DB_ENV *, DBT *, DB_LSN *, db_recops, void *),\n") >> CFILE;
|
|
printf("\t size_t *,\n") >> CFILE;
|
|
printf(\
|
|
"\t int (*)(DB_ENV *, DBT *, DB_LSN *, db_recops, void *), u_int32_t));\n") \
|
|
>> CFILE;
|
|
}
|
|
|
|
printf("\tint ret;\n\n") >> CFILE;
|
|
for (i = 0; i < num_funcs; i++) {
|
|
printf("\tif ((ret = __db_add_recovery(dbenv, ") >> CFILE;
|
|
printf("dtabp, dtabsizep,\n") >> CFILE;
|
|
printf("\t %s_print, DB_%s)) != 0)\n", \
|
|
funcs[i], funcs[i]) >> CFILE;
|
|
printf("\t\treturn (ret);\n") >> CFILE;
|
|
}
|
|
printf("\treturn (0);\n}\n\n") >> CFILE;
|
|
|
|
# We only want to generate *_init_{getpgnos,recover} functions
|
|
# if this is a DB-private, rather than application-specific,
|
|
# set of recovery functions. Application-specific recovery functions
|
|
# should be dispatched using the DB_ENV->set_app_dispatch callback
|
|
# rather than a DB dispatch table ("dtab").
|
|
if (!dbprivate)
|
|
exit
|
|
|
|
# Page number initialization routine; function prototype
|
|
p[1] = sprintf("int %s_init_getpgnos %s%s", prefix,
|
|
"__P((DB_ENV *, int (***)(DB_ENV *, DBT *, DB_LSN *, ",
|
|
"db_recops, void *), size_t *));");
|
|
p[2] = "";
|
|
proto_format(p);
|
|
|
|
# Create the routine to call db_add_recovery(pgno_fn, id)
|
|
printf("int\n%s_init_getpgnos(dbenv, dtabp, dtabsizep)\n", \
|
|
prefix) >> CFILE;
|
|
printf("\tDB_ENV *dbenv;\n") >> CFILE;
|
|
printf("\tint (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *,") >> CFILE;
|
|
printf(" db_recops, void *));\n") >> CFILE;
|
|
printf("\tsize_t *dtabsizep;\n{\n\tint ret;\n\n") >> CFILE;
|
|
for (i = 0; i < num_funcs; i++) {
|
|
printf("\tif ((ret = __db_add_recovery(dbenv, ") >> CFILE;
|
|
printf("dtabp, dtabsizep,\n") >> CFILE;
|
|
printf("\t %s_getpgnos, DB_%s)) != 0)\n", \
|
|
funcs[i], funcs[i]) >> CFILE;
|
|
printf("\t\treturn (ret);\n") >> CFILE;
|
|
}
|
|
printf("\treturn (0);\n}\n\n") >> CFILE;
|
|
|
|
# Recover initialization routine
|
|
p[1] = sprintf("int %s_init_recover %s%s", prefix,
|
|
"__P((DB_ENV *, int (***)(DB_ENV *, DBT *, DB_LSN *, ",
|
|
"db_recops, void *), size_t *));");
|
|
p[2] = "";
|
|
proto_format(p);
|
|
|
|
# Create the routine to call db_add_recovery(func, id)
|
|
printf("int\n%s_init_recover(dbenv, dtabp, dtabsizep)\n", \
|
|
prefix) >> CFILE;
|
|
printf("\tDB_ENV *dbenv;\n") >> CFILE;
|
|
printf("\tint (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *,") >> CFILE;
|
|
printf(" db_recops, void *));\n") >> CFILE;
|
|
printf("\tsize_t *dtabsizep;\n{\n\tint ret;\n\n") >> CFILE;
|
|
for (i = 0; i < num_funcs; i++) {
|
|
printf("\tif ((ret = __db_add_recovery(dbenv, ") >> CFILE;
|
|
printf("dtabp, dtabsizep,\n") >> CFILE;
|
|
printf("\t %s_recover, DB_%s)) != 0)\n", \
|
|
funcs[i], funcs[i]) >> CFILE;
|
|
printf("\t\treturn (ret);\n") >> CFILE;
|
|
}
|
|
printf("\treturn (0);\n}\n") >> CFILE;
|
|
}
|
|
|
|
function log_function() {
|
|
# Write the log function; function prototype
|
|
pi = 1;
|
|
p[pi++] = sprintf("int %s_log", funcname);
|
|
p[pi++] = " ";
|
|
if (has_dbp == 1) {
|
|
p[pi++] = "__P((DB *, DB_TXN *, DB_LSN *, u_int32_t";
|
|
} else {
|
|
p[pi++] = "__P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t";
|
|
}
|
|
for (i = 0; i < nvars; i++) {
|
|
if (modes[i] == "DB")
|
|
continue;
|
|
p[pi++] = ", ";
|
|
p[pi++] = sprintf("%s%s%s",
|
|
(modes[i] == "DBT" || modes[i] == "PGDBT") ? "const " : "",
|
|
types[i],
|
|
(modes[i] == "DBT" || modes[i] == "PGDBT") ? " *" : "");
|
|
}
|
|
p[pi++] = "";
|
|
p[pi++] = "));";
|
|
p[pi++] = "";
|
|
proto_format(p);
|
|
|
|
# Function declaration
|
|
if (has_dbp == 1) {
|
|
printf("int\n%s_log(dbp, txnid, ret_lsnp, flags", \
|
|
funcname) >> CFILE;
|
|
} else {
|
|
printf("int\n%s_log(dbenv, txnid, ret_lsnp, flags", \
|
|
funcname) >> CFILE;
|
|
}
|
|
for (i = 0; i < nvars; i++) {
|
|
if (modes[i] == "DB") {
|
|
# We pass in fileids on the dbp, so if this is one,
|
|
# skip it.
|
|
continue;
|
|
}
|
|
printf(",") >> CFILE;
|
|
if ((i % 6) == 0)
|
|
printf("\n ") >> CFILE;
|
|
else
|
|
printf(" ") >> CFILE;
|
|
printf("%s", vars[i]) >> CFILE;
|
|
}
|
|
printf(")\n") >> CFILE;
|
|
|
|
# Now print the parameters
|
|
if (has_dbp == 1) {
|
|
printf("\tDB *dbp;\n") >> CFILE;
|
|
} else {
|
|
printf("\tDB_ENV *dbenv;\n") >> CFILE;
|
|
}
|
|
printf("\tDB_TXN *txnid;\n\tDB_LSN *ret_lsnp;\n") >> CFILE;
|
|
printf("\tu_int32_t flags;\n") >> CFILE;
|
|
for (i = 0; i < nvars; i++) {
|
|
# We just skip for modes == DB.
|
|
if (modes[i] == "DBT" || modes[i] == "PGDBT")
|
|
printf("\tconst %s *%s;\n", types[i], vars[i]) >> CFILE;
|
|
else if (modes[i] != "DB")
|
|
printf("\t%s %s;\n", types[i], vars[i]) >> CFILE;
|
|
}
|
|
|
|
# Function body and local decls
|
|
printf("{\n") >> CFILE;
|
|
printf("\tDBT logrec;\n") >> CFILE;
|
|
if (has_dbp == 1)
|
|
printf("\tDB_ENV *dbenv;\n") >> CFILE;
|
|
printf("\tDB_LSN *lsnp, null_lsn;\n") >> CFILE;
|
|
if (is_dbt == 1)
|
|
printf("\tu_int32_t zero;\n") >> CFILE;
|
|
if (is_uint == 1)
|
|
printf("\tu_int32_t uinttmp;\n") >> CFILE;
|
|
printf("\tu_int32_t npad, rectype, txn_num;\n") >> CFILE;
|
|
printf("\tint ret;\n") >> CFILE;
|
|
printf("\tu_int8_t *bp;\n\n") >> CFILE;
|
|
|
|
# Initialization
|
|
if (has_dbp == 1)
|
|
printf("\tdbenv = dbp->dbenv;\n") >> CFILE;
|
|
printf("\trectype = DB_%s;\n", funcname) >> CFILE;
|
|
printf("\tnpad = 0;\n\n") >> CFILE;
|
|
|
|
printf("\tif (txnid == NULL) {\n") >> CFILE;
|
|
printf("\t\ttxn_num = 0;\n") >> CFILE;
|
|
printf("\t\tnull_lsn.file = 0;\n") >> CFILE;
|
|
printf("\t\tnull_lsn.offset = 0;\n") >> CFILE;
|
|
printf("\t\tlsnp = &null_lsn;\n") >> CFILE;
|
|
printf("\t} else {\n") >> CFILE;
|
|
if (funcname != "__db_debug" && dbprivate) {
|
|
printf(\
|
|
"\t\tif (TAILQ_FIRST(&txnid->kids) != NULL &&\n") >> CFILE;
|
|
printf("\t\t (ret = __txn_activekids(") >> CFILE;
|
|
printf("dbenv, rectype, txnid)) != 0)\n") >> CFILE;
|
|
printf("\t\t\treturn (ret);\n") >> CFILE;
|
|
}
|
|
printf("\t\ttxn_num = txnid->txnid;\n") >> CFILE;
|
|
printf("\t\tlsnp = &txnid->last_lsn;\n") >> CFILE;
|
|
printf("\t}\n\n") >> CFILE;
|
|
|
|
# Malloc
|
|
printf("\tlogrec.size = sizeof(rectype) + ") >> CFILE;
|
|
printf("sizeof(txn_num) + sizeof(DB_LSN)") >> CFILE;
|
|
for (i = 0; i < nvars; i++)
|
|
printf("\n\t + %s", sizes[i]) >> CFILE;
|
|
printf(";\n") >> CFILE
|
|
if (dbprivate) {
|
|
printf("\tif (CRYPTO_ON(dbenv)) {\n") >> CFILE;
|
|
printf("\t\tnpad =\n") >> CFILE
|
|
printf(\
|
|
"\t\t ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);\n")\
|
|
>> CFILE;
|
|
printf("\t\tlogrec.size += npad;\n\t}\n\n") >> CFILE
|
|
}
|
|
write_malloc("logrec.data", "logrec.size", CFILE)
|
|
printf("\tif (npad > 0)\n") >> CFILE;
|
|
printf("\t\tmemset((u_int8_t *)logrec.data + logrec.size ") >> CFILE;
|
|
printf("- npad, 0, npad);\n\n") >> CFILE;
|
|
|
|
# Copy args into buffer
|
|
printf("\tbp = logrec.data;\n\n") >> CFILE;
|
|
printf("\tmemcpy(bp, &rectype, sizeof(rectype));\n") >> CFILE;
|
|
printf("\tbp += sizeof(rectype);\n\n") >> CFILE;
|
|
printf("\tmemcpy(bp, &txn_num, sizeof(txn_num));\n") >> CFILE;
|
|
printf("\tbp += sizeof(txn_num);\n\n") >> CFILE;
|
|
printf("\tmemcpy(bp, lsnp, sizeof(DB_LSN));\n") >> CFILE;
|
|
printf("\tbp += sizeof(DB_LSN);\n\n") >> CFILE;
|
|
|
|
for (i = 0; i < nvars; i ++) {
|
|
if (modes[i] == "ARG" || modes[i] == "WRLOCK" || \
|
|
modes[i] == "WRLOCKNZ") {
|
|
printf("\tuinttmp = (u_int32_t)%s;\n", \
|
|
vars[i]) >> CFILE;
|
|
printf("\tmemcpy(bp, &uinttmp, sizeof(uinttmp));\n") \
|
|
>> CFILE;
|
|
printf("\tbp += sizeof(uinttmp);\n\n") >> CFILE;
|
|
} else if (modes[i] == "DBT" || modes[i] == "PGDBT") {
|
|
printf("\tif (%s == NULL) {\n", vars[i]) >> CFILE;
|
|
printf("\t\tzero = 0;\n") >> CFILE;
|
|
printf("\t\tmemcpy(bp, &zero, sizeof(u_int32_t));\n") \
|
|
>> CFILE;
|
|
printf("\t\tbp += sizeof(u_int32_t);\n") >> CFILE;
|
|
printf("\t} else {\n") >> CFILE;
|
|
printf("\t\tmemcpy(bp, &%s->size, ", vars[i]) >> CFILE;
|
|
printf("sizeof(%s->size));\n", vars[i]) >> CFILE;
|
|
printf("\t\tbp += sizeof(%s->size);\n", vars[i]) \
|
|
>> CFILE;
|
|
printf("\t\tmemcpy(bp, %s->data, %s->size);\n", \
|
|
vars[i], vars[i]) >> CFILE;
|
|
printf("\t\tbp += %s->size;\n\t}\n\n", \
|
|
vars[i]) >> CFILE;
|
|
} else if (modes[i] == "DB") {
|
|
# We need to log a DB handle. To do this, we
|
|
# actually just log its fileid; from that, we'll
|
|
# be able to acquire an open handle at recovery time.
|
|
printf("\tDB_ASSERT(dbp->log_filename != NULL);\n") \
|
|
>> CFILE;
|
|
printf("\tif (dbp->log_filename->id == ") >> CFILE;
|
|
printf("DB_LOGFILEID_INVALID &&\n\t ") >> CFILE
|
|
printf("(ret = __dbreg_lazy_id(dbp)) != 0)\n") \
|
|
>> CFILE;
|
|
printf("\t\treturn (ret);\n\n") >> CFILE;
|
|
|
|
printf("\tuinttmp = ") >> CFILE;
|
|
printf("(u_int32_t)dbp->log_filename->id;\n") >> CFILE;
|
|
printf("\tmemcpy(bp, &uinttmp, sizeof(uinttmp));\n") \
|
|
>> CFILE;
|
|
printf("\tbp += sizeof(uinttmp);\n\n") >> CFILE;
|
|
} else { # POINTER
|
|
printf("\tif (%s != NULL)\n", vars[i]) >> CFILE;
|
|
printf("\t\tmemcpy(bp, %s, %s);\n", vars[i], \
|
|
sizes[i]) >> CFILE;
|
|
printf("\telse\n") >> CFILE;
|
|
printf("\t\tmemset(bp, 0, %s);\n", sizes[i]) >> CFILE;
|
|
printf("\tbp += %s;\n\n", sizes[i]) >> CFILE;
|
|
}
|
|
}
|
|
|
|
# Error checking. User code won't have DB_ASSERT available, but
|
|
# this is a pretty unlikely assertion anyway, so we just leave it out
|
|
# rather than requiring assert.h.
|
|
if (dbprivate) {
|
|
printf("\tDB_ASSERT((u_int32_t)") >> CFILE;
|
|
printf("(bp - (u_int8_t *)logrec.data) <= logrec.size);\n") \
|
|
>> CFILE;
|
|
}
|
|
|
|
# Issue log call
|
|
# We didn't call the crypto alignment function when we created this
|
|
# log record (because we don't have the right header files to find
|
|
# the function), so we have to copy the log record to make sure the
|
|
# alignment is correct.
|
|
printf(\
|
|
"\tret = dbenv->log_put(dbenv,\n\t ret_lsnp, (DBT *)&logrec, ") \
|
|
>> CFILE;
|
|
if (dbprivate) {
|
|
printf("flags | DB_NOCOPY);\n") >> CFILE;
|
|
} else {
|
|
printf("flags);\n") >> CFILE;
|
|
}
|
|
|
|
# Update the transactions last_lsn
|
|
printf("\tif (txnid != NULL && ret == 0)\n") >> CFILE;
|
|
printf("\t\ttxnid->last_lsn = *ret_lsnp;\n") >> CFILE;
|
|
|
|
# If out of disk space log writes may fail. If we are debugging
|
|
# that print out which records did not make it to disk.
|
|
printf("#ifdef LOG_DIAGNOSTIC\n") >> CFILE
|
|
printf("\tif (ret != 0)\n") >> CFILE;
|
|
printf("\t\t(void)%s_print(dbenv,\n", funcname) >> CFILE;
|
|
printf("\t\t (DBT *)&logrec, ret_lsnp, NULL, NULL);\n") >> CFILE
|
|
printf("#endif\n") >> CFILE
|
|
|
|
# Free and return
|
|
write_free("logrec.data", CFILE)
|
|
printf("\treturn (ret);\n}\n\n") >> CFILE;
|
|
}
|
|
|
|
function print_function() {
|
|
# Write the print function; function prototype
|
|
p[1] = sprintf("int %s_print", funcname);
|
|
p[2] = " ";
|
|
p[3] = "__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));";
|
|
p[4] = "";
|
|
proto_format(p);
|
|
|
|
# Function declaration
|
|
printf("int\n%s_print(dbenv, ", funcname) >> CFILE;
|
|
printf("dbtp, lsnp, notused2, notused3)\n") >> CFILE;
|
|
printf("\tDB_ENV *dbenv;\n") >> CFILE;
|
|
printf("\tDBT *dbtp;\n") >> CFILE;
|
|
printf("\tDB_LSN *lsnp;\n") >> CFILE;
|
|
printf("\tdb_recops notused2;\n\tvoid *notused3;\n{\n") >> CFILE;
|
|
|
|
# Locals
|
|
printf("\t%s_args *argp;\n", funcname) >> CFILE;
|
|
for (i = 0; i < nvars; i ++)
|
|
if (modes[i] == "DBT" || modes[i] == "PGDBT") {
|
|
printf("\tu_int32_t i;\n") >> CFILE
|
|
printf("\tint ch;\n") >> CFILE
|
|
break;
|
|
}
|
|
|
|
printf("\tint ret;\n\n") >> CFILE;
|
|
|
|
# Get rid of complaints about unused parameters.
|
|
printf("\tnotused2 = DB_TXN_ABORT;\n\tnotused3 = NULL;\n\n") >> CFILE;
|
|
|
|
# Call read routine to initialize structure
|
|
printf("\tif ((ret = %s_read(dbenv, dbtp->data, &argp)) != 0)\n", \
|
|
funcname) >> CFILE;
|
|
printf("\t\treturn (ret);\n") >> CFILE;
|
|
|
|
# Print values in every record
|
|
printf("\t(void)printf(\n\t \"[%%lu][%%lu]%s: ", funcname) >> CFILE;
|
|
printf("rec: %%lu txnid %%lx ") >> CFILE;
|
|
printf("prevlsn [%%lu][%%lu]\\n\",\n") >> CFILE;
|
|
printf("\t (u_long)lsnp->file,\n") >> CFILE;
|
|
printf("\t (u_long)lsnp->offset,\n") >> CFILE;
|
|
printf("\t (u_long)argp->type,\n") >> CFILE;
|
|
printf("\t (u_long)argp->txnid->txnid,\n") >> CFILE;
|
|
printf("\t (u_long)argp->prev_lsn.file,\n") >> CFILE;
|
|
printf("\t (u_long)argp->prev_lsn.offset);\n") >> CFILE;
|
|
|
|
# Now print fields of argp
|
|
for (i = 0; i < nvars; i ++) {
|
|
printf("\t(void)printf(\"\\t%s: ", vars[i]) >> CFILE;
|
|
|
|
if (modes[i] == "DBT" || modes[i] == "PGDBT") {
|
|
printf("\");\n") >> CFILE;
|
|
printf("\tfor (i = 0; i < ") >> CFILE;
|
|
printf("argp->%s.size; i++) {\n", vars[i]) >> CFILE;
|
|
printf("\t\tch = ((u_int8_t *)argp->%s.data)[i];\n", \
|
|
vars[i]) >> CFILE;
|
|
printf("\t\tprintf(isprint(ch) || ch == 0x0a") >> CFILE;
|
|
printf(" ? \"%%c\" : \"%%#x \", ch);\n") >> CFILE;
|
|
printf("\t}\n\t(void)printf(\"\\n\");\n") >> CFILE;
|
|
} else if (types[i] == "DB_LSN *") {
|
|
printf("[%%%s][%%%s]\\n\",\n", \
|
|
formats[i], formats[i]) >> CFILE;
|
|
printf("\t (u_long)argp->%s.file,", \
|
|
vars[i]) >> CFILE;
|
|
printf(" (u_long)argp->%s.offset);\n", \
|
|
vars[i]) >> CFILE;
|
|
} else {
|
|
if (formats[i] == "lx")
|
|
printf("0x") >> CFILE;
|
|
printf("%%%s\\n\", ", formats[i]) >> CFILE;
|
|
if (formats[i] == "lx" || formats[i] == "lu")
|
|
printf("(u_long)") >> CFILE;
|
|
if (formats[i] == "ld")
|
|
printf("(long)") >> CFILE;
|
|
printf("argp->%s);\n", vars[i]) >> CFILE;
|
|
}
|
|
}
|
|
printf("\t(void)printf(\"\\n\");\n") >> CFILE;
|
|
write_free("argp", CFILE);
|
|
printf("\treturn (0);\n") >> CFILE;
|
|
printf("}\n\n") >> CFILE;
|
|
}
|
|
|
|
function read_function() {
|
|
# Write the read function; function prototype
|
|
p[1] = sprintf("int %s_read __P((DB_ENV *, void *,", funcname);
|
|
p[2] = " ";
|
|
p[3] = sprintf("%s_args **));", funcname);
|
|
p[4] = "";
|
|
proto_format(p);
|
|
|
|
# Function declaration
|
|
printf("int\n%s_read(dbenv, recbuf, argpp)\n", funcname) >> CFILE;
|
|
|
|
# Now print the parameters
|
|
printf("\tDB_ENV *dbenv;\n") >> CFILE;
|
|
printf("\tvoid *recbuf;\n") >> CFILE;
|
|
printf("\t%s_args **argpp;\n", funcname) >> CFILE;
|
|
|
|
# Function body and local decls
|
|
printf("{\n\t%s_args *argp;\n", funcname) >> CFILE;
|
|
if (is_uint == 1)
|
|
printf("\tu_int32_t uinttmp;\n") >> CFILE;
|
|
printf("\tu_int8_t *bp;\n") >> CFILE;
|
|
|
|
|
|
if (dbprivate) {
|
|
# We only use dbenv and ret in the private malloc case.
|
|
printf("\tint ret;\n\n") >> CFILE;
|
|
} else {
|
|
printf("\t/* Keep the compiler quiet. */\n") >> CFILE;
|
|
printf("\n\tdbenv = NULL;\n") >> CFILE;
|
|
}
|
|
|
|
malloc_size = sprintf("sizeof(%s_args) + sizeof(DB_TXN)", funcname)
|
|
write_malloc("argp", malloc_size, CFILE)
|
|
|
|
# Set up the pointers to the txnid.
|
|
printf("\targp->txnid = (DB_TXN *)&argp[1];\n\n") >> CFILE;
|
|
|
|
# First get the record type, prev_lsn, and txnid fields.
|
|
|
|
printf("\tbp = recbuf;\n") >> CFILE;
|
|
printf("\tmemcpy(&argp->type, bp, sizeof(argp->type));\n") >> CFILE;
|
|
printf("\tbp += sizeof(argp->type);\n\n") >> CFILE;
|
|
printf("\tmemcpy(&argp->txnid->txnid, bp, ") >> CFILE;
|
|
printf("sizeof(argp->txnid->txnid));\n") >> CFILE;
|
|
printf("\tbp += sizeof(argp->txnid->txnid);\n\n") >> CFILE;
|
|
printf("\tmemcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));\n") >> CFILE;
|
|
printf("\tbp += sizeof(DB_LSN);\n\n") >> CFILE;
|
|
|
|
# Now get rest of data.
|
|
for (i = 0; i < nvars; i ++) {
|
|
if (modes[i] == "DBT" || modes[i] == "PGDBT") {
|
|
printf("\tmemset(&argp->%s, 0, sizeof(argp->%s));\n", \
|
|
vars[i], vars[i]) >> CFILE;
|
|
printf("\tmemcpy(&argp->%s.size, ", vars[i]) >> CFILE;
|
|
printf("bp, sizeof(u_int32_t));\n") >> CFILE;
|
|
printf("\tbp += sizeof(u_int32_t);\n") >> CFILE;
|
|
printf("\targp->%s.data = bp;\n", vars[i]) >> CFILE;
|
|
printf("\tbp += argp->%s.size;\n", vars[i]) >> CFILE;
|
|
} else if (modes[i] == "ARG" || modes[i] == "WRLOCK" || \
|
|
modes[i] == "WRLOCKNZ" || modes[i] == "DB") {
|
|
printf("\tmemcpy(&uinttmp, bp, sizeof(uinttmp));\n") \
|
|
>> CFILE;
|
|
printf("\targp->%s = (%s)uinttmp;\n", vars[i], \
|
|
types[i]) >> CFILE;
|
|
printf("\tbp += sizeof(uinttmp);\n") >> CFILE;
|
|
} else { # POINTER
|
|
printf("\tmemcpy(&argp->%s, bp, ", vars[i]) >> CFILE;
|
|
printf(" sizeof(argp->%s));\n", vars[i]) >> CFILE;
|
|
printf("\tbp += sizeof(argp->%s);\n", vars[i]) >> CFILE;
|
|
}
|
|
printf("\n") >> CFILE;
|
|
}
|
|
|
|
# Free and return
|
|
printf("\t*argpp = argp;\n") >> CFILE;
|
|
printf("\treturn (0);\n}\n\n") >> CFILE;
|
|
}
|
|
|
|
function getpgnos_function() {
|
|
# Write the getpgnos function; function prototype
|
|
p[1] = sprintf("int %s_getpgnos", funcname);
|
|
p[2] = " ";
|
|
p[3] = "__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));";
|
|
p[4] = "";
|
|
proto_format(p);
|
|
|
|
# Function declaration
|
|
printf("int\n%s_getpgnos(dbenv, ", funcname) >> CFILE;
|
|
printf("rec, lsnp, notused1, summary)\n") >> CFILE;
|
|
printf("\tDB_ENV *dbenv;\n") >> CFILE;
|
|
printf("\tDBT *rec;\n") >> CFILE;
|
|
printf("\tDB_LSN *lsnp;\n") >> CFILE;
|
|
printf("\tdb_recops notused1;\n") >> CFILE;
|
|
printf("\tvoid *summary;\n{\n") >> CFILE;
|
|
|
|
# If there are no locks, return this fact.
|
|
if (nlocks == 0) {
|
|
printf("\tTXN_RECS *t;\n") >> CFILE;
|
|
printf("\tint ret;\n") >> CFILE;
|
|
printf("\tCOMPQUIET(rec, NULL);\n") >> CFILE;
|
|
printf("\tCOMPQUIET(notused1, DB_TXN_ABORT);\n") >> CFILE;
|
|
|
|
printf("\n\tt = (TXN_RECS *)summary;\n") >> CFILE;
|
|
printf("\n\tif ((ret = __rep_check_alloc(dbenv, ") >> CFILE;
|
|
printf("t, 1)) != 0)\n") >> CFILE;
|
|
printf("\t\treturn (ret);\n") >> CFILE;
|
|
|
|
printf("\n\tt->array[t->npages].flags = LSN_PAGE_NOLOCK;\n") \
|
|
>> CFILE;
|
|
printf("\tt->array[t->npages].lsn = *lsnp;\n") >> CFILE;
|
|
printf("\tt->array[t->npages].fid = DB_LOGFILEID_INVALID;\n") \
|
|
>> CFILE;
|
|
printf("\tmemset(&t->array[t->npages].pgdesc, 0,\n") >> CFILE;
|
|
printf("\t sizeof(t->array[t->npages].pgdesc));\n") >> CFILE;
|
|
printf("\n\tt->npages++;\n") >> CFILE;
|
|
|
|
printf("\n") >> CFILE;
|
|
printf("\treturn (0);\n") >> CFILE;
|
|
printf("}\n\n") >> CFILE;
|
|
return;
|
|
}
|
|
|
|
# Locals
|
|
printf("\tDB *dbp;\n") >> CFILE;
|
|
printf("\tTXN_RECS *t;\n") >> CFILE;
|
|
printf("\t%s_args *argp;\n", funcname) >> CFILE;
|
|
printf("\tu_int32_t ret;\n\n") >> CFILE;
|
|
|
|
# Shut up compiler.
|
|
printf("\tCOMPQUIET(notused1, DB_TXN_ABORT);\n\n") >> CFILE;
|
|
|
|
printf("\targp = NULL;\n") >> CFILE;
|
|
printf("\tt = (TXN_RECS *)summary;\n\n") >> CFILE;
|
|
|
|
printf("\tif ((ret = %s_read(dbenv, rec->data, &argp)) != 0)\n", \
|
|
funcname) >> CFILE;
|
|
printf("\t\treturn (ret);\n") >> CFILE;
|
|
|
|
# Get file ID.
|
|
printf("\n\tif ((ret = __dbreg_id_to_db(dbenv,\n\t ") >> CFILE;
|
|
printf("argp->txnid, &dbp, argp->fileid, 0)) != 0)\n") >> CFILE;
|
|
printf("\t\tgoto err;\n") >> CFILE;
|
|
|
|
printf("\n\tif ((ret = __rep_check_alloc(dbenv, t, %d)) != 0)\n", \
|
|
nlocks) >> CFILE;
|
|
printf("\t\tgoto err;\n\n") >> CFILE;
|
|
|
|
for (i = 1; i <= nlocks; i++) {
|
|
if (lock_if_zero[i]) {
|
|
indent = "\t";
|
|
} else {
|
|
indent = "\t\t";
|
|
printf("\tif (argp->%s != PGNO_INVALID) {\n", \
|
|
lock_pgnos[i]) >> CFILE;
|
|
}
|
|
printf("%st->array[t->npages].flags = 0;\n", indent) >> CFILE;
|
|
printf("%st->array[t->npages].fid = argp->fileid;\n", indent) \
|
|
>> CFILE;
|
|
printf("%st->array[t->npages].lsn = *lsnp;\n", indent) >> CFILE;
|
|
printf("%st->array[t->npages].pgdesc.pgno = argp->%s;\n", \
|
|
indent, lock_pgnos[i]) >> CFILE;
|
|
printf("%st->array[t->npages].pgdesc.type = DB_PAGE_LOCK;\n", \
|
|
indent) >> CFILE;
|
|
printf("%smemcpy(t->array[t->npages].pgdesc.fileid, ", indent) \
|
|
>> CFILE;
|
|
printf("dbp->fileid,\n%s DB_FILE_ID_LEN);\n", \
|
|
indent, indent) >> CFILE;
|
|
printf("%st->npages++;\n", indent) >> CFILE;
|
|
if (!lock_if_zero[i]) {
|
|
printf("\t}\n") >> CFILE;
|
|
}
|
|
}
|
|
|
|
printf("\nerr:\tif (argp != NULL)\n") >> CFILE;
|
|
write_free("argp", CFILE);
|
|
|
|
printf("\treturn (ret);\n") >> CFILE;
|
|
|
|
printf("}\n\n") >> CFILE;
|
|
}
|
|
|
|
# proto_format --
|
|
# Pretty-print a function prototype.
|
|
function proto_format(p)
|
|
{
|
|
printf("/*\n") >> CFILE;
|
|
|
|
s = "";
|
|
for (i = 1; i in p; ++i)
|
|
s = s p[i];
|
|
|
|
t = " * PUBLIC: "
|
|
if (length(s) + length(t) < 80)
|
|
printf("%s%s", t, s) >> CFILE;
|
|
else {
|
|
split(s, p, "__P");
|
|
len = length(t) + length(p[1]);
|
|
printf("%s%s", t, p[1]) >> CFILE
|
|
|
|
n = split(p[2], comma, ",");
|
|
comma[1] = "__P" comma[1];
|
|
for (i = 1; i <= n; i++) {
|
|
if (len + length(comma[i]) > 70) {
|
|
printf("\n * PUBLIC: ") >> CFILE;
|
|
len = 0;
|
|
}
|
|
printf("%s%s", comma[i], i == n ? "" : ",") >> CFILE;
|
|
len += length(comma[i]) + 2;
|
|
}
|
|
}
|
|
printf("\n */\n") >> CFILE;
|
|
delete p;
|
|
}
|
|
|
|
function write_malloc(ptr, size, file)
|
|
{
|
|
if (dbprivate) {
|
|
printf("\tif ((ret = ") >> file;
|
|
printf(\
|
|
"__os_malloc(dbenv,\n\t " size ", &" ptr ")) != 0)\n") \
|
|
>> file
|
|
printf("\t\treturn (ret);\n\n") >> file;
|
|
} else {
|
|
printf("\tif ((" ptr " = malloc(" size ")) == NULL)\n") >> file
|
|
printf("\t\treturn (ENOMEM);\n\n") >> file
|
|
}
|
|
}
|
|
|
|
function write_free(ptr, file)
|
|
{
|
|
if (dbprivate) {
|
|
printf("\t__os_free(dbenv, " ptr ");\n") >> file
|
|
} else {
|
|
printf("\tfree(" ptr ");\n") >> file
|
|
}
|
|
}
|