O*ZH 8P` (  1L.text((( .data  8@.bss H HP`.loader/)HB(= ,|nx|#x|+xb,;LAA D| S*N!A9H}{x~xH` ,Ab$HvـA| @__start,M H4N @__threads_init!|AfH| FN!Ab ,Ac| CN!Ab,Atc| CN!Ab,Ac| CN!Ab,Ac| CN!AH8!@}N b,AK A__threads_init@AF2_1@|4!HHQAH8!@}N A( call_pth_init<8A L| N |!8/XaDH mA,(A8c@(H 8\aDH EA(8c@aDX8!P}N d,89AT88<9 9@,A<9`9;8`!(W8|8.@8,@,;@`h,8c@aN |N ,*,-//@;eH@;EH@ ;%H;,*A Ht;Hh,*@ ;eHT;,/A H@;H4;,-A, @ ;H;K,@KaN xa̒:`Ԓؒ:`T`}8`|}&;;`;@; ;8!cH !A:d,:dA```!,icA0,h/dAA@H@4H8H0,oA$,tA,v@tHtHT8cH A,@.bh|`QT:@l@-@$@\bl@; .@@bl@; :,A$8ccAXH =A,`vA$;`,A$8cAH A,`{AcH,@ccbcfc'H3i`,@P,@88`xt8!p|} âЂԂ؂ܻN c#HpaAKcCHpQAK8`HpAKtcH xt8!p|} Kbl8P8c@H_A8`HՀxt8!p|} KdccHxt8!p|} KDbl8 8c@H_A8`Hxt8!p|} K8c#HA,`x@Hc#HExt8!p|} K8cCH|yy:NK8cCHUA,`}@cCHxt8!p|} K|8cH)|zy:`MK8cHA,`@hcHxt8!p|â} Ԃ؂ܻN bl8|(.8c@H^QA8`HExt8!p|â} Ԃ؂ܻN 8`H x8!p}âЂԂ؂ܻN  |8`eaA;88;$!aH8aD@HmŀA,A ;@````!8aDH@9A`}88aD`(A(K-`|(8D8c@,8cZ@8`cDHmqA`~8DceHm`,AL8@cH~`,8@(c[PcDHuA`~|8DcEH?`8aD8H8HlŀA,@,@08`x8!p}Aa상N cH?A,8@AcH}`,@4cHl)A8`x8!p}Aa상KblT@8c@8H[A8`x8!p}Aa상K\blT@8c@8H[}A8`x8!p}Aa상KcDcHA`~8DceHk`,AKP,`P8Z@K bl8`T8c@`8ĀHZA8`x8!p}Aa상K |`!DK8.,A<8cHiA,Ac8.HQAPaD;H=)A|~H=EA`~ccH=i`8Tc8`|H=`cDH-`ch8!`}N cH&tcH&`,@cic8blA8@!<D``c`HE8bc|@AHcH&E`8&h,8~_ @Hc`HMx8!p}!Aa상N `Hx8!p}!Aa상K8&|c8blciA8!<@D``c`HM8bc|@APK;>&lcH%%`,@KccH%`,@KX;~&hcH%`,@K;&heH$`,@K ؒܓ!Aa쿁`c|c!pH$`|,;@cdH$e`,@ccH$I`,@X|;dcH$ `,@|:&tcH#`,@hc8l_%H"=```c#A8@cDcaA,<@ 8LL8`H8!PN 8G8`LH8!PN 8F8`LH8!PN 8DHL8!P`8|4T~8cN ,=AD,>@ 8ML8`H8!PN 8E8`LH8!PN 8H8`LH8!PN 8;`;HpA,Ah`!};;{Hp݀A,@ccXT|KD,`,x/XA,,[A`AAp@,@x|,A;8p@ ,@Px8| ,A<x8``!;8cp@,@|(,@ccHX8!P}~cN 88`LH8!PN 8`8,Ad.]8`A,```!8,.]A,8c@8LTH8!P} N 8@K8| K,'@8~;;`,AD,'A<;`!HA,;@|;,,'L3@W,@8@8cK4;}XT8!Pcc|} K,8;}@cK,|/~A4A$@8W8`LH8!PN ,|A 8KL8`H8!PN 8S8`LH8!PN  ,@ 8`N H |p!`888 a8a@| `! 8 C 8Km8!}N "hK@ ``8<aAb(| |!䃢p|0|c 8 T:!Td:8\|c P|xxTd|||6p|"T80| P|`P|e;yA;}t;];=`||A |};yAT||@||cc|.|`H1y`,AT|};yA||AK8`h8!`}!Aa상N 8}聁h8!`}|cஃ!Aa상K8`PTX\8!`N |`!pt8pahxbl8cH/A`8X8!P}N l|`!`,A8`!H"c,@H8!@}N 8<8!@N t``|aA(88b*Ā!PT 6T:(5`caH@|f*;\ @0A8btT:8cP|c .|iN cHh1`HHc8Hf`Hlc8Hf`HXc8He`HDcHn]`H08@H$@HcHn`HcHm`Hā<8cc89Hc]`H8@H8@H8cc8Ha)`Hc88Ha `|Hn!`HtaD@l쀽p| PT~|"PeDHD8cHa`|@aDH |@aDH 8cH``H|@aDH䀜؀D@|Tc~||e PPaDHD@|Tc~||e PPaDHD@|Tc~`| P|c"PaDHPcHo)`H<cHo`H(c8U88Hpu``dcHn`Hc8X888HpE``dcHn`HȀcHn`Hc8H_`Hc888889 9@8|c880|e||`|d.N (8 ``!8 T>+`T 6T:}(|H.,}A|BH,}"a A,>, A,@}&@| Ap@\@| ,@8g;8 ||"`,,>A,@ 80||c,;@ |e.N dTN ||ecTN |hB80|d.N @@K,@@Kt `|T 6T:!,8 8c|*|@8``L8!PN |T>aDHEX}8aD8!PN |8t!H8eTc>8eT|0.(SA(| N dHL`H8!@}N 8!@N dHOE`H8!@}N dHO)`H8!@}N dHN`H8!@}N dHN`H8!@}N dHL`H8!@}N dHK`H8!@}N dHN}`H8!@}N dHLa`H8!@}N dHNe`H8!@}N dHN)`H8!@}N dHN-`H8!@}N dHM`H8!@}N dHM`H8!@}N dHK`H8!@}N dHK`H8!@}N dHM`H8!@}N dHK`H8!@}N dHJ`H8!@}N dHKM`H8!@}N dHM`H8!@}N dHM`H8!@}N dHL`H8!@}N dHL`H8!@}N dHJ`H8!@}N dHL`H8!@}N dHLi`H8!@}N dHLm`H8!@}N dHLQ`H8!@}N dHL`H8!@}N dHL`H8!@}N dHG`H8!@}N dHI`H8!@}N dHK`H8!@}N dHG`H8!@}N dHK`H8!@}N ,|}&|#y`~`!,`9ANW>-@cD`!K,M,A8c@DK5ccA,@̀hd|8!`} N ,@<8c8@K@cK-hd8!`|} KcH@cDK}K`dc8@cKe~d8h|K\88 K x,M `eHN |!`d8`ܐHAd| DN!A,8AH8!@}N P`K |```!`,AA$```!Kc,@c~| ^N!AX8!P}N |a`};`!9axax|;W:8A!T:;c,A8````!KA8T:;c,@;}KAcK݀A|{yaxW:8cApT:;,cAP```!KmA`|ccccK`{8T:;,c@ěh8!`}a상N hTdz8,Tc>(8`|e .`(A |iN @b8cN bN b8cN b8c4N b8cPN b8cpN b8cN b8cN b8cN b8cN b8cN b8cN b8cN b8c4N b8cTN b8clN b8cN b8cN b8cN b8cN b8cN b8cN b8c4N b8cTN b8cxN \,M ,"A,'A,[A,`L H8],M 8|8989@@4}&(8| @P|!aD|(,M 9J|A8|!aD|(,M 9J|@KN }!N ,M KtKK |`!lptx|!AahHP:̑|` |&,%Ab:8,%-AXbAL:88c,%-A4```!:A8c8`,%-@cc$HA:u,A8:::`88:@b,``!8Tz|0.(A$|N 8@@H(:@4HH,:`@$H 8@H:@@ H:@Hc8T8H̀hd8!`|dhlp!tAxa|} Hcc$HK䁁h8!`}!AaN H,^A ,@, -@;>8~KA`z-@|Q@ cHM,@cc$cEHA|Q@ cH!,@:,AKaKeAK, +;>@;>c#Kp;!P8aP,8A$*HLB @;ZH@`,~`4T~A |@8;`|cI@9 8||x, /T~`x@~xA P8aQ, A8 9}C8aH8@``!H9)l98aH8@, @, A8. 9J8i,A<@@9*}J8aH8@9``!Hi9), 8aH8@9A,Ad, A\ ,0@4aC````!9J88c,0A,.@,A80 9J,Ap@,A8j84|( @@Z8- ,dA4|8|.pT0T4T:|P80|28c@PWD9C|0|p|T8|"|*80|P808,YPP-` A@,|@|P|AD8q |P8Q|c*|2|"|"|i``!d8e8C }4,8cTcA080| 8O|cB@`!8c80C b:@K|8+ K,KaC89JKt@88i~ :`!80,/9J8@:8cAK809CKX~P;`LK9KH@,A8_| ````!;Z2@t@KlH@,A8^T8| `!;Z@@KHLA@,^A _| ``!;ZL+@@KHLB @,^A)``!;ZrL3@@Kd8:,@: ,*@ 8|Tc:;#,A `b:c,T@: T,.@ 8bv::,*@ 8|Tc:;,|pA :d,l@ |bv8:,l@ \8:g9,d8A ,s8A ,g8 A ,z8A ,q8A ,Q8A ,w8$A ,c8*A ,o80A ,u86A ,x8A E48T|P|@`;!,@T 6T` 6}:|U @.T@.}HJ}*UK8}JZ}gZUJ:U}JXP}:})RU :} @P|:| P|}d}#~}+H|}L||@||0||0})UUPT8||:| ,@T 6}@:U 6UH@.}eJ}BUj@.U}kR}'U:8,PUl}+bW+:}J}+P}k`P}JZ:` }`}%~} @}g}|}H} } @|} @}U9UGUI8QUHT8}g:}JZ} B| ||B|)@(@8|28;!8 `|(|(c484~`*```!b8HAc |y;9|0:@8| P|`Q@<|P|i80c#980B@``!8c80C ,AY;9cE, A`|#yAT|~"| |AD,A;@@,KH@LA@;@ ; (LB @;@@; $LA@;@`; LB @;@; LA@;@; LB @l;@; LA@T;@; LB @<;@; LA@$;@ ; LB @ ;@@; LA@;@`? K,A 9+Kd|T 6KX:K08|-Tc:: ;;@`c@K8T:;#,@|;>,A\;@@H,AP,AH,@,88aP| ````!8cC b;!P-@K|;@Kb:T>K,:'@:"V>8T:;cb`,@, :~@:~8`be8`,A@8|@ ``!,88A|8@K:A8|4T~8||"|c,^A;!P;@,A ;@,AX|ѮcC|;Z@|Ѯ;C````!cC:s,A|Ѯ;Z@KA ~Ѯ;Z8-|Ѯ@KKyA|nyaA@KX8T:;c|`yA,@: -;@@KﴀcT~HK8T:8T:;8T02T 6|`PC"| .|#yA,@(c8Ha: -;@@HK4c8HAc8V8H1K88KH-@K8~X}| @opc@,oK8K88K`pKh,0Ah,9A`b88:```!|2|:d8:`,0,9A V8|ЂA:K:K:@~1K,0A,9Ab:`g8:'`d,0,9Ap```!V$8|AX:}:|Bf8:$`,0,9@K,"|`,`!aDA888```!H;aD88`,@,caD@c8HIX8!P}N <C08,`@D !Ddl!A*(8d0N 8`0N "h|@M HN ,@ `N H |```!c|yD@,A A D||@A<8}}p|ep8,|h@l|`@P;,@<c|`Ku-`h|T8!`}N Th8!`}N |)p`|p| @|(A0@c |p||)|p`| @`|0AA(KE8Th8!`}N `Kt1A,Ad`~KtM`cKDc|`Kt)`h8!`}|N c8KTh8!`}N AdK< KsA,A`~Ks`K\@KԃT\8!`N `Ks!A|}yAtK `||y!0A`8X8^P8a@KQ8K8a@K,T,LFA 88!}N <;8X88^8a@K8K!8a@K,T,LFAK !|aX\9a\`dH8 hlT:!pAtK遁H8!@}N L!|ax|h|`y8a@`A!A`8!`N 8K8888T:UK8a@Kh8!`}N !0<;|a8X8^8a@8`Ku8K8a@K8!}N X!|aX\8X`dH8hlT:!pAtKIH8!@}N L|`c!KQA8H8!@}N <`c|8!`|!| @,LFBAl8cKoA8`,@H8!@}N 8Ko`H8!@}N <8!@N px!Aaځڡ!AaہۡN @Lfsavpx!Aaʁʡ!AaˁˡN @Lfres$A L| N |!Aa쿁;!aDH`KmA;8c`KmрA;|}ycHA@Km`;c;`Hc8(HA,;@;]},A,```!HyAz;Zz,@cB<8xKl`,@;;: ,8b*@,@h|@aHc$cDccgH`cKAcx8!p}!Aa컁N ,@lHm8\H8g@KyAKaD8ȀHK`Kc8|Kk`,A(c;: 8 Kk`,@;`;Kc8Kk`,Ac8Kku`,Ac8Kk]`,Ac8KkE`,Ac8Kk-`,;:Ac8Kk`,@ ;:Kc8Kj`,Ac8Kj`,@ ;: KXc8Kj`,@ ;:(K8c;:080Kj`,Ac8(Kj}`,Ac8Kje`,Ac8KjM`,Ac8Kj5`,,@$,/ @ AKH@;:(KaD8HK`K;C8c8)HYA8,`,AěcCH9A|yycCA ;9HmA|xyAt,AY,Ac#8,HA,cC@(HUA,c#AHA`~KPH( 9^,;^0 }b||||"|}B}<}\R }|,|   A8`T8@KMA,`zAdT~K]`[88hc8!`}|.!Aa8N bl<8c@8KyQA8`h8!`}!AaK8f@8KyA8`h8!`}!AaKT `fO|8AP`d,AD`!88|8,LFA$@,M 8N N ,@N x,@ 8`N 88H 8,A8b*N 888H (|l\!ahl8ah8pt88~@x|T:!AK_A8~@c`hKCIA8$8~@8 K_]AX8!P}N |}&!K,Na@A܃\,Ap`!8@8,K8=8DK͐aLD,A|K8=8D`aLKD,@@N @ strcatA L| N db_sqlIUsage: %s [-i inputFile] [-h outputHeaderFile] [-o outputFile] [-t testOutputFile] [-d] [-v verificationOutputFile] IBparsing error at end of file: %s IBparsing error at line %d : %s I%s: line %d is too long.IBi:t:o:h:dv:extra argument %s after switch arguments rcwhIBCan't produce test when streaming to stdout IBMCan't produce verify when streaming to stdout Cache size constants, specified in a hint comment in the original DDL int create_%s_env(DB_ENV **envpp) { int ret, flags; char *env_name = "./%s"; if ((ret = db_env_create(envpp, 0)) != 0) { fprintf(stderr, "db_env_create: %%s", db_strerror(ret)); return 1; } (*envpp)->set_errfile(*envpp, stderr); flags = DB_CREATE | DB_INIT_MPOOL; if ((ret = (*envpp)->open(*envpp, env_name, flags, 0)) != 0) { (*envpp)->err(*envpp, ret, "DB_ENV->open: %%s", env_name); return 1; } return 0; } (*envpp)->set_cachesize(*envpp, %s_CACHE_SIZE_GIGA, %s_CACHE_SIZE_BYTES, 1); int create_%s_database(DB_ENV *envp, DB **dbpp) { return create_database(envp, "%s.db", dbpp, DB_CREATE, %s, 0, %s); } NULLThese are custom comparator functions for integer keys. They are needed to make integers sort well on little-endian architectures, such as x86. cf. discussion of btree comparators in 'Getting Started with Data Storage' manual.static int compare_int(DB *dbp, const DBT *a, const DBT *b) { int ai, bi; memcpy(&ai, a->data, sizeof(int)); memcpy(&bi, b->data, sizeof(int)); return (ai - bi); } int compare_long(DB *dbp, const DBT *a, const DBT *b) { long ai, bi; memcpy(&ai, a->data, sizeof(long)); memcpy(&bi, b->data, sizeof(long)); return (ai - bi); } A generic function for creating and opening a databaseint create_database(DB_ENV *envp, char *db_name, DB **dbpp, int flags, DBTYPE type, int moreflags, int (*comparator)(DB *, const DBT *, const DBT *)) { int ret; FILE *errfilep; if ((ret = db_create(dbpp, envp, 0)) != 0) { envp->err(envp, ret, "db_create"); return ret; } if (moreflags != 0) (*dbpp)->set_flags(*dbpp, moreflags); if (comparator != NULL) (*dbpp)->set_bt_compare(*dbpp, comparator); envp->get_errfile(envp, &errfilep); (*dbpp)->set_errfile(*dbpp, errfilep); if ((ret = (*dbpp)->open(*dbpp, NULL, db_name, NULL, type, flags, 0644)) != 0) { (*dbpp)->err(*dbpp, ret, "DB->open: %%s", db_name); return ret; } return 0; } int remove_%s_database(DB_ENV *envp) { return envp->dbremove(envp, NULL, "%s.db", NULL, 0); } int serialize_%s_data(%s_data *%sp, char *buffer) { size_t len; char *p; memset(buffer, 0, %s); p = buffer; len = strlen(%sp->%s) + 1; assert(len <= %s); memcpy(p, %sp->%s, len); p += len; & void deserialize_%s_data(char *buffer, %s_data *%sp) { size_t len; memset(%sp, 0, sizeof(*%sp)); len = strlen(buffer) + 1; assert(len <= %s); memcpy(%sp->%s, buffer, len); buffer += len; int %s_insert_struct( DB *dbp, %s_data *%sp) { DBT key_dbt, data_dbt; char serialized_data[%s]; int ret, serialized_size; %s %s%s_key = %sp->%s; memset(&key_dbt, 0, sizeof(key_dbt)); memset(&data_dbt, 0, sizeof(data_dbt)); key_dbt.data = %s%s_key; key_dbt.size = %s(%s_key)%s; serialized_size = serialize_%s_data(%sp, serialized_data); data_dbt.data = serialized_data; data_dbt.size = serialized_size; if ((ret = dbp->put(dbp, NULL, &key_dbt, &data_dbt, 0)) != 0) { dbp->err(dbp, ret, "Inserting key %%d", %s_key); return -1; } return 0; } *strlensizeof + 1 int get_%s_data(DB *dbp, %s %s%s_key, %s_data *data) { DBT key_dbt, data_dbt; int ret; %s %scanonical_key = %s_key; memset(&key_dbt, 0, sizeof(key_dbt)); memset(&data_dbt, 0, sizeof(data_dbt)); key_dbt.data = %scanonical_key; key_dbt.size = %s(canonical_key)%s; if ((ret = dbp->get(dbp, NULL, &key_dbt, &data_dbt, 0)) != 0) { dbp->err(dbp, ret, "Retrieving key %%d", %s_key); return ret; } assert(data_dbt.size <= %s); deserialize_%s_data(data_dbt.data, data); return 0; } int delete_%s_key(DB *dbp, %s %s%s_key) { DBT key_dbt; int ret; %s %scanonical_key = %s_key; memset(&key_dbt, 0, sizeof(key_dbt)); key_dbt.data = %scanonical_key; key_dbt.size = %s(canonical_key)%s; if ((ret = dbp->del(dbp, NULL, &key_dbt, 0)) != 0) { dbp->err(dbp, ret, "deleting key %%d", %s_key); return ret; } return 0; } int %s_callback(DB *dbp, const DBT *key_dbt, const DBT *data_dbt, DBT *secondary_key_dbt) { int ret; %s_data deserialized_data; deserialize_%s_data(data_dbt->data, &deserialized_data); memset(secondary_key_dbt, 0, sizeof(*secondary_key_dbt)); secondary_key_dbt->size = %s(deserialized_data.%s)%s; secondary_key_dbt->data = malloc(secondary_key_dbt->size); memcpy(secondary_key_dbt->data, %sdeserialized_data.%s, secondary_key_dbt->size); /* tell the caller to free memory referenced by secondary_key_dbt */ secondary_key_dbt->flags = DB_DBT_APPMALLOC; return 0; } int create_%s_secondary(DB_ENV *envp, DB *primary_dbp, DB **secondary_dbpp) { int ret; char * secondary_name = "%s.db"; if ((ret = create_database(envp, secondary_name, secondary_dbpp, DB_CREATE, %s, DB_DUPSORT, %s)) != 0) return ret; if ((ret = primary_dbp->associate(primary_dbp, NULL, *secondary_dbpp, &%s_callback, DB_CREATE)) != 0) { (*secondary_dbpp)->err(*secondary_dbpp, ret, "DB->associate: %%s.db", secondary_name); return ret; } return 0; } int %s_query_iteration(DB *secondary_dbp, %s %s%s_key, %s_iteration_callback user_func, void *user_data) { DBT key_dbt, data_dbt; DBC *cursorp; %s_data deserialized_data; int ret; memset(&key_dbt, 0, sizeof(key_dbt)); memset(&data_dbt, 0, sizeof(data_dbt)); if ((ret = secondary_dbp->cursor(secondary_dbp, NULL, &cursorp, 0)) != 0) { secondary_dbp->err(secondary_dbp, ret, "creating cursor"); return ret; } key_dbt.data = %s%s_key; key_dbt.size = %s(%s_key)%s; for (ret = cursorp->get(cursorp, &key_dbt, &data_dbt, DB_SET); ret == 0; ret = cursorp->get(cursorp, &key_dbt, &data_dbt, DB_NEXT_DUP)) { deserialize_%s_data(data_dbt.data, &deserialized_data); (*user_func)(user_data, &deserialized_data); } if (ret != DB_NOTFOUND) { secondary_dbp->err(secondary_dbp, ret, "Querying secondary"); return ret; } cursorp->close(cursorp); return 0; } int %s_full_iteration(DB *dbp, %s_iteration_callback user_func, void *user_data) { DBT key_dbt, data_dbt; DBC *cursorp; %s_data deserialized_data; int ret; memset(&key_dbt, 0, sizeof(key_dbt)); memset(&data_dbt, 0, sizeof(data_dbt)); if ((ret = dbp->cursor(dbp, NULL, &cursorp, 0)) != 0) { dbp->err(dbp, ret, "creating cursor"); return ret; } while ((ret = cursorp->get(cursorp, &key_dbt, &data_dbt, DB_NEXT)) == 0) { deserialize_%s_data(data_dbt.data, &deserialized_data); (*user_func)(user_data, &deserialized_data); } if (ret != DB_NOTFOUND) { dbp->err(dbp, ret, "Full iteration"); cursorp->close(cursorp); return ret; } cursorp->close(cursorp); return 0; } Header file for a Berkeley DB implementation generated from SQL DDL by db_sql#include #include #include #include #include #include #include "db.h" IBThe table "%s" (defined near line %d) lacks a primary key, which is not allowed. All tables must have a designated primary key. IBThis convenience method invokes all of the environment and database creation methods necessary to initialize the complete BDB environment. It uses the global environment and database pointers declared below. You may bypass this function and use your own environment and database pointers, if you wish.int initialize_%s_environment(); IB extern DB_ENV * %s_envp; I DB_ENV * %s_envp = NULL; I int initialize_%s_environment() { if (create_%s_env(&%s_envp) != 0) goto exit_error; IBM return 0; IBMexit_error: IBM fprintf(stderr, "Stopping initialization because of error\n"); return -1; } IIndex creation and removal functionsIBMFunctions for doing iterations over an entire primary databaseIFunctions for deleting records by keyIBFunctions for retrieving records by keyFunctions for inserting records by providing the full corresponding data structureIBFunctions for inserting records by providing each field value as a separate argumentDatabase removal functionsIDatabase creation/initialization functionsIThe environment creation/initialization functionIBMint create_%s_env(DB_ENV **envpp); IBMThese typedefs are prototypes for the user-written iteration callback functions, which are invoked during full iteration and secondary index queriesArray size constants.IBData structures representing the record layoutsMacros for the maximum length of the records after serialization. This is the maximum size of the data that is storedIBM#define %s_CACHE_SIZE_GIGA %lu #define %s_CACHE_SIZE_BYTES %lu IB#include "%s" DB_BTREEIBMint create_%s_database(DB_ENV *envp, DB **dbpp); Iint remove_%s_database(DB_ENV *envp); #define %s %d Itypedef struct _%s_data { I} %s_data; IBM%s_data %s_data_specimen; %s %s; #define %s (IBM) IBsizeof(%s_data_specimen.%s) + \ IB return p - buffer; } Imemcpy(p, %s%sp->%s, sizeof(%sp->%s)); p += sizeof(%sp->%s); I} memcpy(%s%sp->%s, buffer, sizeof(%sp->%s)); IBMbuffer += sizeof(%sp->%s); int %s_insert_struct(DB *dbp, %s_data *%sp); I%s %s%s, I) Iint %s_insert_fields(DB * dbp, int %s_insert_fields(DB *dbp, I); IBM{ I%s_data data; Ireturn %s_insert_struct(dbp, &data); IBassert(strlen(%s) < %s); IBstrncpy(data.%s, %s, %s); Imemcpy(data.%s, %s, %s); IBdata.%s = %s; Iint get_%s_data(DB *dbp, %s %s%s_key, %s_data *data); int delete_%s_key(DB *dbp, %s %s%s_key); Iextern DB *%s_dbp; DB *%s_dbp = NULL; if (create_%s_database(%s_envp, &%s_dbp) != 0) goto exit_error; I if (create_%s_secondary(%s_envp, %s_dbp, &%s_dbp) != 0) goto exit_error; Iint %s_query_iteration(DB *secondary_dbp, %s %s%s_key, %s_iteration_callback user_func, void *user_data); int remove_%s_index(DB_ENV *envp) { return envp->dbremove(envp, NULL, "%s.db", NULL, 0); } Iint remove_%s_index(DB_ENV * envp); IBint create_%s_secondary(DB_ENV *envp, DB *dbpp, DB **secondary_dbpp); typedef void (*%s_iteration_callback)(void *, %s_data *); int %s_full_iteration(DB *dbp, %s_iteration_callback user_func, void *user_data); &compare_int&compare_longNULL%s_data_%s_length%s[%s]%s_data_serialized_lengthIBintlong"0""zero"0"1""one"11.1"2""two"22.2"3""three"33.3"4""four"44.4"5""five"55.5"6""six"66.6"7""seven"77.7"8""eight"88.8"9""nine"99.9"A""eleven"1111.1"B""twenty-two"2222.2"C""thirty-three"3333.3"D""forty-four"4444.4"E""fifty-five"5555.5"F""sixty-six"6666.6"G""seventy-seven"7777.7"H""eighty-eight"8888.8"I""ninety-nine"9999.9binary_data[DB_NOTFOUNDremove_%s_database(%s_envp); IBSimple test for a Berkeley DB implementation generated from SQL DDL by db_sql IB#include IBM#include #include "%s" IBMTest data for raw binary typesI#define MAXBINSZ %d IBchar binary_data[%d][MAXBINSZ]; IBMint count_iteration; ITest data for input recordIA very simple binary comparison functionIBMint compare_binary(char *p, int len, int dem) { if (memcmp(p, binary_data[dem], len) == 0) { return 0; } else { return 1; } } IBThese are the iteration callback functions. One is defined per database(table). They are used for both full iterations and for secondary index queries. When a retrieval returns multiple records, as in full iteration over an entire database, one of these functions is called for each record foundI main(int argc, char **argv) { int i; int j; int ret; int occurence; I Fill the binary test data with random valuesIBMfor (i = 0; i < %d; i++) for (j = 0; j < MAXBINSZ; j++) binary_data[i][j] = rand(); IBMUse the convenience method to initialize the environment. The initializations for each entity and environment can be done discretely if you prefer, but this is the easy way.IBret = initialize_%s_environment(); if (ret != 0) { printf("Initialize error"); return ret; } IBMNow that everything is initialized, insert some records into each database, retrieve and verify themIBMfor (i = 0; i < %d; i++) { First, insert some records into each database using the ...insert_fields functions. These functions take each field of the record as a separate argumentIBMNext, retrieve the records just inserted, looking them up by their key values} INow try iterating over every record, using the ...full_iteration functions for each database. For each record found, the appropriate ...iteration_callback_test function will be invoked (these are defined above).IBMFor the secondary indexes, query for the known keys. This also results in the ...iteration_callback_test function's being called for each record found.Now delete a record from each database using its primary key.IBexit_error: IBMClose the secondary index databasesClose the primary databasesDelete the secondary index databasesIBMDelete the primary databasesIBMFinally, close the environmentI%s_envp->close(%s_envp, 0); IBMif (ret == 0) printf("*****WELL DONE!*****\n"); Ireturn ret; IBMvoid %s_iteration_callback_test(void *msg, %s_data *%s_record) { IBint i; int same = 0; for (i = 0; i < %d; i++) { IBM) { IBMsame = 1; break; IB} if (same == 0) assert(0); else count_iteration++; if (IBM(compare_binary(%s_record->%s, %s, i) == 0) IBM(strcmp(%s_record->%s, %s_record_array[i].%s) == 0) IBMfloatIBdoubleI(fabs(%s_record->%s - %s_record_array[i].%s) <= 0.00001) IB(%s_record->%s == %s_record_array[i].%s) IB&& %s_data %s_record; %s_data %s_record_array[] = { I{},IB}; IBM{0}charIBMshortIBintlongIBMUnexpected C type in schema: %s, I%s_dbp = NULL; ret = %s_insert_fields( %s_dbp, IBif (ret != 0) { printf("ERROR IN INSERT NO.%%d record in %s_dbp\n", i); goto exit_error; } Ibinary_data[i]I%s_record_array[i].%sIB, ); ret = get_%s_data( %s_dbp, binary_data[i], IBM%s_record_array[i].%s, &%s_record); IBif (ret != 0) { printf("ERROR IN RETRIEVE NO.%%d record in %s_dbp\n", i); goto exit_error; } Iassert(compare_binary(%s_record.%s, %s, i) == 0); strcmp(%s_record.%s, %s_record_array[i].%s) == 0); (fabs(%s_record.%s - %s_record_array[i].%s) <= 0.00001)); I%s_record.%s == %s_record_array[i].%s); IBMcount_iteration = 0; IBret = %s_full_iteration(%s_dbp, &%s_iteration_callback_test, "retrieval of %s record through full iteration"); IBMif (ret != 0) { printf("Full Iteration Error\n"); goto exit_error; } printf("%s full iteration: %%d\n", count_iteration); assert(count_iteration == %d); IB%s_query_iteration(%s_dbp, , &%s_iteration_callback_test, "retrieval of %s record through %s query"); printf("%s_record_array[%%d].%s: %%d\n", i, count_iteration); Iassert(count_iteration == 1); Ioccurence = 0; for (j = 0; j < %d; j++) { if (strcmp(%s_record_array[j].%s, %s_record_array[i].%s) == 0) { IBif (fabs(%s_record_array[j].%s - %s_record_array[i].%s) <= 0.00001) { Iif (%s_record_array[j].%s == %s_record_array[i].%s) { Ioccurence++; IBassert(count_iteration == occurence); I%s%d%cIret = delete_%s_key( %s_dbp, %s); Iif (ret == %s) ret = 0; else { printf("ERROR IN DELETE NO.%d record in %s_dbp\n"); goto exit_error; } IBMif (%s_dbp != NULL) %s_dbp->close(%s_dbp, 0); remove_%s_index(%s_envp); %s%d%ld%f%lf"n""ninety-nine"binary_data9999.5IBMremove_%s_database(%s_envp); IBSimple test for a Berkeley DB implementation generated from SQL DDL by db_sql IB #include "%s" IBMTest data for raw binary typesI#define MAXBINSZ %d IBMchar binary_data[MAXBINSZ]; IBA very simple binary comparison functionIBMchar * compare_binary(char *p, int len) { if (memcmp(p, binary_data, len) == 0) return "*binary values match*"; return "*binary values don't match*"; } IThese are the iteration callback functions. One is defined per database(table). They are used for both full iterations and for secondary index queries. When a retrieval returns multiple records, as in full iteration over an entire database, one of these functions is called for each record foundI main(int argc, char **argv) { int i; int ret; I Fill the binary test data with random valuesIBMfor (i = 0; i < MAXBINSZ; i++) binary_data[i] = rand(); IBUse the convenience method to initialize the environment. The initializations for each entity and environment can be done discretely if you prefer, but this is the easy way.IBret = initialize_%s_environment(); if (ret != 0){ printf("Initialize error"); return ret; } Now that everything is initialized, insert a single record into each database, using the ...insert_fields functions. These functions take each field of the record as a separate argumentNext, retrieve the records just inserted, looking them up by their key valuesNow try iterating over every record, using the ...full_iteration functions for each database. For each record found, the appropriate ...iteration_callback_test function will be invoked (these are defined above).IBMFor the secondary indexes, query for the known keys. This also results in the ...iteration_callback_test function's being called for each record found.Now delete a record from each database using its primary key.IBexit_error: IBMClose the secondary index databasesClose the primary databasesDelete the secondary index databasesIBMDelete the primary databasesIBMFinally, close the environmentI%s_envp->close(%s_envp, 0); IBMreturn ret; IBM} I void %s_iteration_callback_test(void *msg, %s_data *%s_record) { printf("In iteration callback, message is: %%s\n", (char *)msg); IB} charIBMshortIBintlongIBMfloatIBdoubleIUnexpected C type in schema: %sprintf("%s->%s: IBM\n", compare_binary(%s_record->%s, %s)); IB\n", %s_record->%s); IB%s_data %s_record; %s_dbp = NULL; ret = %s_insert_fields( %s_dbp, IBM); if (ret != 0){ printf("Insert error\n"); goto exit_error; } IBM, I printf("Retrieval of %s record by key\n"); IBMret = get_%s_data( %s_dbp, %s, &%s_record); IBif (ret != 0) { printf("Retrieve error\n"); goto exit_error; } Iprintf("%s.%s: \n", compare_binary(%s_record.%s, %s)); IBM\n", %s_record.%s); IBMret = %s_full_iteration(%s_dbp, &%s_iteration_callback_test, "retrieval of %s record through full iteration"); IBMif (ret != 0){ printf("Full Iteration Error\n"); goto exit_error; } IB%s_query_iteration(%s_dbp, , &%s_iteration_callback_test, "retrieval of %s record through %s query"); IBret = delete_%s_key( %s_dbp, %s); Iif (ret != 0) { printf("Delete error\n"); goto exit_error; } IBif (%s_dbp != NULL) %s_dbp->close(%s_dbp, 0); if (%s_dbp != NULL) %s_dbp->close(%s_dbp, 0); remove_%s_index(%s_envp); v",$&s[ WYMR%(NWZ]kr}"N(QRI!\^3TJPS|z!L1IIING`oB~IB:vIIIIII    -0/3568 ;<A !%'EJKF9=&(    'II{`5DXY=4?F/Q;M-hZ\_rq''eDEE$)*.+#44G7G7IIILI__III4444O4$4$444[ X[,+f"1?CMP|Tz{  !&")'89S44Pm2PrPP61-/.5]nl  $ kf !SZXthVdbBqs0WWWW:??:cccZ\cppx|_I3XYwzTNQPRVYopq[\]^_`agi{}mn#&"%)uvyzLNMOxw +,efghi'*( ;<@>=~sljbdR[WSTUe78Q^`ac|AjCDEFGJKHkortuvy{UOEFGHJKLMNOPQRSTNO*+IJKLMNOPQRST:<=>?@ABCDEFGHJKLMNOPQRSTXXn\JKLMNOPQRST*+.NOPQRSTXY|}~<=>?@ABCDEFGHJKLMNOPQRST*+,PQRSTT<=>?@ABCDEFGHnJKLMNOPQRST{:ӓ\ذNOg*+NOXY䴵XXbc\<=>?@ABCDEFGHJKLMNOPQRST*+N|}~ЩXY<=>?@ABCDEFGHJKLMNOPQRST*+STҡ<=>?@ABCDEFGHJKLMNOPQRSTȓXYZ]^_ܓhT*+Z[\]^_`g<=>?@ABCDEFGHJKLMNOPQRSTT [\]^_`Z]^_gԽ2*+h"+ʵ1<=>?@ABCDEFGHJKLMNOPQRSTӓ fؐ)bcdeg*+%n'1<=>?@ABCDEFGHJKLMNOPQRSTZ]^_;h*+*+jlm?@<=>?@ABCDEFGHJKLMNOPQRST\;7  jlm*+XYj\lm%'^<=>?@ABCDEFGHJKLMNOPQRST*+PXYXYXY<=>?@ABCDEFGHrJKLMNOPQRST*+ʓ46<=>?@ABCDEFGHJKLMNOPQRST*+jlmcde=>?@ABCDEFGHJKLMNOPQRST*+cde>?@ABCDEFGHJKLMNOPQRST+XYX0Y:0r46|}:NOrWXY\bNOP[WXY\nynDP|}~p{Щk0o|}~k:o [\NOWXY#\a/q158|}~Xcde;in驪ߡ’¬yvwtxpޘbsba(T⫭īūƳ<̘̘͘&˜¸!pppp\ k pruu,,`g,b$--3bzfqqsfz{DD9$|L====????@@AAABD????@@AAAB<;)>>====????@@AAAB$RCE????@@AAABCE>:@@AAAB$<;)>>=====????@@AAAB^AAAB"8*<;)>>====????@@AAAB$t '<q K=T;:)89$<;)>>=====????@@AAABMk+)n7$<;)>>====????@@AAAB, B <;)>>====????@@AAAB=M$,7#Y\]CES #^rCvWXBP<;)>>====????@@AAAB$&a=vWX=Y\]^" "R%C<;)>>====????@@AAAB$O<.K==Jj&u  ;M11/J~~<;)>>====????@@AAAB$=Y\]rG45L^N~?J}} @<;)>>====????@@AAAB$Gv] -CE@HPi@F#G>"$<;)>>====????@@AAAB99$<;)>>====????@@AAAB0$<F)>>===={????@@AAAB/12@01h$;)>>====s????@@AAABo7{)>>=====????@@AAABHD==(==AHD=w( AF54=b===Fz==`KJefpI;<r&KJ}=I;<HD=(=TUAc o|3!aF =h===KJII;<=6s=t%==u==H== $%=&'(====y I*%=`=+,!=)=-.=*=[4=[=E"e/0 mpq 23,6BE(3:TN[SL9O}UQV-i b ydfX$lx+w62?@ADdpqg GxQ \_~oVZjzkWlc_g8 m!'.5YZ=nKnear "%T": syntax errorparser stack overflowIBset listIBMtoo many arguments on function %TIBindexnot an errorSQL logic error or missing databaseaccess permission deniedcallback requested query abortdatabase is lockeddatabase table is lockedout of memoryattempt to write a readonly databaseinterrupteddisk I/O errordatabase disk image is malformeddatabase or disk is fullunable to open database filetable contains no datadatabase schema has changedString or BLOB exceeded size limitconstraint faileddatatype mismatchlibrary routine called out of sequencelarge file support is disabledauthorization deniedauxiliary database format errorbind or column index out of rangefile is encrypted or is not a databaseunknown error-x0X0thstndrd 0123456789ABCDEF0123456789abcdefd sgzq Q wc ou xXfeEGi n%pT Sr NaN-Inf+InfInfNULL(NULL)IYA ـ?IBM ?Fn9I#ը3L IBM >Ey0:?%.  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~DB_BTREEcharshortintlongfloatdoubleIExtracting name from a null or empty tokenIMalloc failedIBEncountered two CREATE DATABASE statements; only one is allowedPlease specify CREATE DATABASE before CREATE TABLEIThe table name must be simple: %s.%sIBMFound two declarations of a table named %s, at lines %d and %dIThe entity named %s on line %d has the same name as the index at line %d. This is not allowed.The table %s contains two columns with the same name %s; this is not allowed.IBMissing right parenthesis in type expression %s IBMNon-numeric or zero size parameter in type expression %s IBbinvarbinIvarcharvarchar2IBMbittinyintsmallintIBMintegerbigintIrealIBMZero dimension not allowed for %sIBdecimalnumericnumberIUnsupported type %s IBMUnexpected value for second parameter in type expression %s IBMWarning: dimension of string "%s %s" is too small to hold a null-terminated string.Malloc failure Extracting name from a null or empty token Index %s names unknown table %sIndex %s names unknown column %s in table %sIBMFound two declarations of an index named %s, at lines %d and %dThe index named %s on line %d has the same name as the table at line %d. This is not allowed.IForeign Key Constraint not implemented: FromTable %s FromCol %s ToTable %s ToCol %s Unsupported SQL syntax (%s) IBMExprSetHeightIBPExprIBRegisterExprIBMExprSpanIBMExprFunctionIBMExprAssignVarNumberExprDeleteIExprListDeleteIPragmaIAddNotNullIAddCheckConstraintIAddDefaultValueAddCollateTypeICreateViewIDropTableIBDeleteTableInsertIIdListAppendIBMSrcListAppendFromTermIBSrcListShiftJoinTypeIBMIdListDeleteIBMSrcListDeleteIBDropIndexIBSelectISelectDeleteIBMDeleteFromIUpdateIVacuumIBeginTransactionIBMCommitTransactionIBRollbackTransactionBeginTriggerIBMFinishTriggerIBDropTriggerDeleteTriggerStepIBTriggerSelectStepIBTriggerInsertStepIBTriggerUpdateStepIBTriggerDeleteStepIBDeleteTriggerIBJoinTypeIBMAttachIDetachIExprSetCollReindexAlterRenameTableIBMAlterFinishAddColumnIBMAlterBeginAddColumnAnalyzeVtabBeginParseIVtabFinishParseVtabArgInitVtabArgExtendDB_BTREEDB_HASHWarning: IB, near line %d btreeIBhashIBMunknown DBTYPE %s for antecedent %s, using default of DB_BTREEIDBTYPEIUnrecognized index property %sIUnrecognized entity property %sunparseable integer string %sIBunrecognized characters in integer string %sIBMCACHESIZEIBUnrecognized environment property %sIBMProperty setting (%s) with no antecedent SQL statementIWarning: incorrect hint comment syntax with property %sNo value specified for property %s near "%T": syntax error  $'+453.:B [U^J>#eii%qY*uz.-fAt2YY 3js56(k?\m=&E@fAlHgcqojP897 !MYnX-Z6r" aSt]/s) ,NWVROTK`_DLbpCh1(GQdkI*20% !%(/7:=?AFGLUV[_cfkq{~ #(.49=@FJQSZ\^gkqw BEFOREIGNOREGEXPLAINSTEADDESCAPEACHECKEYCONSTRAINTERSECTABLEFTHENDATABASELECTRANSACTIONATURALTERAISELSEXCEPTRIGGEREFERENCESUNIQUERYATTACHAVINGROUPDATEMPORARYBEGINNEREINDEXCLUSIVEXISTSBETWEENOTNULLIKECASCADEFERRABLECASECOLLATECREATECURRENT_DATEDELETEDETACHIMMEDIATEJOINSERTMATCHPLANALYZEPRAGMABORTVALUESVIRTUALIMITWHENWHERENAMEAFTEREPLACEANDEFAULTAUTOINCREMENTCASTCOLUMNCOMMITCONFLICTCROSSCURRENT_TIMESTAMPRIMARYDEFERREDISTINCTDROPFAILFROMFULLGLOBYIFINTOFFSETISNULLORDERESTRICTOUTERIGHTROLLBACKROWUNIONUSINGVACUUMVIEWINITIALLYIBunrecognized token: "%T"IBM   H@(#)23 1.6 src/bos/usr/ccs/lib/libpthreads/init.c, libpth, bos610 6/21/07 15:28:59@(#)61 1.16 src/bos/usr/ccs/lib/libc/__threads_init.c, libcthrd, bos61B, b2007_33A0 8/2/07 13:09:21$` Y$OpIDD?|9$21 /-+*004!<!tabxxx$x$x(x,x4x8x<x@xHxLxPxTx\x`xdxhxpxtxxx|xxxxxxxxxxxxxxxxxxxxxxxxy yyyy,y0y8y<yLyPyXy\ylypyxy|yyyyyyyyyyyyyy(4@LXdp|(   @@ЌЌLЌ(0Lh,Hd (D`|$@\x,<<@Th|<<<<$<<L|< <<<<<<<pp< ,dx0HT`lxx<<<<xLxLxxXdp$0t H8Dt$$0PpP\Phx$Dhxd (DhhDD400000000TpTpd DD|x|P\h  @`<<`lx`<< <d XPdp<<0D<<Xl<<<<ۈ~l~\d (\P\ (  @ #@ "`   ` @    @  ` * *@ ( (` ( & $@  `   . .  - - , ,@ + + +  [` ] ] b a@ _@ _ [@ [ Z Z Y X X` V@ U U S R P@ P O O O@ s s r@ r q q q q p p p n n n` m m` m@ m l l l@    @   $ ( 0 Pw X ?X  ( 4 @ L X d p |              $ 0 < H T ` l x   x    ?x ?|           , 8 D P \ h t      x  ?         ( 4 @ L X d p |      0 H pP ? 8P ? `ۈ ? d h%u.dP.__rtinit ___bzero@@errno@_iob@malloc@ calloc@ realloc@ free@ exit@ strlen@ fopen@ fprintf@ strtoul@ isdigit@ strchr@ atoi@ snprintf@ vfprintf@ tolower@ strrchr@ fgets@ perror@ isspace@ toupper@ __divu64@ isxdigit@ getopt@ @ __crt0v@ optind@optarg@ @ 9@ F@ __rtld@ __start ! &           $ 8 < @ D H L P T X \ ` d h t x |                                       $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                      $ ( , 0 4 8 < @ D H L P T X p t x |                               8 < @ D H L P T X \ ` d h l p t x |                                          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                            $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                            $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                            $ ( , 0 4 8 < @ D H L P T X \ ` h l p t x |                                     ( , 4 8 @ D L P X \ d h p t |                             $ ( 0 4 < @ H L T X ` d l p x |                              $ , 0 8 < D H P T \ ` h l t x                              ( , 4 8 @ D L P X \ d h p t |                 % $   #         $ (" ,! 0 4 8 < @ D H L P  T X \ ` d h l p t x |                                            $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                                $ ( , 0 4 8 < @ D/opt/freeware/lib:/usr/vac/lib:/usr/lib:/liblibdb-4.8.solibpthread.ashr_xpg5.olibc.ashr.olibrtl.ashr.o ___memmove __mod_init__malloc_user_defined_name __pth_init __pthread