§1  IWF Metadata Harvester I  INTRODUCTION 1

1. Introduction. [LDF 2006.09.27.]

2. Copyright and licenses. [LDF 2006.10.23.]

The IWF Metadata Harvester is a package for metadata harvesting.

Copyright \begin{matrix}c \\ ◯ \end{matrix} 2006, 2007 IWF Wissen und Medien gGmbH

The author is Laurence D. Finston.

The IWF Metadata Harvester is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

The IWF Metadata Harvester is distributed in the hope that it will be useful, but WITHOUT ANY WAR-RANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the section ⟨ GNU General Public License 882 ⟩ for more details.

You should have received a copy of the GNU General Public License along with the IWF Metadata Harvester; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

See the section ⟨ GNU Free Documentation License 883 ⟩ for the copying conditions that apply to this document.

You should have received a copy of the GNU Free Documentation License along with the IWF Metadata Harvester Manual; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

The IWF Metadata Harvester is available for downloading from the following FTP server:

ftp://ftp.gwdg.de/pub/gnu2/iwfmdh/

Please send bug reports to lfinsto1@gwdg.de

The author can be contacted at:

Laurence D. Finston Kreuzbergring 41 D-37075 Goettingen Germany

Email: lfinsto1@gwdg.de
      s246794@stud.uni-goettingen.de

3. Formatting commands. [LDF 2006.09.27.] This section contains formatting commands. They don’t appear in the TEX output of CWEAVE.

4. File Lists. [LDF 2006.09.27.]

5. Source Files. [LDF 2006.09.27.]

2  LOGICAL AND HIERARCHICAL ORDER  IWF Metadata Harvester I §6

6. Logical and Hierarchical Order. [LDF 2006.09.27.]

⟨ resource.web 12 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preprocessor macro definitions for resources
⟨ stdafx.web 16 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Main header file for ATest
⟨ mainfrm.web 28 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . class CMainFrame
⟨ atest.web 50 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . class CATestApp and class CAboutDlg
⟨ atestdoc.web 75 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class CATestDoc
⟨ atstview.web 96 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class CATestView
⟨ dialog1a.web 130 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Dialog 1
⟨ dialog2a.web 208 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Dialog 2
⟨ glblfncs.web 294 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . Global functions
⟨ mtdtsrc.web 312 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Metadata Source
⟨ selector.web 379 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Selector

§7  IWF Metadata Harvester I  ODBC CLASSES 3

7. ODBC Classes. [LDF 2006.09.27.]

⟨ records.web 503 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Records
⟨ rcrdstmp.web 524 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Records Temp
⟨ creators.web 545 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Creators
⟨ crtrstmp.web 566 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Creators Temp
⟨ cntrbtrs.web 587 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Contributors
⟨ cntrbtmp.web 608 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Contributors Temp
⟨ titles.web 629 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Titles
⟨ ttlstmp.web 650 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Titles Temp
⟨ dscrptmp.web 671 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Descriptions Temp
⟨ subjects.web 692 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Subjects
⟨ sbjcttmp.web 713 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Subjects Temp
⟨ identtmp.web 734 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Identifiers Temp
⟨ langtmp.web 755 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Languages Temp
⟨ pblshtmp.web 776 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Publishers Temp
⟨ rghtstmp.web 797 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Rights Temp
⟨ typestmp.web 818 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Types Temp
⟨ tempids.web 839 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Temp IDs
⟨ tempids1.web 860 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Temp IDs 1

8. Other files. [LDF 2006.10.05.]

⟨ spchrtbl.web 10 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . Special Character Formatting

9. Alphabetical Order. [LDF 2006.09.27.]

⟨ atest.web 50 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . class CATestApp and class CAboutDlg
⟨ atestdoc.web 75 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class CATestDoc
⟨ atstview.web 96 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class CATestView
⟨ cntrbtmp.web 608 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Contributors Temp
⟨ cntrbtrs.web 587 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Contributors
⟨ creators.web 545 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Creators
⟨ crtrstmp.web 566 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Creators Temp
⟨ dialog1a.web 130 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Dialog 1
⟨ dialog2a.web 208 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Dialog 2
⟨ dscrptmp.web 671 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Descriptions Temp
⟨ glblfncs.web 294 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . Global functions
⟨ identtmp.web 734 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Identifiers Temp
⟨ langtmp.web 755 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Languages Temp
⟨ mainfrm.web 28 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . class CMainFrame
⟨ mtdtsrc.web 312 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Metadata Source
⟨ pblshtmp.web 776 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Publishers Temp
⟨ rcrdstmp.web 524 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Records Temp
⟨ records.web 503 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Records

4  ALPHABETICAL ORDER  IWF Metadata Harvester I §9
⟨ resource.web 12 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preprocessor macro definitions for resources
⟨ rghtstmp.web 797 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Rights Temp
⟨ sbjcttmp.web 713 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Subjects Temp
⟨ selector.web 379 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Selector
⟨ spchrtbl.web 10 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . Special Character Formatting
⟨ stdafx.web 16 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Main header file for ATest
⟨ subjects.web 692 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Subjects
⟨ tempids.web 839 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Temp IDs
⟨ tempids1.web 860 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Temp IDs 1
⟨ titles.web 629 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Titles
⟨ ttlstmp.web 650 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . class Titles Temp
⟨ typestmp.web 818 ⟩ . . . . . . . . . . . . . . . . . . . . . . . . . . . class Types Temp

§9  IWF Metadata Harvester I  ALPHABETICAL ORDER 5

10. Special character formatting. [LDF 2006.09.28.]

Log

[LDF 2006.10.05.] Renamed this file from spchrtbl.tex to spchrtbl.web.

⟨ spchrtbl.web 10 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 8 and 9. This code is used in section 881.

6  SPECIAL CHARACTER FORMATTING  IWF Metadata Harvester I §11

11.

See also ⟨ Define Metadata Source ::parse record 349 ⟩ and “UTF-8 encoding table and Unicode charac-

      ters” (http://www.utf8-chartable.de/).

For more information about UTF-8 encoding, see “UTF-8—Wikipedia, the free encyclopedia” (http://en.wikipedia.org/wiki/Utf-8).

Hex.  Oct.  Dec.  UTF-8  Enc.  Sym.  Unicode Name  Id.  Lit.  TEX
#80    ^{∘}200  128  ^{#}C2 80  Â\200  \200  ⟨control⟩  \200  \200
#81    ^{∘}201  129  ^{#}C2 81  Â\201  \201  ⟨control⟩  \201  \201
#82    ^{∘}202  130  ^{#}C2 82  Â\202  \202  ⟨control⟩  \202  \202
#83    ^{∘}203  131  ^{#}C2 83  Â\203  \203  ⟨control⟩  \203  \203
#84    ^{∘}204  132  ^{#}C2 84  Â\204  \204  ⟨control⟩  \204  \204
#85    ^{∘}205  133  ^{#}C2 85  Â\205  \205  ⟨control⟩  \205  \205
#86    ^{∘}206  134  ^{#}C2 86  Â\206  \206  ⟨control⟩  \206  \206
#87    ^{∘}207  135  ^{#}C2 87  Â\207  \207  ⟨control⟩  \207  \207
#88    ^{∘}210  136  ^{#}C2 88  Â\210  \210  ⟨control⟩  \210  \210
#89    ^{∘}211  137  ^{#}C2 89  Â\211  \211  ⟨control⟩  \211  \211
#8A    ^{∘}212  138  ^{#}C2 8A  Â\212  \212  ⟨control⟩  \212  \212
#8B    ^{∘}213  139  ^{#}C2 8B  Â\213  \213  ⟨control⟩  \213  \213
#8C    ^{∘}214  140  ^{#}C2 8C  Â\214  \214  ⟨control⟩  \214  \214
#8D    ^{∘}215  141  ^{#}C2 8D  Â\215  \215  ⟨control⟩  \215  \215
#8E    ^{∘}216  142  ^{#}C2 8E  Â\216  \216  ⟨control⟩  \216  \216
#8F    ^{∘}217  143  ^{#}C2 8F  Â\217  \217  ⟨control⟩  \217  \217
#93    ^{∘}223  147  ^{#}C2 93  Â\223  \223  ⟨control⟩  \223  \223
#96    ^{∘}226  150  ^{#}C2 96  Â\226  \226  ⟨control⟩  \226  \226
#97    ^{∘}227  151  ^{#}C2 97  Â\227  \227  ⟨control⟩  \227  \227
#9B    ^{∘}233  155  ^{#}C2 9B  Â\233  \233  ⟨control⟩  \233  \233
#9C    ^{∘}234  156  ^{#}C2 9C  Â\234  \234  ⟨control⟩  \234  \234
#9F    ^{∘}237  159  ^{#}C2 9F  Â\237  \237  ⟨control⟩  \237  \237
#A0    ^{∘}240  160  ^{#}C2 A0  Â\240  \240  No-Break Space  \240
#A1    ^{∘}241  161  ^{#}C2 A1  Â¡  ¡  Inverted Exclamation Mark  ¡  ¡  ¡
#A4    ^{∘}244  164  ^{#}C2 A4  Â¤  ¤  Currency Sign  ¤  ¤  ¤
#A8    ^{∘}250  168  ^{#}C2 A8  Â¨  ¨  Diaeresis  ¨  ¨  ¨
#A7    ^{∘}247  167  ^{#}C2 A7  Â§  §  Section Sign  §  §  §
#A9    ^{∘}251  169  ^{#}C2 A9  Â\begin{matrix}c \\ ◯ \end{matrix}  \begin{matrix}c \\ ◯ \end{matrix}  Copyright Sign  ©  ©  \begin{matrix}c \\ ◯ \end{matrix}
#AD    ^{∘}255  173  ^{#}C2 AD  Â-  -  Soft Hyphen  -  -
#AE    ^{∘}256  174  ^{#}C2 AE  Â®  ®  Registered Sign  ®  ®  ®
#AF    ^{∘}257  175  ^{#}C2 AF  Â¯  ¯  Macron  ¯  ¯  ¯

(cont.)

§11  IWF Metadata Harvester I  SPECIAL CHARACTER FORMATTING 7
Hex.  Oct.  Dec.  UTF-8  Enc.  Sym.  Unicode Name  Id.  Lit.  TEX
#B0    ^{∘}260  176  ^{#}C2 B0  Â°  °  Degree Sign  °  °  °
#B1    ^{∘}261  177  ^{#}C2 B1  Â±  ±  Plus-Minus Sign  ±  ±  ±
#B3    ^{∘}263  179  ^{#}C2 B3  Â^{3}  ^{3}  Superscript Three  ³  ³  ^{3}
#B4    ^{∘}264  180  ^{#}C2 B4  Â´  ´  Acute Accent  ´  ´  ´
#B5    ^{∘}265  181  ^{#}C2 B5  Âµ  µ  Micro Sign  μ  µ  µ
#B6    ^{∘}266  182  ^{#}C2 B6  Â¶  ¶  Pilcrow Sign  ¶  ¶  ¶
#B7    ^{∘}267  183  ^{#}C2 B7  Â·  ·  Middle Dot  ·  ·  ·
#B8    ^{∘}270  184  ^{#}C2 B8  Â�  �  Cedilla  �  �  �
#BC    ^{∘}274  188  ^{#}C2 BC  Â¼  ¼  Vulgar Fraction One Quarter  ¼  ¼  ¼
#BD    ^{∘}275  189  ^{#}C2 BD  Â½  ½  Vulgar Fraction One Half  ½  ½  ½
#BF    ^{∘}277  191  ^{#}C2 BF  Â¿  ¿  Inverted Question Mark  ¿  ¿  ¿

#C0 ∘300 192 #C3 80 Ã\200 À

Latin Capital Letter A With Grave À

À

À

#C1 ∘301 193 #C3 81 Ã\201 Á

Latin Capital Letter A With Acute Á

Á

Á

#C2 ∘302 194 #C3 82 Ã\202 Â

Latin Capital Letter A With Circumflex Â

^A

Â

#C3 ∘303 195 #C3 83 Ã\203 Ã

Latin Capital Letter A With Tilde Ã

~ A

Ã

#C4 ∘304 196 #C3 84 Ã\204 Ä

Latin Capital Letter A With Diaeresis Ä

Ä

Ä

#C5 ∘305 197 #C3 85 Ã\205 Å

Latin Capital Letter A With Ring Above Å

Å

Å

#C6    ^{∘}306  198  ^{#}C3 86  Ã\206  Æ  Latin Capital Letter AE  Æ  Æ  Æ

#C7 ∘307 199 #C3 87 Ã\207 Ç

Latin Capital Letter C With Cedilla Ç

Ç

Ç

#C8 ∘310 200 #C3 88 Ã\210 È

Latin Capital Letter E With Grave È

È

È

#C9 ∘311 201 #C3 89 Ã\211 É

Latin Capital Letter E With Acute É

É

É

#CA ∘312 202 #C3 8A Ã\212 Ê

Latin Capital Letter E With Circumflex Ê

^E

Ê

#CB ∘313 203 #C3 8B Ã\213 Ë

Latin Capital Letter E With Diaeresis Ë

Ë

Ë

#CE ∘316 206 #C3 8E Ã\216 Î

Latin Capital Letter I With Circumflex Î

^I

Î

#D6 ∘326 214 #C3 96 Ã\226 Ö

Latin Capital Letter O With Diaeresis Ö

Ö

Ö

#D7    ^{∘}327  215  ^{#}C3 97  Ã\227  ×  Multiplication Sign  ×  ×  ×

#DB ∘333 219 #C3 9B Ã\233 Û

Latin Capital Letter U With Circumflex Û

^U

Û

#DC ∘334 220 #C3 9C Ã\234 Ü

Latin Capital Letter U With Diaeresis Ü

Ü

Ü

#DF ^{∘}337 223 ^{#}C3 9F Ã\237 ß Latin Small Letter Sharp S ß ß ß

(cont.)

Hex.  Oct.  Dec.  UTF-8  Enc.  Sym.  Unicode Name  Id.  Lit.  TEX

#E0 ∘340 224 #C3 A0 Ã\240 à

Latin Small Letter A With Grave à

à

à

#E1 ∘341 225 #C3 A1 Ã¡ á

Latin Small Letter A With Acute á

á

á

#E4 ∘344 228 #C3 A4 Ã¤ ä

Latin Small Letter A With Diaeresis ä

ä

ä

#E7 ∘347 231 #C3 A7 Ã§ ç

Latin Small Letter C With Cedilla ç

ç

ç

#E8 ∘350 232 #C3 A8 Ã¨ è

Latin Small Letter E With Grave è

è

è

#E9 ∘351 233 #C3 A9 Ã\begin{matrix}c \\ ◯ \end{matrix} é

Latin Small Letter E With Acute é

é

é

#ED ∘355 237 #C3 AD Ã- í

Latin Small Letter I With Acute í

í

í

#EE ∘356 238 #C3 AE Ã® î

Latin Small Letter I With Circumflex î

^ı

î

#EF ∘357 239 #C3 AF Ã¯ ï

Latin Small Letter I With Diaeresis ï

ï

ï

#F1 ∘361 241 #C3 B1 Ã± ñ

Latin Small Letter N With Tilde ñ

~ n

ñ

#F3 ∘363 243 #C3 B3 Ã^{3} ó

Latin Small Letter O With Acute ó

ó

ó

#F6 ∘366 246 #C3 B6 Ã¶ ö

Latin Small Letter O With Diaeresis ö

ö

ö

#FC ∘374 252 #C3 BC Ã¼ ü

Latin Small Letter U With Diaeresis ü

ü

ü

#FD ∘375 253 #C3 BD Ã½ ý

Latin Small Letter Y With Acute ý

ý

ý

#FF ∘377 255 #C3 BF Ã¿ ÿ

Latin Small Letter Y With Diaeresis ÿ

ÿ

ÿ

⟨ Special character formatting 11 ⟩ ≡ /∗ Empty section. Used for cross-references. ∗/

This code is cited in section 373. This code is used in section 881.

12. Preprocessor macro definitions for resources (resource.web). [LDF 2006.10.12.]

Log

[LDF 2006.10.12.] Created this file. It contains code formerly in resource.h.

⟨ resource.web 12 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9.

§12 IWF Metadata Harvester I PREPROCESSOR MACRO DEFINITIONS FOR RESOURCES (RESOURCE.WEB) 9 This code is used in section 881.

13. Putting resource.web together.

10  PUTTING RESOURCE.WEB TOGETHER  IWF Metadata Harvester I §14

14. This is what resource.h contains. It’s generated automatically by Microsoft Visual Studio. The code must be inserted here by hand, because the first comment doesn’t obey the CWEB’s syntax rules.

[LDF 2006.10.17.]

Log

[LDF 2006.10.17.] No longer using CTANGLE to generate resource.h.

⟨ resource.h contents 14 ⟩ ≡ \underline{\overline{}}/∗ Microsoft Visual C++ generated include file. ∗/ /∗ Used by ATest.rc ∗/ /∗ ∗/

#define 100 #define 100 #define 128 #define IDR ATestTYPE 129 #define 130 #define 131 #define 1000 #define 1002 #define 1003 #define 1004 #define 1005 #define 1006 #define 1007 #define 1008 #define 1009 #define 1010 #define 1011 #define 1012 #define 1013 #define 1014 #define 1015 #define 1018 #define 1024 #define 1025 #define 1026 #define 1027 #define 1030 #define 1031 #define 1032 #define 1033 #define 1034 #define 1036 #define 1037 #define 1038 #define 1044 #define 1045 #define 1051 #define 1055 #define 1056 #define 1057 #define 1058

§14  IWF Metadata Harvester I  PUTTING RESOURCE.WEB TOGETHER 11

#define 1059 #define 1060 #define 1063 #define 1064 #define 1065 #define 1066 #define 1067 #define 1068 #define 1069 /∗ Next default values for new objects ∗/ /∗ ∗/ #ifdef #ifndef #define 132 #define 32771 #define 1070 #define 101 #endif #endif

This code is cited in section 15. This code is used in section 15.

15. ⟨ resource.h contents 14 ⟩ is included here to prevent CTANGLE and CWEAVE from issuing warnings.

[LDF 2006.10.17.]

⟨ Dummy sections 15 ⟩ ≡ #if 0

⟨ resource.h contents 14 ⟩ #endif

See also section 881. This code is used in section 884.

16. stdafx (stdafx.web). [LDF 2006.10.05.]

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in stdafx.h and stdafx.cpp.

⟨ stdafx.web 16 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9. This code is used in section 881.

17. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ ≡ #pragma once

See also sections 30, 52, 77, 98, 132, 210, 314, 381, 504, 525, 546, 567, 588, 609, 630, 651, 672, 693, 714, 735, 756, 777, 798, 819,

840, and 861. This code is used in sections 27, 49, 74, 95, 129, 207, 293, 378, 502, 522, 543, 564, 585, 606, 627, 648, 669, 690, 711, 732, 753,

774, 795, 816, 837, 858, and 879.

18. Preprocessor macro definitions. ⟨ Preprocessor macro definitions 18 ⟩ ≡ #ifndef #define #endif #ifndef #define ^{#}0400 #endif #ifndef #define ^{#}0400 #endif #ifndef #define ^{#}0410 #endif #ifndef #define ^{#}0400 #endif #define #define

See also sections 31, 53, 78, 99, 211, and 382. This code is used in sections 27, 48, 73, 128, 292, and 501.

19. Include files in stdafx.h.

§20  IWF Metadata Harvester I  INCLUDE FILES IN STDAFX.H 13

20. Windows and Visual Studio headers. [LDF Undated.] ⟨ Include files 20 ⟩ ≡ #include #include #include #include #include #ifndef #include #endif #include #include

See also sections 21, 23, 29, 51, 76, 97, 131, 209, 295, 313, 380, 506, 527, 548, 569, 590, 611, 632, 653, 674, 695, 716, 737, 758,

779, 800, 821, 842, and 863. This code is used in sections 27, 48, 73, 94, 128, 206, 292, 310, 377, 501, 523, 544, 565, 586, 607, 628, 649, 670, 691, 712, 733,

754, 775, 796, 817, 838, 859, and 880.

21. C^{++} standard library headers. [LDF Undated.] ⟨ Include files 20 ⟩ +≡ #include #include #include #include #include #include #include #include #include #include #include

22. Header files for types declared in ATest. [LDF Undated.]

14  INCLUDE FILES IN STDAFX.H  IWF Metadata Harvester I §23

23. Headers for classes derived from CRecordset. [LDF Undated.]

Log

[LDF 2006.10.23.] Now including private.h.

[LDF 2006.10.27.] Now including glblfncs.h.

⟨ Include files 20 ⟩ +≡ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include

24. Global variables. [LDF Undated.]

Log

[LDF 2006.10.27.] Added the extern declarations for CMutex special char encodings map mutex and map⟨string, char⟩ special char encodings map.

[LDF 2006.12.11.] Added the extern declaration of string copyright html str .

⟨ Global variables 24 ⟩ ≡ extern CMutex log file mutex ; extern CMutex special char encodings map mutex ; extern map⟨string, char⟩ special char encodings map; extern string copyright html str ;

This code is used in section 27.

25. Putting stdafx.web together.

26. This is what’s compiled. [LDF Undated.] #include

§27  IWF Metadata Harvester I  PUTTING STDAFX.WEB TOGETHER 15

27. This is what’s written to stdafx.h. ⟨ 27 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ Preprocessor macro definitions 18 ⟩

⟨ Include files 20 ⟩

⟨ Global variables 24 ⟩

28. CMainFrame (mainfrm.web). [LDF 2006.10.12.]

Log

[LDF 2006.10.12.] Created this file. It contains code formerly in MainFrm.h and MainFrm.cpp.

⟨ mainfrm.web 28 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9. This code is used in section 881.

29. Include files. ⟨ Include files 20 ⟩ +≡ #include #include #include

30. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

31. Preprocessor macro definitions. ⟨ Preprocessor macro definitions 18 ⟩ +≡ #ifdef #define new #endif

32. Declare class CMainFrame. [LDF Undated.] ⟨ Declare class CMainFrame 32 ⟩ ≡

class CMainFrame : public CFrameWnd {

protected: ⟨ Declare protected CMainFrame functions 35 ⟩

public: ⟨ Declare public CMainFrame functions 37 ⟩

protected: CStatusBar m wndStatusBar ; CToolBar m wndToolBar ; ( )

};

This code is used in section 49.

33. Declare staticindicators array. [LDF Undated.] ⟨ Declare static indicators array 33 ⟩ ≡

static UINT indicators [ ] = { , , ,

, };

This code is used in section 48.

16  FUNCTIONS  IWF Metadata Harvester I §34

34. Functions. [LDF 2006.10.12.]

35. Constructor. [LDF Undated.] ⟨ Declare protected CMainFrame functions 35 ⟩ ≡

CMainFrame( ); (CMainFrame)

See also section 45. This code is used in section 32.

36. ⟨ Define CMainFrame functions 36 ⟩ ≡

CMainFrame ::CMainFrame( )

{

return; }

See also sections 38, 40, 42, 44, and 46. This code is used in section 48.

37. Destructor. [LDF Undated.] ⟨ Declare public CMainFrame functions 37 ⟩ ≡

virtual ∼CMainFrame( );

See also sections 39, 41, and 43. This code is used in section 32.

38. ⟨ Define CMainFrame functions 36 ⟩ +≡

CMainFrame ::∼CMainFrame( )

{

return; }

39. Pre-Create Window. [LDF Undated.] ⟨ Declare public CMainFrame functions 37 ⟩ +≡

virtual BOOL PreCreateWindow (CREATESTRUCT &cs );

40. ⟨ Define CMainFrame functions 36 ⟩ +≡

BOOL CMainFrame ::PreCreateWindow (CREATESTRUCT &cs )

{ if (¬CFrameWnd ::PreCreateWindow (cs )) return ; return ;

}

41. Assert Valid. [LDF Undated.] ⟨ Declare public CMainFrame functions 37 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

§42  IWF Metadata Harvester I  ASSERT VALID 17

42. ⟨ Define CMainFrame functions 36 ⟩ +≡ #ifdef

void CMainFrame ::AssertValid ( ) const

{

CFrameWnd ::AssertValid ( ); }

#endif

43. Dump. [LDF Undated.] ⟨ Declare public CMainFrame functions 37 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

44. ⟨ Define CMainFrame functions 36 ⟩ +≡ #ifdef

void CMainFrame ::Dump(CDumpContext &dc) const

{

CFrameWnd ::Dump(dc); }

#endif

45. On Create. [LDF Undated.] ⟨ Declare protected CMainFrame functions 35 ⟩ +≡

afx msg int OnCreate(LPCREATESTRUCT lpCreateStruct );

46. ⟨ Define CMainFrame functions 36 ⟩ +≡

int CMainFrame ::OnCreate(LPCREATESTRUCT lpCreateStruct )

{ if (CFrameWnd ::OnCreate(lpCreateStruct ) ≡ −1) return −1; if (¬m wndToolBar .CreateEx (this ,

,  |  |  |  |  |
|  ) ∨ ¬m wndToolBar .LoadToolBar (  )) {

      (  ␣       ␣     ␣        ␣  );

return −1; /∗ Fehler bei Erstellung ∗/ } if (¬m wndStatusBar .Create(this ) ∨ ¬m wndStatusBar .SetIndicators (indicators , sizeof

(indicators )/sizeof (UINT))) {

      (  ␣       ␣     ␣        ␣  );

return −1; /∗ Fehler bei Erstellung ∗/ } m wndToolBar .EnableDocking ( ); EnableDocking ( ); DockControlBar (&m wndToolBar ); return 0;

}

47. Putting CMainFrame together.

18  PUTTING CMAINFRAME TOGETHER  IWF Metadata Harvester I §48

48. This is what’s compiled.

⟨ Include files 20 ⟩ ⟨ Preprocessor macro definitions 18 ⟩ (CMainFrame, CFrameWnd) (CMainFrame, CFrameWnd) ( ) ( ) ⟨ Declare static indicators array 33 ⟩ ⟨ Define CMainFrame functions 36 ⟩

§49  IWF Metadata Harvester I  PUTTING CMAINFRAME TOGETHER 19

49. This is what’s written to mainfrm.h. ⟨ 49 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ Declare class CMainFrame 32 ⟩

50. CATestApp and CABoutDlg (atest.web). [LDF 2006.09.27.] ⟨ atest.web 50 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9. This code is used in section 881.

51. Include files. ⟨ Include files 20 ⟩ +≡ #include #include #include #include #include #include #include #ifdef #define new #endif

52. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

53. Preprocessor macro definitions. ⟨ Preprocessor macro definitions 18 ⟩ +≡

54. class CATestApp declaration. ⟨ class CATestApp declaration 54 ⟩ ≡

class CATestApp : public CWinApp { public: ⟨ Declare CATestApp functions 59 ⟩

( ) };

This code is used in section 74.

55. Global variable declarations. [LDF Undated.]

Log

[LDF 2006.10.27.] Added the declarations of CMutex special char encodings map mutex and map⟨string, char⟩ special char encodings map.

[LDF 2006.12.11.] Added the declaration of string copyright html str .

⟨ Global variable declarations 55 ⟩ ≡ CMutex log file mutex ; CATestApp theApp; CMutex special char encodings map mutex ;

20  GLOBAL VARIABLE DECLARATIONS  IWF Metadata Harvester I §55

map⟨string, char⟩ special char encodings map; string copyright html str ;

See also section 213. This code is used in sections 73 and 292.

56. extern global variable declarations. [LDF Undated.] ⟨ extern global variable declarations 56 ⟩ ≡

extern CATestApp theApp;

See also section 214. This code is used in sections 74 and 293.

57. CATestApp message map. [LDF Undated.] ⟨ CATestApp message map 57 ⟩ ≡

(CATestApp, CWinApp) ( , OnAppAbout ) ( , CWinApp ::OnFileNew ) ( , CWinApp ::OnFileOpen) ( , CWinApp ::OnFilePrintSetup) ( )

This code is used in section 73.

58. Functions. [LDF Undated.]

59. Constructor. [LDF Undated.] ⟨ Declare CATestApp functions 59 ⟩ ≡

CATestApp( );

See also sections 61 and 63. This code is used in section 54.

60. ⟨ Define CATestApp functions 60 ⟩ ≡

CATestApp ::CATestApp(void) {

return; }

See also sections 62 and 64. This code is used in section 73.

61. Initialize instance. [LDF Undated.]

Log

[LDF 2006.10.27.] Now calling the global function init special char encodings map.

[LDF 2006.12.11.] Now calling the global function init copyright strings .

⟨ Declare CATestApp functions 59 ⟩ +≡ virtual BOOL InitInstance( );

§62  IWF Metadata Harvester I  INITIALIZE INSTANCE 21

62. ⟨ Define CATestApp functions 60 ⟩ +≡

BOOL CATestApp ::InitInstance( ) {

InitCommonControls ( ); CWinApp ::InitInstance( ); if (¬AfxOleInit ( )) {

AfxMessageBox ( ); return ;

} AfxEnableControlContainer ( ); SetRegistryKey ( ( ␣ ␣ ␣ ␣ )); LoadStdProfileSettings (4); CSingleDocTemplate ∗pDocTemplate; pDocTemplate = new CSingleDocTemplate( , (CATestDoc),

(CMainFrame), (CATestView)); if (¬pDocTemplate) return ; AddDocTemplate(pDocTemplate); CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); if (¬ProcessShellCommand (cmdInfo)) return ; m pMainWnd ShowWindow ( ); m pMainWnd UpdateWindow ( ); init copyright strings ( ); init special char encodings map( );

#if 1 /∗ 0 ∗/ Dialog 1 dlg 1 ; dlg 1 .DoModal ( );

#endif #if 1 /∗ 0 ∗/

Dialog 2 dlg 2 ; dlg 2 .DoModal ( );

#endif

return ; } /∗ End of CATestApp ::InitInstance definition. ∗/

63. OnAppAbout. [LDF Undated.] ⟨ Declare CATestApp functions 59 ⟩ +≡

afx msg void OnAppAbout ( );

22 ONAPPABOUT  IWF Metadata Harvester I  §64

64. ⟨ Define CATestApp functions 60 ⟩ +≡

void CATestApp ::OnAppAbout ( )

{ CAboutDlg aboutDlg ; aboutDlg .DoModal ( );

}

65. class CAboutDlg declaration. [LDF Undated.] ⟨ class CAboutDlg declaration 65 ⟩ ≡

class CAboutDlg : public CDialog {

public: ⟨ Declare public CAboutDlg functions 67 ⟩

enum { =

}; protected: ⟨ Declare protected CAboutDlg functions 69 ⟩ protected: ( ) };

This code is used in section 74.

66. Functions.

67. Constructor. ⟨ Declare public CAboutDlg functions 67 ⟩ ≡

CAboutDlg( );

This code is used in section 65.

68. ⟨ Define public CAboutDlg functions 68 ⟩ ≡

CAboutDlg ::CAboutDlg( )

: CDialog(CAboutDlg :: ) { }

This code is used in section 73.

69. Do Data Exchange. ⟨ Declare protected CAboutDlg functions 69 ⟩ ≡

virtual void DoDataExchange(CDataExchange ∗pDX );

This code is used in section 65.

§70  IWF Metadata Harvester I  DO DATA EXCHANGE 23

70. ⟨ Define protected CAboutDlg functions 70 ⟩ ≡

void CAboutDlg ::DoDataExchange(CDataExchange ∗pDX ) {

CDialog ::DoDataExchange(pDX ); }

This code is used in section 73.

71. CAboutDlg message map. [LDF Undated.] ⟨ CAboutDlg message map 71 ⟩ ≡

(CAboutDlg, CDialog) ( )

This code is used in section 73.

72. Putting CATestApp and CABoutDlg together.

73. This is what’s compiled.

⟨ Include files 20 ⟩ ⟨ Preprocessor macro definitions 18 ⟩ ⟨ Global variable declarations 55 ⟩ ⟨ CATestApp message map 57 ⟩ ⟨ Define CATestApp functions 60 ⟩ ⟨ Define public CAboutDlg functions 68 ⟩ ⟨ Define protected CAboutDlg functions 70 ⟩ ⟨ CAboutDlg message map 71 ⟩

24  PUTTING CATESTAPP AND CABOUTDLG TOGETHER  IWF Metadata Harvester I §74

74. This is what’s written to atest.h. ⟨ 74 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩ #ifndef

#error \underline{\overline{␣    ␣   ␣      ␣     ␣  ␣   ␣             ␣}}

#endif #include /∗ Hauptsymbole ∗/

⟨ class CAboutDlg declaration 65 ⟩

⟨ class CATestApp declaration 54 ⟩

⟨ extern global variable declarations 56 ⟩

75. CATestDoc (atestdoc.web). [LDF 2006.10.10.]

Log

[LDF 2006.10.10.] Created this file. It contains code formerly in ATestDoc.h and ATestDoc.cpp.

⟨ atestdoc.web 75 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9. This code is used in section 881.

76. Include files. ⟨ Include files 20 ⟩ +≡ #include #include #include #ifdef #define new #endif

77. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

78. Preprocessor macro definitions. ⟨ Preprocessor macro definitions 18 ⟩ +≡

79. Declare class CATestDoc. [LDF Undated.] ⟨ Declare class CATestDoc 79 ⟩ ≡

class CATestDoc : public CDocument {

protected: ⟨ Declare protected CATestDoc functions 81 ⟩ public: ⟨ Declare CATestDoc functions 83 ⟩ protected: ( ) };

This code is used in section 95.

80. Functions. [LDF 2006.10.10.]

81. Constructor. ⟨ Declare protected CATestDoc functions 81 ⟩ ≡

§81  IWF Metadata Harvester I  CONSTRUCTOR 25

CATestDoc( ); (CATestDoc)

This code is used in section 79.

82. ⟨ Define CATestDoc functions 82 ⟩ ≡

CATestDoc ::CATestDoc( ) {

return; }

See also sections 84, 86, 88, 90, and 92. This code is used in section 94.

83. Destructor. ⟨ Declare CATestDoc functions 83 ⟩ ≡

virtual ∼CATestDoc( );

See also sections 85, 87, 89, and 91. This code is used in section 79.

84. ⟨ Define CATestDoc functions 82 ⟩ +≡

CATestDoc ::∼CATestDoc( ) {

return; }

85. On New Document. [LDF Undated.] ⟨ Declare CATestDoc functions 83 ⟩ +≡

virtual BOOL OnNewDocument ( );

86. ⟨ Define CATestDoc functions 82 ⟩ +≡

BOOL CATestDoc ::OnNewDocument ( ) {

if (¬CDocument ::OnNewDocument ( )) return ; /∗ TODO: Hier Code zur Reinitialisierung einfügen ∗/ /∗ (SDI-Dokumente verwenden dieses Dokument) ∗/

return ; }

87. Serialize. [LDF Undated.] ⟨ Declare CATestDoc functions 83 ⟩ +≡

virtual void Serialize(CArchive &ar );

26  SERIALIZE  IWF Metadata Harvester I §88

88. ⟨ Define CATestDoc functions 82 ⟩ +≡

void CATestDoc ::Serialize(CArchive &ar )

{ if (ar .IsStoring ( )) { /∗ TODO: Hier Code zum Speichern einfügen ∗/ } else { /∗ TODO: Hier Code zum Laden einfügen ∗/ }

}

89. Assert Valid. [LDF Undated.] ⟨ Declare CATestDoc functions 83 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

90. ⟨ Define CATestDoc functions 82 ⟩ +≡ #ifdef

void CATestDoc ::AssertValid ( ) const

{

CDocument ::AssertValid ( ); }

#endif

91. Dump. [LDF Undated.] ⟨ Declare CATestDoc functions 83 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

92. ⟨ Define CATestDoc functions 82 ⟩ +≡ #ifdef

void CATestDoc ::Dump(CDumpContext &dc) const {

CDocument ::Dump(dc); }

#endif

93. Putting CATestDoc together.

94. This is what’s compiled.

⟨ Include files 20 ⟩

(CATestDoc, CDocument)

(CATestDoc, CDocument)

( )

⟨ Define CATestDoc functions 82 ⟩

§95  IWF Metadata Harvester I  PUTTING CATESTDOC TOGETHER 27

95. This is what’s written to atestdoc.h. ⟨ 95 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ Declare class CATestDoc 79 ⟩

96. CATestView (atstview.web). [LDF 2006.10.10.]

Log

[LDF 2006.10.10.] Created this file. It contains code formerly in ATestView.h and ATestView.cpp.

⟨ atstview.web 96 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9. This code is used in section 881.

97. Include files. ⟨ Include files 20 ⟩ +≡ #include #include #include #include #include #include

98. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

99. Preprocessor macro definitions. ⟨ Preprocessor macro definitions 18 ⟩ +≡ #ifdef #define new #endif

100. Declare class CATestView. [LDF Undated.] ⟨ Declare class CATestView 100 ⟩ ≡

class CATestView : public CView {

protected: ⟨ Declare protected CATestView functions 102 ⟩ public: ⟨ Declare CATestView functions 104 ⟩ protected: ( ) };

This code is used in section 129.

101. Functions. [LDF 2006.10.10.]

102. Constructor. [LDF Undated.] ⟨ Declare protected CATestView functions 102 ⟩ ≡

CATestView( ); (CATestView)

See also sections 117, 119, and 121. This code is used in section 100.

28  CONSTRUCTOR  IWF Metadata Harvester I §103

103. ⟨ Define CATestView functions 103 ⟩ ≡

CATestView ::CATestView( )

{

return; }

See also sections 105, 107, 109, 111, 113, 115, 118, 120, 122, 124, and 126. This code is used in section 128.

104. Destructor. ⟨ Declare CATestView functions 104 ⟩ ≡

virtual ∼CATestView( );

See also sections 106, 108, 110, 112, 114, 123, and 125. This code is used in section 100.

105. ⟨ Define CATestView functions 103 ⟩ +≡

CATestView ::∼CATestView( )

{

return; }

106. Get Document. [LDF Undated.] ⟨ Declare CATestView functions 104 ⟩ +≡

CATestDoc ∗GetDocument ( ) const;

107. ⟨ Define CATestView functions 103 ⟩ +≡ #ifndef

inline CATestDoc ∗CATestView ::GetDocument ( ) const {

return reinterpret cast⟨CATestDoc ∗⟩(m pDocument ); }

#endif #ifdef

CATestDoc ∗CATestView ::GetDocument ( ) const {

(m pDocument IsKindOf ( (CATestDoc))); return (CATestDoc ∗) m pDocument ;

} #endif

108. On Draw. [LDF Undated.] ⟨ Declare CATestView functions 104 ⟩ +≡

virtual void OnDraw (CDC ∗pDC );

§109  IWF Metadata Harvester I  ON DRAW 29

109. ⟨ Define CATestView functions 103 ⟩ +≡

void CATestView ::OnDraw (CDC ∗pDC )

{ CATestDoc ∗pDoc = GetDocument ( ); (pDoc); if (¬pDoc) return;

}

110. Pre-Create Window. [LDF Undated.] ⟨ Declare CATestView functions 104 ⟩ +≡

virtual BOOL PreCreateWindow (CREATESTRUCT &cs );

111. ⟨ Define CATestView functions 103 ⟩ +≡

BOOL CATestView ::PreCreateWindow (CREATESTRUCT &cs )

{

return CView ::PreCreateWindow (cs ); }

112. Assert Valid. [LDF Undated.] ⟨ Declare CATestView functions 104 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

113. ⟨ Define CATestView functions 103 ⟩ +≡ #ifdef

void CATestView ::AssertValid ( ) const

{

CView ::AssertValid ( ); }

#endif

114. Dump. ⟨ Declare CATestView functions 104 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

30  DUMP  IWF Metadata Harvester I §115

115. ⟨ Define CATestView functions 103 ⟩ +≡ #ifdef

void CATestView ::Dump(CDumpContext &dc) const

{

CView ::Dump(dc); }

#endif

116. On Prepare Printing. [LDF Undated.]

117. ⟨ Declare protected CATestView functions 102 ⟩ +≡

virtual BOOL OnPreparePrinting (CPrintInfo ∗pInfo);

118. ⟨ Define CATestView functions 103 ⟩ +≡

BOOL CATestView ::OnPreparePrinting (CPrintInfo ∗pInfo)

{

return DoPreparePrinting (pInfo); }

119. On Begin Printing. [LDF Undated.] ⟨ Declare protected CATestView functions 102 ⟩ +≡

virtual void OnBeginPrinting (CDC ∗pDC , CPrintInfo ∗pInfo);

120. ⟨ Define CATestView functions 103 ⟩ +≡

void CATestView ::OnBeginPrinting (CDC ∗pDC , CPrintInfo ∗pInfo)

{ #if 0 /∗ 1 ∗/ #endif

return; }

121. On End Printing. [LDF Undated.] ⟨ Declare protected CATestView functions 102 ⟩ +≡

virtual void OnEndPrinting (CDC ∗pDC , CPrintInfo ∗pInfo);

122. ⟨ Define CATestView functions 103 ⟩ +≡

void CATestView ::OnEndPrinting (CDC ∗pDC , CPrintInfo ∗pInfo)

{

return; }

123. On Left Button Down. [LDF Undated.] ⟨ Declare CATestView functions 104 ⟩ +≡

afx msg void OnLButtonDown(UINT nFlags , CPoint point );

§124  IWF Metadata Harvester I  ON LEFT BUTTON DOWN 31

124. ⟨ Define CATestView functions 103 ⟩ +≡

void CATestView ::OnLButtonDown(UINT nFlags , CPoint point ) {

#if 1 Dialog 1 dlg 1 ; dlg 1 .DoModal ( );

#endif /∗ CView ::OnLButtonDown(nFlags , point ) ∗/ }

125. On Right Button Down. [LDF Undated.] ⟨ Declare CATestView functions 104 ⟩ +≡

afx msg void OnRButtonDown(UINT nFlags , CPoint point );

126. ⟨ Define CATestView functions 103 ⟩ +≡

void CATestView ::OnRButtonDown(UINT nFlags , CPoint point ) {

#if 1 Dialog 2 dlg 2 ; dlg 2 .DoModal ( );

#endif /∗ CView ::OnRButtonDown(nFlags , point ) ∗/ }

127. Putting CATestView together.

128. This is what’s compiled.

⟨ Include files 20 ⟩ ⟨ Preprocessor macro definitions 18 ⟩ (CATestView, CView) (CATestView, CView) ( , CView ::OnFilePrint ) ( , CView ::OnFilePrint ) ( , CView ::OnFilePrintPreview ) ( ) ( ) ( ) ( ) ⟨ Define CATestView functions 103 ⟩

32  PUTTING CATESTVIEW TOGETHER  IWF Metadata Harvester I §129

129. This is what’s written to atstview.h. ⟨ 129 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ Declare class CATestView 100 ⟩

130. Dialog 1 (dialog1a.web). [LDF 2006.09.28.]

Log

[LDF 2006.08.01.] Changed the name of CDialog 1 to Dialog 1. Made all data members protected and all functions public, except DoDataExchange, which is protected.

[LDF 2006.09.28.] Replaced the files Dialog_1.h, Dialog_1.cpp, and download records.cpp with this file,

dialog1a.web.

⟨ dialog1a.web 130 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9. This code is used in section 881.

131. Include files. ⟨ Include files 20 ⟩ +≡ #include #include #include #include

132. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

133. class Dialog 1 declaration.

Log

[LDF 2006.09.11.] Added the protected variables int day of month, int day of week , int month of year , and CTime t0 . They were formerly static variables, local to Dialog_1.cpp.

[LDF 2006.09.11.] Added the const char ∗records file name argument to download records .

⟨ class Dialog 1 declaration 133 ⟩ ≡ class Dialog 1 : public CDialog { public: ⟨ Declare public Dialog 1 functions 135 ⟩

enum { =

}; protected: ⟨ Declare protected Dialog 1 functions 139 ⟩

unsigned short timespan;

CString edit 1 str ;

§133  IWF Metadata Harvester I  CLASS DIALOG 1 DECLARATION 33

unsigned short metadata source; int day of month; int day of week ; int month of year ; CTime t0 ; ( )

};

This code is used in section 207.

134. Functions. [LDF Undated.]

135. Constructor. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ ≡

(Dialog 1) Dialog 1(CWnd ∗pParent = NULL);

See also sections 137, 141, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 188, 190, and 193. This code is used in section 133.

136. ⟨ Define Dialog 1 functions 136 ⟩ ≡

(Dialog 1, CDialog) Dialog 1 ::Dialog 1(CWnd ∗pParent ) : CDialog(Dialog 1 :: , pParent ), timespan(0), edit 1 str ( ( )), metadata source(0) {

return; }

See also sections 138, 140, 142, 143, 144, 145, 146, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179,

181, 182, 183, 184, 185, 186, 187, 189, 191, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, and 204. This code is used in section 206.

137. Destructor. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

virtual ∼Dialog 1(void);

138. ⟨ Define Dialog 1 functions 136 ⟩ +≡

Dialog 1 ::∼Dialog 1( ) {

return; }

139. Do Data Exchange. [LDF Undated.] ⟨ Declare protected Dialog 1 functions 139 ⟩ ≡

virtual void DoDataExchange(CDataExchange ∗pDX );

This code is used in section 133.

34  DO DATA EXCHANGE  IWF Metadata Harvester I §140

140. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::DoDataExchange(CDataExchange ∗pDX )

{ CDialog ::DoDataExchange(pDX ); DDX Text (pDX , , edit 1 str );

}

141. Initialize Dialog 1. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

virtual BOOL OnInitDialog ( );

142. ⟨ Define Dialog 1 functions 136 ⟩ +≡

BOOL Dialog 1 ::OnInitDialog ( ){ CDialog ::OnInitDialog ( ); CButton ∗pBT = (CButton ∗) GetDlgItem( ); pBT SetCheck ( ); pBT = NULL; pBT = (CButton ∗) GetDlgItem( ); pBT SetCheck ( ); pBT = NULL;

#if 0 /∗ 1 ∗/ #define #else #define #endif

143. Testing downloading metadata records from TIMMS. [LDF 2006.08.28.] ⟨ Define Dialog 1 functions 136 ⟩ +≡ #ifdef

pBT = (CButton ∗) GetDlgItem( );

pBT SetCheck ( );

pBT = NULL;

metadata source = Metadata Source :: ; #else

144. Testing downloading metadata records from DBT (Digitale Bibliothek Thueringen). [LDF 2006.07.06.] ⟨ Define Dialog 1 functions 136 ⟩ +≡ #ifdef

pBT = (CButton ∗) GetDlgItem( );

pBT SetCheck ( );

pBT = NULL;

metadata source = Metadata Source :: ; #endif #endif

145. ⟨ Define Dialog 1 functions 136 ⟩ +≡

§146  IWF Metadata Harvester I  INITIALIZE DIALOG 1 35

timespan = Selector :: ; 146. Return unless you set the focus to a control. AUSNAHME: OCX-Eigenschaftenseite muss zurückgeben. ⟨ Define Dialog 1 functions 136 ⟩ +≡

return  ; }  /∗ End of Dialog 1 ::OnInitDialog definition. ∗/

147. Event handlers.

Log

[LDF 2006.09.28.] Added this section.

148. OnBnClickedOk. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedOk ( );

149. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedOk ( )

{ #if 0 /∗ 1 ∗/

exit (0); /∗ Ends application. ∗/ #endif

OnOK ( ); }

150. OnBnClickedToday. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedToday ( );

151. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedToday ( )

{ timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

152. OnBnClickedYesterday. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedYesterday ( );

36 ONBNCLICKEDYESTERDAY  IWF Metadata Harvester I  §153

153. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedYesterday ( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); t0 −= CTimeSpan(1, 0, 0, 0); edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

154. OnBnClickedThisWeek. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedThisWeek ( );

155. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedThisWeek ( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); day of week = t0 .GetDayOfWeek ( ) − 1; t0 −= CTimeSpan(day of week , 0, 0, 0);

edit 1 str =  ␣          ␣   ␣        ␣        ␣       ␣   ␣    ␣      ␣         ␣ ;

edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

156. OnBnClickedLastWeek. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedLastWeek ( );

157. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedLastWeek ( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); day of week = t0 .GetDayOfWeek ( ) − 1; t0 −= CTimeSpan(7 + day of week , 0, 0, 0);

edit 1 str =  ␣          ␣   ␣        ␣        ␣       ␣   ␣    ␣      ␣         ␣ ;

edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

§158  IWF Metadata Harvester I  ONBNCLICKEDTHISMONTH  37

158. OnBnClickedThisMonth. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedThisMonth( );

159. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedThisMonth( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); day of month = t0 .GetDay ( ); t0 −= CTimeSpan(day of month − 1, 0, 0, 0); edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

160. OnBnClickedLastMonth. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedLastMonth( );

161. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedLastMonth( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); day of month = t0 .GetDay ( ); t0 −= CTimeSpan(day of month, 0, 0, 0); day of month = t0 .GetDay ( ); t0 −= CTimeSpan(day of month − 1, 0, 0, 0); edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

162. OnBnClickedLast6Months. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedLast6Months ( );

38 ONBNCLICKEDLAST6MONTHS  IWF Metadata Harvester I  §163

163. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedLast6Months ( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); month of year = t0 .GetMonth( ); if (month of year > 5) {

CTime t1 (t0 .GetYear ( ), month of year − 5, 1, 0, 0, 0); t0 = t1 ;

} else {

CTime t1 (t0 .GetYear ( ) − 1, month of year + 7, 1, 0, 0, 0); t0 = t1 ;

} edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += ␣ ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

164. OnBnClickedThisYear. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedThisYear ( );

165. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedThisYear ( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ), 1, 1, 0, 0, 0); t0 = t1 ; edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

166. OnBnClickedLastYear. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedLastYear ( );

§167  IWF Metadata Harvester I  ONBNCLICKEDLASTYEAR  39

167. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedLastYear ( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 1, 1, 1, 0, 0, 0); t0 = t1 ; edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

168. OnBnClickedLast2Years. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedLast2Years ( );

169. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedLast2Years ( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 2, 1, 1, 0, 0, 0); t0 = t1 ; edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += ␣ ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

170. OnBnClickedLast5Years. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedLast5Years ( );

40 ONBNCLICKEDLAST5YEARS  IWF Metadata Harvester I  §171

171. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedLast5Years ( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 5, 1, 1, 0, 0, 0); t0 = t1 ; edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

172. OnBnClickedLast10Years. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedLast10Years ( );

173. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedLast10Years ( ) {

timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 10, 1, 1, 0, 0, 0); t0 = t1 ; edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += ␣ ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

174. OnBnClickedLast20Years. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedLast20Years ( );

§175  IWF Metadata Harvester I  ONBNCLICKEDLAST20YEARS  41

175. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedLast20Years ( )

{ timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 20, 1, 1, 0, 0, 0); t0 = t1 ; edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += ␣ ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( );

}

176. OnBnClickedAllRecords. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedAllRecords ( );

177. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedAllRecords ( )

{ timespan = Selector :: ; edit 1 str = ␣ ␣ ␣ ␣ ␣ ␣ ; UpdateData( );

}

178. OnBnClickedCancel. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedCancel ( );

179. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedCancel ( )

{ OnCancel ( ); exit (0);

}

180. OnBnClickedDownload. [LDF Undated.]

Log

[LDF 2006.09.11.] Created this file (oncldnld.cpp). It contains the function Dialog 1 ::OnBnClickedDownload , which was formerly in Dialog_1.cpp.

[LDF 2006.10.10.] Moved the definition of this function from oncldnld.cpp to this file (dialog1a.web).

42 ONBNCLICKEDDOWNLOAD  IWF Metadata Harvester I  §181

⟨ Declare public Dialog 1 functions 135 ⟩ +≡ afx msg void OnBnClickedDownload ( ); 181. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedDownload ( ){ stringstream temp strm;

CEdit ∗result box = (CEdit ∗) GetDlgItem( ); #if 0 /∗ 1 ∗/

temp strm ≪ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

if (timespan ≡ Selector :: ) { timespan = Selector :: ; t0 = CTime ::GetCurrentTime( ); edit 1 str += ␣ ␣ ␣ ; edit 1 str += ␣ ␣ ␣ ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ␣ ␣ ␣ ␣ ; UpdateData( ); result box UpdateWindow ( ); return;

} /∗ if (timespan = Selector :: ) ∗/ else if (timespan ≡ Selector :: ) {

t0 = CTime ::GetCurrentTime( ); edit 1 str += ␣ ␣ ␣ ␣ ; edit 1 str += t0 .Format ( ␣ ␣ ␣ ); edit 1 str += ; UpdateData( ); result box UpdateWindow ( );

}  /∗ if (timespan = Selector ::  ) ∗/

182. CButton ::GetState returns a UINT, which can be checked against a bit mask. I could have used static cast⟨BOOL⟩ in the assignment to delete old records , but it’s six-of-one, half-a-dozen of the other.

[LDF 2006.09.11.]

⟨ Define Dialog 1 functions 136 ⟩ +≡ CButton ∗pBT = (CButton ∗) GetDlgItem( ); BOOL delete old records = (pBT GetState( )) ? : ; pBT = NULL; char ∗resumption token; resumption token = new char[Metadata Source :: ];

#define  1  /∗ 0 ∗/

§183  IWF Metadata Harvester I  ONBNCLICKEDDOWNLOAD  43

183. If you want to use this, you’ll have to get a new resumption token from the OAI interface, because resumption tokens expire within a few minutes. [LDF 2006.07.05.] ⟨ Define Dialog 1 functions 136 ⟩ +≡ #if #if 0 /∗ 1 ∗/

strcpy (resumption token, ); #endif

strcpy (resumption token, ); #else

strcpy (resumption token, ); #endif

edit 1 str += ␣ ; UpdateData( ); result box UpdateWindow ( ); int ret val = 0; edit 1 str += ; UpdateData( ); result box UpdateWindow ( ); Metadata Source ∗curr metadata source = 0; if (metadata source ≡ Metadata Source :: ) {

curr metadata source = new Metadata Source(Metadata Source :: ); } else if (metadata source ≡ Metadata Source :: ) {

curr metadata source = new Metadata Source(Metadata Source :: ); }

184. Error handling: metadata source has invalid value. [LDF Undated.] ⟨ Define Dialog 1 functions 136 ⟩ +≡

else {

temp strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ␣␣ ≪ metadata source ≪

      ␣        ␣              ␣   ␣       ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

return; } /∗ else metadata source has invalid value. ∗/ 185. If resumption token isn’t empty, update database is called again. [LDF 2006.07.04.] ⟨ Define Dialog 1 functions 136 ⟩ +≡

ofstream copy strm; int i = 0; stringstream records file name strm; do { ^{++}i;

#if 0 /∗ 1 ∗/ temp strm ≪ ␣ ≪ i; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

records file name strm ≪ ≪ i ≪ ; #if 1 /∗ 0 ∗/

ret val = download records (metadata source, timespan, &t0 , resumption token,

records file name strm.str ( ).c str ( )); #else

AfxMessageBox ( ␣ ␣ ␣ ␣ ); #endif

edit 1 str += ␣ ␣ ; temp strm ≪ ret val ; edit 1 str += temp strm.str ( ).c str ( ); temp strm.str ( ); edit 1 str += ; UpdateData( ); result box UpdateWindow ( ); if (ret val ≠ 0) {

temp strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ≪ ret val ≪ endl ≪

      ␣   ␣  ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( ); } /∗ if (ret val ≠ 0) ∗/ else if (metadata source ≡ Metadata Source :: ∨ metadata source ≡ Metadata Source :: )

{

strcpy (resumption token, );

ret val = curr metadata source update database(delete old records , resumption token,

records file name strm.str ( ).c str ( ));

#if 1 /∗ 0 ∗/

temp strm ≪ ␣ ␣ ≪ ret val ≪ endl ≪

␣ ␣ ≪ resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

} /∗ else if ( ∨ metadata source ≡ Metadata Source :: metadata source ≡

Metadata Source :: ) ∗/ else /∗ ret val ≡ 0, but metadata source has an invalid value. ∗/ {

return; } /∗ else (ret val ≡ 0, but metadata source has an invalid value.) ∗/

186. Set delete old records to  . It should only ever be  the first time through the loop.

[LDF 2006.07.04.]

⟨ Define Dialog 1 functions 136 ⟩ +≡ delete old records = ; edit 1 str = ; UpdateData( ); result box UpdateWindow ( );

187. End of do loop. [LDF 2006.09.11.] ⟨ Define Dialog 1 functions 136 ⟩ +≡

records file name strm.str ( ); } /∗ do ∗/ #if

while (strlen(resumption token) > 0) ; #else

while ( ) ; #endif #undef

edit 1 str = ; UpdateData( ); result box UpdateWindow ( ); delete curr metadata source; curr metadata source = 0; delete[ ] resumption token; resumption token = 0;

#if 1 /∗ 0 ∗/ temp strm ≪ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif } /∗ End of void Dialog 1 ::OnBnClickedDownload ( ) definition. ∗/

188. OnBnClickedTimms. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedTimms ( );

189. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedTimms ( ) {

metadata source = Metadata Source :: ; }

190. OnBnClickedDbt. [LDF Undated.] ⟨ Declare public Dialog 1 functions 135 ⟩ +≡

afx msg void OnBnClickedDbt ( );

46 ONBNCLICKEDDBT  IWF Metadata Harvester I  §191

191. ⟨ Define Dialog 1 functions 136 ⟩ +≡

void Dialog 1 ::OnBnClickedDbt ( ) {

metadata source = Metadata Source :: ; }

192. Dialog 1 message map. [LDF Undated.] ⟨ Dialog 1 message map 192 ⟩ ≡

(Dialog 1, CDialog) ( , OnBnClickedOk ) ( , OnBnClickedToday ) ( , OnBnClickedYesterday ) ( , OnBnClickedThisWeek ) ( , OnBnClickedLastWeek ) ( , OnBnClickedThisMonth) ( , OnBnClickedLastMonth) ( , OnBnClickedLast6Months ) ( , OnBnClickedThisYear ) ( , OnBnClickedLastYear ) ( , OnBnClickedLast2Years ) ( , OnBnClickedLast5Years ) ( , OnBnClickedLast10Years ) ( , OnBnClickedLast20Years ) ( , OnBnClickedAllRecords ) ( , OnBnClickedCancel ) ( , OnBnClickedDownload ) ( , OnBnClickedTimms ) ( , OnBnClickedDbt ) ( )

This code is used in section 206.

193. Download records. [LDF Undated.]

Log

[LDF Undated.] Added this function.

[LDF 2006.09.11.] Added the const char ∗records file name argument.

§194  IWF Metadata Harvester I  DOWNLOAD RECORDS 47

⟨ Declare public Dialog 1 functions 135 ⟩ +≡ int download records (const unsigned short metadata source, const unsigned short ttimespan, const CTime ∗ctime, char ∗resumption token, const char ∗records file name); 194. ⟨ Define Dialog 1 functions 136 ⟩ +≡

int Dialog 1 ::download records (const unsigned short metadata source, const unsigned short ttimespan, const CTime ∗ctime, char ∗resumption token, const char ∗records file name){ DWORD dwAccessType = ;

stringstream message strm; stringstream temp strm; stringstream command strm;

#if 0 /∗ 1 ∗/ temp strm ≪ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

48  DOWNLOAD RECORDS  IWF Metadata Harvester I §195

#endif CInternetSession session( , dwAccessType); CHttpConnection ∗pServer = NULL; CHttpFile ∗pFile = NULL; BOOL b = false; DWORD dwServiceType; CString strServerName; CString strObject ; INTERNET PORT nPort ; CString temp str ; UINT ret val ; LPCTSTR pszURL; 195. TIMMS. ⟨ Define Dialog 1 functions 136 ⟩ +≡

if (metadata source ≡ Metadata Source :: ) { #if 0 /∗ 1 ∗/

temp strm ≪ ␣ ␣ ≪ endl ≪

␣ ␣ ≪ resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif edit 1 str += ␣ ␣ ␣ ; temp strm ≪ ; if (timespan ≡ Selector :: ) ; /∗ Do nothing. ∗/ else if (strlen(resumption token) ≤ 0) {

temp strm ≪ ≪ ctime Format ( ) ≪ ; } if (strlen(resumption token) > 0) {

temp strm ≪ ≪ resumption token; }

#if 0 /∗ 1 ∗/

AfxMessageBox (temp strm.str ( ).c str ( )); #endif

temp str = temp strm.str ( ).c str ( ); pszURL = temp str ; edit 1 str += temp str ; edit 1 str += ; UpdateData( );

}  /∗ if (metadata source ≡ Metadata Source ::  ) ∗/

196. ⟨ Define Dialog 1 functions 136 ⟩ +≡

else

if (metadata source ≡ Metadata Source :: ) { #if 0 /∗ 1 ∗/

temp strm ≪ ␣ ␣ ≪ endl ≪

␣ ␣ ≪ resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif edit 1 str += ␣ ␣ ␣ ; command strm ≪ ≪

; if (timespan ≡ Selector :: ∧ strlen(resumption token) ≡ 0) {

command strm ≪ ; } else if (strlen(resumption token) ≤ 0) {

command strm ≪ ≪ ctime Format ( ) ≪ ; } if (strlen(resumption token) > 0) {

command strm ≪ ≪ resumption token; }

#if 0 temp strm ≪ ␣␣ ≪ command strm.str ( ); AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif temp str = ; temp str += command strm.str ( ).c str ( ); pszURL = temp str ; edit 1 str += temp str ; edit 1 str += ; UpdateData( ); command strm.str ( );

} /∗ else if (metadata source ≡ Metadata Source :: ) ∗/

197. ⟨ Define Dialog 1 functions 136 ⟩ +≡

else {

message strm ≪  ␣␣  ␣  ≪ endl ≪  ␣

  ␣␣ ≪  ␣        ␣              ␣    ␣       ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( )); message strm.str ( ); edit 1 str = ␣ ␣␣ ␣ ␣ ; UpdateData( ); return 1;

} /∗ else (Invalid value for metadata source. ∗/ temp strm.str ( ); 198. Parse the URL. ⟨ Define Dialog 1 functions 136 ⟩ +≡

b = AfxParseURL(pszURL, dwServiceType, strServerName, strObject , nPort );

199. Error handling: AfxParseURL failed. [LDF 2006.06.01.] ⟨ Define Dialog 1 functions 136 ⟩ +≡

if (¬b) {

message strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ≪ dwServiceType ≪ endl ≪ ␣ ␣ ≪ strServerName ≪ endl ≪ ␣ ␣ ≪ strObject ≪ endl ≪ ␣ ␣ ≪ nPort ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( ); } /∗ ¬b (AfxParseURL failed. LDF 2006.06.01. ∗/ 200. AfxParseURL succeeded. [LDF 2006.06.01.] ⟨ Define Dialog 1 functions 136 ⟩ +≡ #if 0

else {

message strm ≪ ␣ ≪ ␣ ≪ endl ≪ ␣ ␣ ≪ dwServiceType ≪ endl ≪ ␣ ␣ ≪ strServerName ≪ endl ≪ ␣ ␣ ≪ strObject ≪ endl ≪ ␣ ␣ ≪ nPort ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( ); } /∗ b ≡ true (AfxParseURL succeeded. LDF 2006.06.01. ∗/

#endif pServer = session.GetHttpConnection(strServerName, nPort ); if (pServer ≡ 0) {

AfxMessageBox ( ␣ );

message strm.str ( ); }

#if 0 /∗ 1 ∗/ else /∗ pServer ≠ 0 ∗/ {

AfxMessageBox ( ␣ );

message strm.str ( ); } /∗ else (pServer ≠ 0) ∗/

#endif

DWORD dwHttpRequestFlags = |

; const szHeaders [ ] = ( ␣ ␣ ); pFile = pServer OpenRequest (CHttpConnection :: , strObject , NULL, 1, NULL, NULL,

dwHttpRequestFlags ); pFile AddRequestHeaders (szHeaders ); pFile SendRequest ( ); DWORD dwRet ; pFile QueryInfoStatusCode(dwRet );

#if 0 /∗ 1 ∗/ message strm ≪ ␣ ␣ ␣ ␣ ≪ dwRet ; AfxMessageBox (message strm.str ( ).c str ( )); message strm.str ( );

#endif

if (dwRet ≡ ) {

message strm ≪  ␣␣  ␣  ≪ endl ≪

      ␣       ␣        ␣␣      ␣    ␣  ␣  ≪ endl ≪
      ␣        ␣     ␣      ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( );

session.Close( );

return 1;

}  /∗ if (dwRet ≡  ) ∗/

201. Read text from pFile into the character buffer buff and write it to ofstream out strm, which is attached to the file whose name records file name. [LDF 2006.06.01.] [LDF 2006.09.11.] ⟨ Define Dialog 1 functions 136 ⟩ +≡

unsigned int ;

= 1048576; /∗ 1 MB ∗/ /∗ ≡ 8000 ∗/ char ∗buff = new char[ ]; ofstream out strm; out strm.open(records file name); ULONGLONG file length; file length = pFile GetLength( );

#if 0 temp strm ≪ ␣ ␣ ≪ file length; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif int i = 1; ret val = 0;

202. ⟨ Define Dialog 1 functions 136 ⟩ +≡

do

{ #if 0

temp strm ≪ ␣ ≪ i^{++} ≪ endl ≪ ␣ ␣ ≪ ret val ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif ret val = pFile Read (buff , ); if (ret val > 0) {

out strm.write(buff , ret val ); }

#if 0

message strm ≪ ␣ ␣ ␣ ␣ ≪ ret val ≪ endl ; #if 0 /∗ 1 ∗/

message strm ≪ buff ; #endif

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( ); #endif

} /∗ do ∗/

203.

Log

[LDF 2006.07.06.] !! BUG FIX: Changed conditional from ret val ≡ to ret val > 0. The way it was before worked for TIMMS, but failed for DBT.

⟨ Define Dialog 1 functions 136 ⟩ +≡ while (ret val > 0) ; 204. Exit download records successfully with return value 0. ⟨ Define Dialog 1 functions 136 ⟩ +≡

out strm.close( ); delete[ ] buff ; session.Close( );

#if 1 /∗ 0 ∗/ temp strm ≪ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif return 0; } /∗ End of Dialog 1 ::download records definition. ∗/

205. Putting Dialog 1 together.

206. This is what’s compiled.

⟨ Include files 20 ⟩ ⟨ Dialog 1 message map 192 ⟩ ⟨ Define Dialog 1 functions 136 ⟩

54  PUTTING DIALOG 1 TOGETHER  IWF Metadata Harvester I §207

207. This is what’s written to dialog1a.h. ⟨ 207 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩ #include

⟨ class Dialog 1 declaration 133 ⟩

208. Dialog 2 (dialog2a.web). [LDF 2006.09.28.]

Log

[LDF 2006.09.28.] Replaced the files Dialog_2.h, Dialog_2.cpp, with this file, dialog2a.web.

⟨ dialog2a.web 208 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9. This code is used in section 881.

209. Include files. ⟨ Include files 20 ⟩ +≡ #include #include #include

210. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

211. Preprocessor macro definitions. ⟨ Preprocessor macro definitions 18 ⟩ +≡

212. class Dialog 2 declaration. [LDF Undated.]

Log

[LDF 2006.08.01.] Made all CString results str private.

⟨ class Dialog 2 declaration 212 ⟩ ≡

class Dialog 2 : public CDialog {

(Dialog 2) private: CString results str ;

CString search str ;

unsigned int select value;

BOOL ignore case;

unsigned int search options ; unsigned short timespan; unsigned short sort order ; unsigned short sort field ; unsigned short use date type; BOOL suppress duplicate records ;

public: ⟨ Declare public Dialog 2 functions 216 ⟩

enum { =

}; protected: ⟨ Declare protected Dialog 2 functions 227 ⟩

( ) };

This code is used in section 293.

213. Global variable declarations. [LDF Undated.] ⟨ Global variable declarations 55 ⟩ +≡

214. extern global variable declarations. [LDF Undated.] ⟨ extern global variable declarations 56 ⟩ +≡

215. Functions. [LDF Undated.]

216. Constructor. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ ≡

Dialog 2(CWnd ∗pParent = NULL);

See also sections 218, 220, 230, 232, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 274, 276, 278, 280, 282, 284,

286, and 288. This code is used in section 212.

217. ⟨ Define Dialog 2 functions 217 ⟩ ≡

(Dialog 2, CDialog)Dialog 2 ::Dialog 2(CWnd ∗pParent ) /∗ = NULL ∗/ : CDialog(Dialog 2 :: , pParent ) , results str ( ( )) , search str ( ( )) , select value(0) , ignore case( ) , search options (Selector :: | Selector :: ) , timespan(0) , sort order (0) , sort field (0) , use date type(Selector :: ) , suppress duplicate records ( ) { }

See also sections 219, 221, 222, 223, 224, 225, 226, 228, 231, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 246, 248,

250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 271, 272, 273, 275, 277, 279, 281, 283, 285, 287, and 289. This code is used in section 292.

218. Destructor. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

56  DESTRUCTOR  IWF Metadata Harvester I §219

virtual ∼Dialog 2( ); 219. ⟨ Define Dialog 2 functions 217 ⟩ +≡

Dialog 2 ::∼Dialog 2( ) { }

220. Initialize Dialog 2. ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

virtual BOOL OnInitDialog ( );

221. ⟨ Define Dialog 2 functions 217 ⟩ +≡

BOOL Dialog 2 ::OnInitDialog ( ){ CDialog ::OnInitDialog ( );

222. Enter table names and groups of table names in selection edit box. [LDF Undated.] ⟨ Define Dialog 2 functions 217 ⟩ +≡

CListBox ∗pLB = (CListBox ∗) GetDlgItem( );

pLB InsertString (−1,  ␣         ␣  );
pLB InsertString (−1,  ␣  );
pLB InsertString (−1,  ␣  );

pLB InsertString (−1, ); pLB InsertString (−1, ); pLB InsertString (−1, ); pLB InsertString (−1, ); pLB InsertString (−1, ); pLB InsertString (−1, ); pLB InsertString (−1, ); pLB InsertString (−1, ); pLB InsertString (−1, ); pLB InsertString (−1, ); pLB SetSel (0, ); pLB = NULL; CButton ∗pBT = (CButton ∗) GetDlgItem( ); pBT SetCheck ( ); pBT = NULL;

223. “List All Records” group. [LDF Undated.] ⟨ Define Dialog 2 functions 217 ⟩ +≡

pLB = (CListBox ∗) GetDlgItem( ); pLB InsertString (−1, ␣ ); pLB InsertString (−1, ); pLB InsertString (−1, );

pLB InsertString (−1,  ␣  );
pLB InsertString (−1,  ␣       ␣  );

pLB SetCurSel (0); pBT = (CButton ∗) GetDlgItem( ); pBT SetCheck ( ); pBT = NULL; timespan = Selector :: ; sort order = Selector :: ; 224. ⟨ Define Dialog 2 functions 217 ⟩ +≡

pBT = (CButton ∗) GetDlgItem( );

pBT SetCheck ( );

pBT = NULL;

pBT = (CButton ∗) GetDlgItem( );

pBT SetCheck ( );

pBT = NULL;

225. If I change the tab sequence in the dialog box, I’ll have to call SetFocus and have this function return 0. Otherwise, if this function doesn’t return 0, the first item in the dialog box has the input focus.

[LDF 2006.06.20.]

⟨ Define Dialog 2 functions 217 ⟩ +≡ #if 0

CEdit ∗pEB = (CEdit ∗) GetDlgItem( );

pEB SetFocus ( ); #endif

226. Return unless you set the focus to a control. AUSNAHME: OCX-Eigenschaftenseite muss zurückgeben. ⟨ Define Dialog 2 functions 217 ⟩ +≡ #if 0 /∗ 1 ∗/

return ; #endif

return CDialog ::OnInitDialog ( ); } /∗ End of Dialog 2 ::OnInitDialog definition. ∗/

227. Do Data Exchange. [LDF Undated.] ⟨ Declare protected Dialog 2 functions 227 ⟩ ≡

virtual void DoDataExchange(CDataExchange ∗pDX );

This code is used in section 212.

228. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::DoDataExchange(CDataExchange ∗pDX )

{ CDialog ::DoDataExchange(pDX ); DDX Text (pDX , , results str ); DDX Text (pDX , , search str ); DDX Check (pDX , , ignore case);

}

229. Event handlers.

Log

[LDF 2006.09.28.] Added this section.

230. OnBnClickedOk. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedOk ( );

58 ONBNCLICKEDOK  IWF Metadata Harvester I  §231

231. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedOk ( )

{ #if 0 /∗ 1 ∗/

OnOK ( ); #endif

exit (0); }

232. OnBnClickedSearch. [LDF Undated.]

Log

[LDF 2006.10.09.] !! BUG FIX: Now declaring stringstream temp strm.

⟨ Declare public Dialog 2 functions 216 ⟩ +≡ afx msg void OnBnClickedSearch( );

233. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedSearch( ){ stringstream temp strm; CEdit ∗pEB = (CEdit ∗) GetDlgItem( ); CListBox ∗pLB = (CListBox ∗) GetDlgItem( ); while ( ) {

pEB GetWindowText (search str ); if (search str ≡ ) {

AfxMessageBox ( ␣ ␣ ␣ ␣ ); return;

}

else break; } /∗ while ∗/

#if 0 temp strm ≪ ␣ ␣ ≪ search options ≪ endl ≪ ␣ ␣ ≪ search str ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif #if 0

temp strm ≪ ␣ ␣ ≪ search str ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

§234  IWF Metadata Harvester I  ONBNCLICKEDSEARCH  59

#endif int buff [16]; int items ctr ; items ctr = pLB GetSelItems (16, buff ); 234. ⟨ Define Dialog 2 functions 217 ⟩ +≡

if (items ctr ≡ ) {

temp strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ␣ ␣ ≪ items ctr ≪ endl ≪

        ␣        ␣              ␣   ␣       ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

return; }

235. ⟨ Define Dialog 2 functions 217 ⟩ +≡

else

if (items ctr ≡ 0) {

temp strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ␣ ␣ ␣ ≪ items ctr ≪ endl ≪

          ␣    ␣ ␣       ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( ); }

236. ⟨ Define Dialog 2 functions 217 ⟩ +≡

else /∗ ¬(items ctr ≡ ∨ items ctr ≡ 0) ∗/

{ select value = 0;

CString selection str ; for (int i = 0; i < items ctr ; ^{++}i) { pLB GetText (buff [i], selection str ); #if 0

temp strm ≪ ≪ i ≪ ␣ ␣ ≪ buff [i] ≪ endl ≪ ␣ ␣ ≪ selection str ≪

endl ; #endif

if (buff [i] ≡ 0) /∗ Titles, Subjects, Descriptions ∗/

{

select value |= Selector :: | Selector :: | Selector :: ; #if 0

temp strm ≪ ␣ ␣ ␣ ≪ endl ; #endif

} /∗ if ∗/

237. ⟨ Define Dialog 2 functions 217 ⟩ +≡

else if (buff [i] ≡ 1) /∗ ∗/ {

select value |= Selector :: | Selector :: ; #if 0

temp strm ≪ ␣ ␣ ≪ endl ; #endif

60 ONBNCLICKEDSEARCH  IWF Metadata Harvester I  §238

} /∗ else if ∗/ 238. ⟨ Define Dialog 2 functions 217 ⟩ +≡

else if (buff [i] ≡ 2) /∗ All Fields ∗/ {

select value = Selector ::  | Selector ::  | Selector ::  |
Selector ::  | Selector ::  | Selector ::  | Selector ::  |
Selector ::  | Selector ::  | Selector ::  ;

#if 0

temp strm ≪ ␣ ␣ ␣ ≪ ≪ endl ; #endif

break; } /∗ else if ∗/

239. ⟨ Define Dialog 2 functions 217 ⟩ +≡

else

if (selection str ≡ ) {

select value |= Selector :: ; } else if (selection str ≡ ) {

select value |= Selector :: ; } else if (selection str ≡ ) {

select value |= Selector :: ; } else if (selection str ≡ ) {

select value |= Selector :: ; } else if (selection str ≡ ) {

select value |= Selector :: ; } else if (selection str ≡ ) {

select value |= Selector :: ; } else if (selection str ≡ ) {

select value |= Selector :: ; } else if (selection str ≡ ) {

select value |= Selector :: ; } else if (selection str ≡ ) {

select value |= Selector :: ; } else if (selection str ≡ ) {

select value |= Selector :: ; }

} /∗ for ∗/ 240. ⟨ Define Dialog 2 functions 217 ⟩ +≡ #if 0

temp strm ≪ ␣ ␣ ≪ select value; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif temp strm.str ( ); CEdit ∗result box = (CEdit ∗) GetDlgItem( ); results str = ␣ ␣ ; UpdateData( ); result box UpdateWindow ( ); CString result str ; int ret val ;

241. ⟨ Define Dialog 2 functions 217 ⟩ +≡

Selector selector ; selector .use date type = use date type;

242. Error handling: Selector constructor failed. [LDF Undated.] ⟨ Define Dialog 2 functions 217 ⟩ +≡

if (errno ≠ 0) {

temp strm ≪ ␣␣ ␣ ␣ ≪

      ␣  ␣      ␣ ␣          ␣  ≪ endl ≪  ␣      ␣         ␣␣ ≪
      ␣        ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

return; } /∗ if (errno ≠ 0) ∗/

243. ⟨ Define Dialog 2 functions 217 ⟩ +≡

ret val = selector .select from database(select value, search str , search options ); #if 0

temp strm ≪ ␣ ␣ ≪ ret val ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif temp strm ≪ ␣ ␣ ≪ ret val ≪ ␣ ; if (ret val > 1) temp strm ≪ ; temp strm ≪ ␣ ; results str = temp strm.str ( ).c str ( ); UpdateData( ); result box UpdateWindow ( ); UpdateData( );

temp strm.str ( ); }  /∗ else (nIndex ≠  ) ∗/

244. ⟨ Define Dialog 2 functions 217 ⟩ +≡

} /∗ End of Dialog 2 ::OnBnClickedSearch definition. ∗/

245. OnBnClickedBegOrWholeWord. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedBegOrWholeWord ( );

246. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedBegOrWholeWord ( )

{ search options |= Selector :: ; search options &= ∼Selector :: ; search options &= ∼Selector :: ; search options &= ∼Selector :: ;

}

247. OnBnClickedWholeWordOnly. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedWholeWordOnly ( );

248. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedWholeWordOnly ( )

{ search options |= Selector :: ; search options &= ∼Selector :: ; search options &= ∼Selector :: ; search options &= ∼Selector :: ;

}

249. OnBnClickedWholeOrPartialWord. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedWholeOrPartialWord ( );

250. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedWholeOrPartialWord ( )

{ search options |= Selector :: ; search options &= ∼Selector :: ; search options &= ∼Selector :: ; search options &= ∼Selector :: ;

}

251. OnBnClickedCaseIgnore. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedCaseIgnore( );

§252  IWF Metadata Harvester I  ONBNCLICKEDCASEIGNORE  63

252. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedCaseIgnore( )

{ ignore case = ¬ignore case; if (ignore case) search options |= Selector :: ; else search options &= ∼Selector :: ;

}

253. OnBnClickedExactMatch. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedExactMatch( );

254. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedExactMatch( )

{ search options |= Selector :: ; search options &= ∼Selector :: ; search options &= ∼Selector :: ; search options &= ∼Selector :: ;

}

255. OnBnClickedAllDates. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedAllDates ( );

256. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedAllDates ( )

{

timespan = Selector :: ; }

257. OnBnClickedSinceLastYear. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedSinceLastYear ( );

258. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedSinceLastYear ( )

{

timespan = Selector :: ; }

259. OnBnClickedThisYear. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedThisYear ( );

64 ONBNCLICKEDTHISYEAR  IWF Metadata Harvester I  §260

260. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedThisYear ( )

{

timespan = Selector :: ; }

261. OnBnClickedLast6Months. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedLast6Months ( );

262. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedLast6Months ( )

{

timespan = Selector :: ; }

263. OnBnClickedLastMonth. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedLastMonth( );

264. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedLastMonth( )

{

timespan = Selector :: ; }

265. OnBnClickedThisMonth. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedThisMonth( );

266. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedThisMonth( )

{

timespan = Selector :: ; }

267. OnBnClickedThisWeek. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedThisWeek ( );

268. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedThisWeek ( )

{

timespan = Selector :: ; }

§269  IWF Metadata Harvester I  ONBNCLICKEDLISTRECORDS  65

269. OnBnClickedListRecords. [LDF Undated.]

Log

[LDF 2006.10.09.] !! BUG FIX: Now declaring stringstream temp strm.

⟨ Declare public Dialog 2 functions 216 ⟩ +≡ afx msg void OnBnClickedListRecords ( );

270. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedListRecords ( ){ stringstream temp strm; CListBox ∗sort box = (CListBox ∗) GetDlgItem( ); CEdit ∗result box = (CEdit ∗) GetDlgItem( ); sort field = sort box GetCurSel ( ); if (sort field ≡ ) {

temp strm ≪ ␣␣ ␣ ≪ ␣ ≪ endl ≪

      ␣            ␣ ␣                               ␣ ≪  ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

sort field = Selector :: ; } else if (sort field ≡ 0) sort field = Selector :: ; else if (sort field ≡ 1) sort field = Selector :: ; else if (sort field ≡ 2) sort field = Selector :: ; else if (sort field ≡ 3) sort field = Selector :: ; else if (sort field ≡ 4) sort field = Selector :: ; else {

temp strm ≪ ␣␣ ␣ ≪ ␣ ␣ ␣ ␣ ≪ sort field ≪ endl ≪

      ␣            ␣ ␣                               ␣ ≪  ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

sort field = Selector :: ; } int ret val ;

271. ⟨ Define Dialog 2 functions 217 ⟩ +≡

Selector selector ; selector .use date type = use date type;

66 ONBNCLICKEDLISTRECORDS  IWF Metadata Harvester I  §272

272. Error handling: Selector constructor failed. [LDF Undated.] ⟨ Define Dialog 2 functions 217 ⟩ +≡

if (errno ≠ 0) {

temp strm ≪ ␣␣ ␣ ␣ ≪ ␣ ␣ ␣ ␣ ␣ ≪ endl ≪

      ␣      ␣         ␣␣       ␣        ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

return; } /∗ if (errno ≠ 0) ∗/

273. ⟨ Define Dialog 2 functions 217 ⟩ +≡

results str = ␣ ␣ ␣ ; UpdateData( ); result box UpdateWindow ( ); CButton ∗pBT = (CButton ∗) GetDlgItem( ); suppress duplicate records = (pBT GetState( )) ? : ; ret val = selector .list records (sort field , sort order , timespan, suppress duplicate records ); temp strm ≪ ␣ ␣ ≪ ret val ≪ ␣ ; if (ret val > 1) temp strm ≪ ; temp strm ≪ ␣ ; results str = temp strm.str ( ).c str ( ); UpdateData( ); result box UpdateWindow ( ); temp strm.str ( ); return; } /∗ End of OnBnClickedListRecords definition. ∗/

274. OnBnClickedDescending. [LDF Undated.]

Log

[LDF 2006.10.09.] !! BUG FIX: Now declaring stringstream temp strm.

⟨ Declare public Dialog 2 functions 216 ⟩ +≡ afx msg void OnBnClickedDescending ( );

§275  IWF Metadata Harvester I  ONBNCLICKEDDESCENDING  67

275. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedDescending ( )

{ stringstream temp strm;

if (sort order ≡ Selector ::  ) sort order = Selector ::  ;
else if (sort order ≡ Selector ::  ) sort order = Selector ::  ;

else {

temp strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ␣ ≪ sort order ≪ endl ≪

          ␣           ␣ ␣                          ␣   ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( ); }

}

276. OnBnClickedUseDcDate. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedUseDcDate( );

277. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedUseDcDate( )

{

use date type = Selector :: ; }

278. OnBnClickedUseHeaderDatestamp. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedUseHeaderDatestamp( );

279. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedUseHeaderDatestamp( )

{

use date type = Selector :: ; }

280. OnBnClickedListTitles. [LDF 2006.06.29.]

Log

[LDF 2006.06.29.] Added this function.

[LDF 2006.10.09.] !! BUG FIX: Now declaring stringstream temp strm.

⟨ Declare public Dialog 2 functions 216 ⟩ +≡ afx msg void OnBnClickedListTitles ( );

68 ONBNCLICKEDLISTTITLES  IWF Metadata Harvester I  §281

281. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedListTitles ( ) {

stringstream temp strm; Selector selector ; selector .use date type = use date type; CEdit ∗result box = (CEdit ∗) GetDlgItem( ); results str = ␣ ␣ ; UpdateData( ); result box UpdateWindow ( ); int ret val = selector .list table(Selector :: , timespan, sort order ); if (ret val < 0) {

temp strm ≪ ␣␣ ␣ ␣ ␣ ≪ ret val ≪ ; results str = temp strm.str ( ).c str ( ); temp strm.str ( );

} else if (ret val ≡ 0) {

results str = ␣␣ ␣ ␣ ; } else /∗ (ret val > 0) ∗/ {

temp strm ≪  ␣␣     ␣ ≪ ret val ≪ ␣  ≪

      ␣            ␣    ␣  ;

results str = temp strm.str ( ).c str ( );

temp strm.str ( ); } UpdateData( ); result box UpdateWindow ( ); return;

} /∗ End of Dialog 2 ::OnBnClickedListTitles definition. ∗/

282. OnBnClickedCreators. [LDF Undated.]

Log

[LDF 2006.10.09.] !! BUG FIX: Now declaring stringstream temp strm.

⟨ Declare public Dialog 2 functions 216 ⟩ +≡ afx msg void OnBnClickedCreators ( );

§283  IWF Metadata Harvester I  ONBNCLICKEDCREATORS  69

283. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedCreators ( ) {

stringstream temp strm; Selector selector ; selector .use date type = use date type; CEdit ∗result box = (CEdit ∗) GetDlgItem( ); results str = ␣ ␣ ; UpdateData( ); result box UpdateWindow ( ); int ret val = selector .list table(Selector :: , timespan, sort order ); if (ret val < 0) {

temp strm ≪ ␣␣ ␣ ␣ ␣ ≪ ret val ≪ ; results str = temp strm.str ( ).c str ( ); temp strm.str ( );

} else if (ret val ≡ 0) {

results str = ␣␣ ␣ ␣ ; } else /∗ (ret val > 0) ∗/ {

temp strm ≪  ␣␣     ␣ ≪ ret val ≪ ␣  ≪

      ␣               ␣   ␣  ;

results str = temp strm.str ( ).c str ( );

temp strm.str ( ); } UpdateData( ); result box UpdateWindow ( ); return;

} /∗ End of Dialog 2 ::OnBnClickedListCreators definition. ∗/

284. OnBnClickedCancel. [LDF Undated.] ⟨ Declare public Dialog 2 functions 216 ⟩ +≡

afx msg void OnBnClickedCancel ( );

285. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedCancel ( ) {

OnCancel ( ); #if 0 /∗ 1 ∗/

exit (0); #endif

}

70 ONBNCLICKEDCONTRIBUTORS  IWF Metadata Harvester I  §286

286. OnBnClickedContributors. [LDF Undated.]

Log

[LDF 2006.10.09.] !! BUG FIX: Now declaring stringstream temp strm.

⟨ Declare public Dialog 2 functions 216 ⟩ +≡ afx msg void OnBnClickedContributors ( );

287. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedContributors ( ) {

stringstream temp strm; Selector selector ; selector .use date type = use date type; CEdit ∗result box = (CEdit ∗) GetDlgItem( ); results str = ␣ ␣ ; UpdateData( ); result box UpdateWindow ( ); int ret val = selector .list table(Selector :: , timespan, sort order ); if (ret val < 0) {

temp strm ≪ ␣␣ ␣ ␣ ␣ ≪ ret val ≪ ; results str = temp strm.str ( ).c str ( ); temp strm.str ( );

} else if (ret val ≡ 0) {

results str = ␣␣ ␣ ␣ ; } else /∗ (ret val > 0) ∗/ {

temp strm ≪  ␣␣     ␣ ≪ ret val ≪ ␣  ≪

      ␣                   ␣   ␣  ;

results str = temp strm.str ( ).c str ( );

temp strm.str ( ); } UpdateData( ); result box UpdateWindow ( ); return;

} /∗ End of Dialog 2 ::OnBnClickedListContributors definition. ∗/

288. OnBnClickedSubjects. [LDF Undated.]

Log

[LDF 2006.10.09.] !! BUG FIX: Now declaring stringstream temp strm.

⟨ Declare public Dialog 2 functions 216 ⟩ +≡ afx msg void OnBnClickedSubjects ( );

§289  IWF Metadata Harvester I  ONBNCLICKEDSUBJECTS  71

289. ⟨ Define Dialog 2 functions 217 ⟩ +≡

void Dialog 2 ::OnBnClickedSubjects ( ) {

stringstream temp strm;

Selector selector ;

selector .use date type = use date type;

CEdit ∗result box = (CEdit ∗) GetDlgItem( );

results str = ␣ ␣ ;

UpdateData( );

result box UpdateWindow ( );

int ret val = selector .list table(Selector :: , timespan, sort order ); if (ret val < 0) {

temp strm ≪ ␣␣ ␣ ␣ ␣ ≪ ret val ≪ ; results str = temp strm.str ( ).c str ( ); temp strm.str ( );

}

else if (ret val ≡ 0) {

results str = ␣␣ ␣ ␣ ; } else /∗ (ret val > 0) ∗/ {

temp strm ≪  ␣␣     ␣ ≪ ret val ≪ ␣  ≪

        ␣               ␣   ␣  ;

results str = temp strm.str ( ).c str ( );

temp strm.str ( ); } UpdateData( ); result box UpdateWindow ( ); return;

} /∗ End of Dialog 2 ::OnBnClickedSubjects definition. ∗/

290. Dialog 2 message map. [LDF Undated.] ⟨ Dialog 2 message map 290 ⟩ ≡

(Dialog 2, CDialog) ( , OnBnClickedOk ) ( , OnBnClickedSearch) ( , OnBnClickedBegOrWholeWord ) ( , OnBnClickedWholeWordOnly ) ( , OnBnClickedWholeOrPartialWord ) ( , OnBnClickedCaseIgnore) ( , OnBnClickedExactMatch) ( , OnBnClickedAllDates ) ( , OnBnClickedSinceLastYear ) ( , OnBnClickedThisYear ) ( , OnBnClickedLast6Months ) ( , OnBnClickedLastMonth) ( , OnBnClickedThisMonth) ( , OnBnClickedThisWeek ) ( , OnBnClickedListRecords )

72 DIALOG 2 MESSAGE MAP IWF Metadata Harvester I §290

( , OnBnClickedDescending ) ( , OnBnClickedUseDcDate) ( , OnBnClickedUseHeaderDatestamp) ( , OnBnClickedListTitles ) ( , OnBnClickedCreators ) ( , OnBnClickedCancel ) ( , OnBnClickedContributors ) ( , OnBnClickedSubjects ) ( )

This code is used in section 292.

291. Putting Dialog 2 together.

292. This is what’s compiled.

⟨ Include files 20 ⟩ ⟨ Preprocessor macro definitions 18 ⟩ ⟨ Global variable declarations 55 ⟩ ⟨ Dialog 2 message map 290 ⟩ ⟨ Define Dialog 2 functions 217 ⟩

293. This is what’s written to dialog2a.h. ⟨ 293 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩ ⟨ class Dialog 2 declaration 212 ⟩ ⟨ extern global variable declarations 56 ⟩

294. Global functions (glblfncs.web). [LDF 2006.09.28.] ⟨ glblfncs.web 294 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9. This code is used in section 881.

295. Include files. ⟨ Include files 20 ⟩ +≡ #include

296. Global functions.

297. Get HTTP file. [LDF 2006.05.30.]

Log

[LDF 2006.05.30.] Added this function.

⟨ Declare global functions 297 ⟩ ≡

int get http file(LPCTSTR pszURL);

See also sections 305 and 307. This code is used in section 311.

§298  IWF Metadata Harvester I  GET HTTP FILE 73

298. ⟨ Define global functions 298 ⟩ ≡

int get http file(LPCTSTR pszURL){ DWORD dwAccessType = ; stringstream message strm; stringstream temp strm; CInternetSession session( , dwAccessType); CHttpConnection ∗pServer = NULL; CHttpFile ∗pFile = NULL; BOOL b = false; DWORD dwServiceType; CString strServerName; CString strObject ; INTERNET PORT nPort ;

See also sections 299, 300, 301, 302, 303, 304, 306, and 308. This code is used in section 310.

299. Parse the URL passed in the LPCTSTR pszURL parameter. [LDF 2006.06.01.] ⟨ Define global functions 298 ⟩ +≡

b = AfxParseURL(pszURL, dwServiceType, strServerName, strObject , nPort );

300. Error handling: AfxParseURL failed. [LDF 2006.06.01.] ⟨ Define global functions 298 ⟩ +≡

if (¬b) {

message strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ≪ dwServiceType ≪ endl ≪ ␣ ␣ ≪ strServerName ≪ endl ≪ ␣ ␣ ≪ strObject ≪ endl ≪ ␣ ␣ ≪ nPort ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( ); } /∗ ¬b (AfxParseURL failed. LDF 2006.06.01. ∗/

301. AfxParseURL succeeded. [LDF 2006.06.01.] ⟨ Define global functions 298 ⟩ +≡ #if 0

else {

message strm ≪ ␣ ≪ ␣ ≪ endl ≪ ␣ ␣ ≪ dwServiceType ≪ endl ≪ ␣ ␣ ≪ strServerName ≪ endl ≪ ␣ ␣ ≪ strObject ≪ endl ≪ ␣ ␣ ≪ nPort ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( ); } /∗ b ≡ true (AfxParseURL succeeded. LDF 2006.06.01. ∗/

#endif

74  GET HTTP FILE  IWF Metadata Harvester I §302

302. ⟨ Define global functions 298 ⟩ +≡

pServer = session.GetHttpConnection(strServerName, nPort ); if (pServer ≡ 0) {

AfxMessageBox ( ␣ ); message strm.str ( );

} #if 0

else /∗ pServer ≠ 0 ∗/ {

AfxMessageBox ( ␣ ); message strm.str ( );

} /∗ else (pServer ≠ 0) ∗/ #endif

DWORD dwHttpRequestFlags = |

; const szHeaders [ ] = ( ␣ ␣ ); pFile = pServer OpenRequest (CHttpConnection :: , strObject , NULL, 1, NULL, NULL,

dwHttpRequestFlags ); pFile AddRequestHeaders (szHeaders ); pFile SendRequest ( ); DWORD dwRet ; pFile QueryInfoStatusCode(dwRet );

#if 0 message strm ≪ ␣ ␣ ␣ ␣ ≪ dwRet ; AfxMessageBox (message strm.str ( ).c str ( )); message strm.str ( );

#endif

if (dwRet ≡ ) {

message strm ≪  ␣␣  ␣  ≪ endl ≪

      ␣       ␣        ␣␣      ␣    ␣  ␣  ≪ endl ≪
      ␣        ␣     ␣      ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( );

session.Close( );

return 1;

}  /∗ if (dwRet ≡  ) ∗/

303. Read text from pFile into the character buffer buff and write it to ofstream out strm, which is attached to the file records.xml. [LDF 2006.06.01.] ⟨ Define global functions 298 ⟩ +≡

unsigned int ; = 1048576; /∗ 1 MB ∗/ char ∗buff = new char[ ]; UINT ret val ; ofstream out strm; out strm.open( ); ULONGLONG file length; file length = pFile GetLength( ); do {

ret val = pFile Read (buff , );

if (ret val > 0) {

out strm.write(buff , ret val ); }

#if 0 message strm ≪ ␣ ␣ ␣ ≪ ret val ≪ endl ≪ buff ; AfxMessageBox (message strm.str ( ).c str ( )); message strm.str ( );

#endif } while (ret val ≡ );

304. Exit get http file successfully with return value 0. [LDF Undated.] ⟨ Define global functions 298 ⟩ +≡

out strm.close( ); delete[ ] buff ; session.Close( ); AfxMessageBox ( ␣ ␣ ␣ ); return 0; } /∗ End of get http file definition. ∗/

305. Initialize copyright strings. [LDF 2006.12.11.]

Log

[LDF 2006.12.11.] Added this function.

⟨ Declare global functions 297 ⟩ +≡ int init copyright strings (void);

76  INITIALIZE COPYRIGHT STRINGS  IWF Metadata Harvester I §306

306. ⟨ Define global functions 298 ⟩ +≡

int init copyright strings (void) {

#if 0 /∗ 1 ∗/ #define 1 #else #undef #endif

stringstream temp strm; #ifdef

temp strm.str ( ␣ ); AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

temp strm ≪  ␣                     ␣                   ␣         ␣    ␣  ≪

≪  ␣    ␣   ␣         ␣  ␣   ␣
␣        ␣          ␣ ≪ ␣       ␣   ␣        ␣          ␣␣ ≪
␣         ␣         ␣      ␣       ␣   ␣    ␣     ␣␣ ≪
␣       ␣         ␣  ␣    ␣    ␣   ␣    ␣         ␣  ␣      ␣    ␣     ␣ ≪
␣       ␣  ␣      ␣   ␣          ␣    ␣  ≪
␣   ␣      ␣    ␣   ␣       ␣   ␣      ␣  ≪
␣      ␣  ␣        ␣  ␣  ≪  ≪  ␣   ␣        ␣
␣  ␣    ␣         ␣   ␣   ␣            ␣ ≪ ␣      ␣      ␣ ≪
␣     ␣   ␣     ␣   ␣   ␣   ␣       ␣      ␣       ␣  ␣         ␣  ␣ ≪
␣    ␣        ␣           ␣      ␣        ␣ ␣  ␣   ␣        ␣  ␣ ≪
␣    ␣       ␣    ␣     ␣        ␣ ≪  ≪  ≪
␣   ␣        ␣         ␣  ␣           ␣  ␣   ␣    ␣    ␣   ␣    ␣  ␣       ␣ ≪
␣       ␣   ␣         ␣       ␣    ␣    ␣       ␣        ␣  ␣ ≪
␣  ␣        ␣   ␣ ␣          ␣        ␣␣   ␣    ␣ ≪
␣       ␣      ␣       ␣   ␣    ␣        ␣ ≪  ≪  ≪
␣      ␣    ␣        ␣ ␣    ␣  ␣   ␣    ␣       ␣      ␣       ␣ ≪
␣    ␣   ␣   ␣        ␣          ␣   ␣    ␣     ␣  ␣    ␣    ␣        ␣ ≪
␣     ␣   ␣        ␣   ␣      ␣      ␣       ␣  ␣␣          ␣␣   ␣ ≪
≪  ≪  ␣   ␣        ␣         ␣  ␣         ␣   ␣          ␣
␣   ␣ ≪  ␣   ␣        ␣ ≪  ␣ ≪
≪  ≪  ␣    ␣   ␣       ␣  ␣                ␣ ≪
≪  ≪  ␣      ␣   ␣  ␣         ␣   ␣ ≪  ≪
≪  ␣  ␣  ≪  ␣  ≪

␣  ≪  ≪  ≪  ≪
≪  ≪  ;

copyright html str = temp strm.str ( ); #ifdef

temp strm.str ( ␣ ); AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

return 0; #undef

} /∗ End of init copyright strings definition. ∗/

307. Initialize special char encodings map. [LDF 2006.10.27.]

§307  IWF Metadata Harvester I  INITIALIZE SPECIAL CHAR ENCODINGS MAP 77

Log

[LDF 2006.10.27.] Added this function. [LDF 2006.10.30.] Added code to this function for all of the special characters that were accounted for before.

To Do

[LDF 2006.10.30.] Add code to account for more special characters!

⟨ Declare global functions 297 ⟩ +≡ int init special char encodings map(void);

78  INITIALIZE SPECIAL CHAR ENCODINGS MAP  IWF Metadata Harvester I §308

308. ⟨ Define global functions 298 ⟩ +≡

int init special char encodings map(void) {

#if 0 /∗ 1 ∗/ #define 1 #else #undef #endif

stringstream temp strm; #ifdef

temp strm.str ( ␣ ); AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif special char encodings map mutex .Lock ( );

special char encodings map[string( ^A  )] =  ;  /∗ ^{#}C2 84 ∗/
special char encodings map[string( ^A  )] =  ;  /∗ ^{#}C2 93 ∗/

special char encodings map[string( ^A¡ )] = ¡ ; /∗ ^{#}C2 A1 ∗/ special char encodings map[string( ^A§ )] = § ; /∗ ^{#}C2 A7 ∗/ special char encodings map[string( ^A¨ )] = ¨ ; /∗ ^{#}C2 A8 ∗/ special char encodings map[string( ^A® )] = ® ; /∗ ^{#}C2 AE ∗/ special char encodings map[string( ^A° )] = ° ; /∗ ^{#}C2 B0 ∗/ special char encodings map[string( ^A± )] = ± ; /∗ ^{#}C2 B1 ∗/ special char encodings map[string( ^A· )] = · ; /∗ ^{#}C2 B7 ∗/ special char encodings map[string( ^A� )] = � ; /∗ ^{#}C2 B8 ∗/ special char encodings map[string( ^A³ )] = ³ ; /∗ ^{#}C2 B3 ∗/ special char encodings map[string( ^A´ )] = ´ ; /∗ ^{#}C2 B4 ∗/ special char encodings map[string( ^Aµ )] = µ ; /∗ ^{#}C2 B5 ∗/ special char encodings map[string( ^A� )] = � ; /∗ ^{#}C2 B8 ∗/ special char encodings map[string( ^A½ )] = ½ ; /∗ ^{#}C2 BD ∗/ special char encodings map[string( ^A¿ )] = ¿ ; /∗ ^{#}C2 BF ∗/

special char encodings map[string( ~ A  )] = À ;  /∗ ^{#}C3 80 ∗/
special char encodings map[string( ~ A  )] = Á ;  /∗ ^{#}C3 81 ∗/
special char encodings map[string( ~ A  )] = Ä ;  /∗ ^{#}C3 84 ∗/
special char encodings map[string( ~ A  )] = Å ;  /∗ ^{#}C3 85 ∗/
special char encodings map[string( ~ A  )] = Æ ;  /∗ ^{#}C3 86 ∗/
special char encodings map[string( ~ A  )] = Ç ;  /∗ ^{#}C3 87 ∗/
special char encodings map[string( ~ A  )] = È ;  /∗ ^{#}C3 88 ∗/
special char encodings map[string( ~ A  )] = É ;  /∗ ^{#}C3 89 ∗/
special char encodings map[string( ~ A  )] = ^E ;  /∗ ^{#}C3 8A ∗/
special char encodings map[string( ~ A  )] = Ë ;  /∗ ^{#}C3 8B ∗/
special char encodings map[string( ~ A  )] = ^I ;  /∗ ^{#}C3 8E ∗/
special char encodings map[string( ~ A  )] = Ö ;  /∗ ^{#}C3 96 ∗/
special char encodings map[string( ~ A  )] = × ;  /∗ ^{#}C3 97 ∗/
special char encodings map[string( ~ A  )] = ^U ;  /∗ ^{#}C3 9B ∗/
special char encodings map[string( ~ A  )] = Ü ;  /∗ ^{#}C3 9C ∗/
special char encodings map[string( ~ A  )] = ß ;  /∗ ^{#}C3 9F ∗/
special char encodings map[string( ~ A  )] = à ;  /∗ ^{#}C3 A0 ∗/

special char encodings map[string( ~ A¡ )] = á ; /∗ ^{#}C3 A1 ∗/ special char encodings map[string( ~ A¤ )] = ä ; /∗ ^{#}C3 A4 ∗/ special char encodings map[string( ~ A§ )] = ç ; /∗ ^{#}C3 A7 ∗/

§308  IWF Metadata Harvester I  INITIALIZE SPECIAL CHAR ENCODINGS MAP 79

special char encodings map[string( ~ A¨ )] = è ; /∗ ^{#}C3 A8 ∗/ special char encodings map[string( ~ A© )] = é ; /∗ ^{#}C3 A9 ∗/ special char encodings map[string( ~ A )] = í ; /∗ ^{#}C3 AD ∗/ special char encodings map[string( ~ A® )] = ^ı ; /∗ ^{#}C3 AE ∗/ special char encodings map[string( ~ A¯ )] = ï ; /∗ ^{#}C3 AF ∗/ special char encodings map[string( ~ A± )] = ~ n ; /∗ ^{#}C3 B1 ∗/ special char encodings map[string( ~ A³ )] = ó ; /∗ ^{#}C3 B3 ∗/ special char encodings map[string( ~ A¶ )] = ö ; /∗ ^{#}C3 B6 ∗/ special char encodings map[string( ~ A¼ )] = ü ; /∗ ^{#}C3 BC ∗/ special char encodings map[string( ~ A½ )] = ý ; /∗ ^{#}C3 BD ∗/ special char encodings map[string( ~ A¿ )] = ÿ ; /∗ ^{#}C3 BF ∗/ special char encodings map mutex .Unlock ( );

#ifdef

for (map⟨string, char⟩::const iterator iter = special char encodings map.begin( );

iter ≠ special char encodings map.end ( ); ^{++}iter ) { temp strm ≪ iter first ≪ ␣ ≪ iter second ≪ endl ;

} AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

return 0; #undef

} /∗ End of init special char encodings map definition. ∗/

309. Putting global functions together.

310. This is what’s compiled.

⟨ Include files 20 ⟩ #define

⟨ Define global functions 298 ⟩

80  PUTTING GLOBAL FUNCTIONS TOGETHER  IWF Metadata Harvester I §311

311. This is what’s written to glblfncs.h. ⟨ 311 ⟩ ≡

⟨ Declare global functions 297 ⟩

312. Metadata Source (mtdtsrc.web). [LDF Undated.] WARNING! This file contains special characters. Care should be exercised, if it’s edited in editors that change the encoding of characters, such as Emacs. They are in the function

definition of parse record . [LDF 2006.07.04.] ⟨ mtdtsrc.web 312 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9. This code is used in section 881.

313. Include files. ⟨ Include files 20 ⟩ +≡ #include

314. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

315. class Metadata Source declaration. [LDF Undated.]

Log

[LDF 2006.09.11.] Added const char ∗records file name argument to update database, sub update database timms , and sub update database dbt .

⟨ Declare class Metadata Source 315 ⟩ ≡ class Metadata Source { public: ⟨ Declare static constants in class Metadata Source 316 ⟩

⟨ Declare Metadata Source functions 320 ⟩ protected: unsigned short id ; };

This code is used in section 378.

316. static constants in class Metadata Source. [LDF Undated.]

Log

[LDF 2006.07.06.] Added static const unsigned short . It refers to the Digitale Bibliothek Thüringen.

⟨ Declare static constants in class Metadata Source 316 ⟩ ≡ static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ;

This code is used in section 315.

§317  IWF Metadata Harvester I  STATIC CONSTANTS IN CLASS METADATA SOURCE 81

317. ⟨ Initialize static constants in class Metadata Source 317 ⟩ ≡

const unsigned short Metadata Source :: = 128; const unsigned short Metadata Source :: = 128; const unsigned short Metadata Source :: = 0; const unsigned short Metadata Source :: = 1; const unsigned short Metadata Source :: = 2;

This code is used in section 377.

318. Functions. [LDF 2006.10.04.]

319. Constructors.

320. Default constructor. [LDF Undated.] ⟨ Declare Metadata Source functions 320 ⟩ ≡

Metadata Source(void);

See also sections 322, 324, 327, 336, 341, and 348. This code is used in section 315.

321. ⟨ Define Metadata Source functions 321 ⟩ ≡

Metadata Source ::Metadata Source(void)

: id (0) {

return; }

See also sections 323, 325, 328, 329, 330, 331, 332, 333, 334, 335, 337, 338, 339, 340, 342, 343, 344, 345, 346, and 347. This code is used in section 377.

322. const unsigned short argument. [LDF Undated.] ⟨ Declare Metadata Source functions 320 ⟩ +≡

Metadata Source(const unsigned short iid );

323. ⟨ Define Metadata Source functions 321 ⟩ +≡

Metadata Source ::Metadata Source(const unsigned short iid )

: id (iid ) {

return; }

324. Destructor. ⟨ Declare Metadata Source functions 320 ⟩ +≡

virtual ∼Metadata Source(void); 325. ⟨ Define Metadata Source functions 321 ⟩ +≡

Metadata Source ::∼Metadata Source(void)

{

return; }

326. Updating the database. [LDF 2006.09.28.]

Log

[LDF 2006.09.28.] Added this section.

327. Update database. [LDF Undated.]

Log

[LDF Undated.] Added this function.

[LDF 2006.09.11.] Added const char ∗records file name argument. Also added it to sub update database timms , and sub update database dbt , so I’ve altered the calls to these functions in this function accordingly.

⟨ Declare Metadata Source functions 320 ⟩ +≡ int update database(BOOL delete tables , char ∗resumption token, const char ∗records file name);

328. ⟨ Define Metadata Source functions 321 ⟩ +≡

int Metadata Source ::update database(BOOL delete tables , char ∗resumption token, const char

∗records file name){ stringstream temp strm; Records curr record ; curr record .Open( ); CDatabase ∗cdb = curr record .m pDatabase; cdb SetLoginTimeout (120); cdb SetQueryTimeout (120); int ret val ;

#if 1 /∗ 0 ∗/ temp strm ≪ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

§329  IWF Metadata Harvester I  UPDATE DATABASE 83

#endif 329. Test whether cdb is open. [LDF 2006.05.26.] ⟨ Define Metadata Source functions 321 ⟩ +≡

BOOL b; try {

b = cdb IsOpen( ); } catch(CDBException ∗e) {

temp strm ≪ ␣ ␣ ␣ ␣ ≪ e m strError ≪ endl ≪ ␣ ␣ ≪

      ␣     ␣      ␣     ␣ ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

e Delete( );

curr record .Close( );

return 1; }

#if 0

if (b) AfxMessageBox (  ␣  ␣  );
else AfxMessageBox (  ␣     ␣  );

#endif

330. Test whether cdb can be updated. [LDF 2006.05.26.] ⟨ Define Metadata Source functions 321 ⟩ +≡

try {

b = cdb CanUpdate( ); } catch(CDBException ∗e) {

AfxMessageBox ( ␣ ␣ ␣ );

AfxMessageBox (e m strError , );

AfxMessageBox ( ␣ ␣ ␣ ␣ ␣ ␣ ); e Delete( ); curr record .Close( ); return 1;

} /∗ catch ∗/ #if 0

if (b) AfxMessageBox (  ␣   ␣  ␣  );
else AfxMessageBox (  ␣   ␣  ␣  );

84  UPDATE DATABASE  IWF Metadata Harvester I §331

#endif 331. Test whether transactions are supported for cdb. [LDF 2006.05.26.] ⟨ Define Metadata Source functions 321 ⟩ +≡

try {

b = cdb CanTransact ( ); } catch(CDBException ∗e) {

AfxMessageBox ( ␣ ␣ ␣ );

AfxMessageBox (e m strError , );

AfxMessageBox ( ␣ ␣ ␣ ␣ ␣ ␣ ); e Delete( ); curr record .Close( ); return 1;

} /∗ catch ∗/ #if 0

if (b) AfxMessageBox (  ␣   ␣   ␣         ␣     ␣  );
else AfxMessageBox (  ␣       ␣  ␣         ␣     ␣  );

#endif string cmd str ; 332. Delete tables. [LDF 2006.05.30.]

Log

[LDF 2006.06.26. ] Searching for names doesn’t work right. “Whole word” doesn’t find last names the way they’re stored by TIMMS, e.g., “Feil, Robert”.

To Do

[LDF 2006.07.04.] This problem seems to have been fixed, somehow. Check this.

[LDF Undated.] I had a problem with a timeout when deleting tables. After I did it in the SQL Query Analyzer, tried a couple of times with this program, and executed other SQL commands from this program, the problem disappeared. I think it may be because SQL was then able to use an “execution plan”, or whatever this is called. The procedure delete tables ran rather slowly when I called it in SQL Query Analyzer. This problem might not occur on a faster machine, and when it’s not running on a virtual machine.

⟨ Define Metadata Source functions 321 ⟩ +≡

if (delete tables ) {

try {

cdb ExecuteSQL( ␣ ); } catch(CDBException ∗e) { /∗ The error code is in e m nRetCode ∗/

temp strm ≪ ␣ ␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ≪ e m nRetCode ≪ endl ≪ ␣ ␣ ≪ e m strError ≪ endl ≪

      ␣                ␣              ␣    ␣      ␣     ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

e Delete( );

curr record .Close( );

return 1; } /∗ catch ∗/

#if 0

AfxMessageBox ( ␣ ␣ ); #endif

} /∗ if (delete tables ) ∗/ /∗ **** (4) id ≡ ∗/ if (id ≡ ) {

ret val = sub update database timms (cdb, curr record , resumption token, records file name); #if 0 /∗ 1 ∗/

temp strm ≪ ␣ ␣ ≪ ret val ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif /∗ ***** (5) ∗/ temp strm ≪ ␣ ; try {

cdb ExecuteSQL(temp strm.str ( ).c str ( )); } catch(CDBException ∗e) { /∗ The error code is in e m nRetCode ∗/

temp strm ≪  ␣    ␣        ␣  ≪ endl ≪  ␣    ␣ ␣ ≪

e m nRetCode ≪ endl ≪ ␣ ␣ ≪ e m strError ≪ endl ≪

    ␣                ␣              ␣    ␣      ␣     ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); e Delete( ); curr record .Close( ); return 1;

} /∗ catch ∗/ temp strm.str ( );

}  /∗ if (id ≡  ) ∗/

333. id ≡ . [LDF Undated.] ⟨ Define Metadata Source functions 321 ⟩ +≡

else

if (id ≡ ) {

ret val = sub update database dbt (cdb, curr record , resumption token, records file name); #if 1 /∗ 0 ∗/

temp strm ≪ ␣ ␣ ≪ ret val ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif } /∗ else if (id ≡ ) ∗/

334. id has invalid value. [LDF Undated.] ⟨ Define Metadata Source functions 321 ⟩ +≡

else {

temp strm ≪ ␣␣ ␣ ␣␣ ≪ ␣ ␣ ␣ ␣␣ ≪ id ≪ endl ≪

  ␣        ␣              ␣    ␣       ␣     ␣ ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); return 1;

} /∗ else (id has invalid value). ∗/

335. Exit function successfully with return value 0. [LDF Undated.] ⟨ Define Metadata Source functions 321 ⟩ +≡ #if 1 /∗ 0 ∗/

temp strm ≪ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

§336  IWF Metadata Harvester I  SUB-UPDATE DATABASE DBT 87

#endif return 0; } /∗ End of int Metadata Source ::update database definition. ∗/ 336. Sub-update database DBT. [LDF Undated.]

Log

[LDF Undated.] Added this function.

[LDF 2006.09.11.] Added const char ∗records file name argument.

⟨ Declare Metadata Source functions 320 ⟩ +≡ int sub update database dbt (CDatabase ∗cdb, Records &curr record , char ∗resumption token, const char ∗records file name);

337. ⟨ Define Metadata Source functions 321 ⟩ +≡

int Metadata Source ::sub update database dbt ( CDatabase ∗cdb, Records &curr record , char ∗resumption token, const char ∗records file name){ stringstream temp strm;

#if 0 /∗ 1 ∗/ temp strm ≪ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

88  SUB-UPDATE DATABASE DBT  IWF Metadata Harvester I §338

#endif 338. Test reading XML data from a file. [LDF 2006.05.29. ] ⟨ Define Metadata Source functions 321 ⟩ +≡

ifstream in file strm; in file strm.open(records file name); if (in file strm.is open( )) {

#if 0

AfxMessageBox ( ␣ ␣ ); #endif

} else {

temp strm ≪ ␣␣ ␣ ␣␣ ≪ ␣ ␣ ␣ ≪ endl ≪

      ␣        ␣              ␣    ␣       ␣     ␣ ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

curr record .Close( );

return 1; } /∗ else (Failed to open in file strm). LDF 2006.05.30. ∗/ string record str ; string prefix str ; string prefix str 1 ; string suffix str ; string cmd str ; int ret val = 0;

temp strm ≪  ␣                     ␣  ≪  ␣

    ␣ ␣ ≪  ␣  ≪

≪
≪
≪
≪

    ≪  ␣               ␣ ≪

≪ ␣ ;

prefix str = temp strm.str ( ); temp strm.str ( ); prefix str 1 = ␣ ; suffix str = ␣ ; char ∗temp resumption token; temp resumption token = new char[ ]; 339. Call parse record in a loop until we reach the end of in file strm. [LDF 2006.05.30.] ⟨ Define Metadata Source functions 321 ⟩ +≡

unsigned long record ctr = 1; strcpy (resumption token, ); while (¬in file strm.eof ( )) { strcpy (temp resumption token, ); ret val = parse record (&in file strm, &record str , temp resumption token); if (strlen(temp resumption token) > 0) {

strcpy (resumption token, temp resumption token); #if 0 /∗ 1 ∗/

temp strm ≪ ␣ ␣ ≪ temp resumption token ≪ endl ≪

␣ ␣ ≪ temp resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif } /∗ if ∗/ if (ret val ≡ 1) {

temp strm ≪ ␣␣ ␣ ␣␣ ≪

␣  ≪ endl ≪  ␣        ␣              ␣    ␣

    ␣     ␣ ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); curr record .Close( ); in file strm.close( ); return 1;

} /∗ if (ret val ≠ 0) ∗/ else if (ret val ≡ 2) {

#if 0 /∗ 1 ∗/

temp strm ≪ ␣ ␣␣ ≪ ␣ ␣ ␣

␣  ␣              ␣       ␣ ≪  ␣ ␣  ≪ endl ≪

    ␣        ␣            ␣    ␣       ␣     ␣ ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif #if 0

if (strlen(resumption token) > 0) { temp strm ≪ ␣ ␣␣ ␣ ␣ ≪ resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

} #endif

delete[ ] temp resumption token; temp resumption token = 0;

/∗ Close open resources and exit function successfully with return value 0. LDF 2006.05.26. ∗/ curr record .Close( ); in file strm.close( );

#if 0 /∗ 1 ∗/ temp strm ≪ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

return 0; } /∗ if (ret val ≠ 0) ∗/

#if 0 /∗ 1 ∗/ temp strm ≪ ≪ endl ≪ record str ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif string ::size type start pos = record str .find ( ); start pos += 10; string ::size type curr pos = start pos ; unsigned int brace ctr ; char curr char ; while ((curr char = record str [start pos^{++}]) ≠ ) ; curr pos = start pos^{−}; brace ctr = 1; for ( ; brace ctr > 0; ^{++}curr pos ) {

curr char = record str [curr pos ];

if (curr char ≡ ) ^{++}brace ctr ; else if (curr char ≡ ) ^{−}brace ctr ;

} /∗ for ∗/ #if 0 /∗ 1 ∗/

temp strm ≪  ␣  ␣ ≪ start pos ≪ endl ≪  ␣  ␣ ≪ curr pos ≪ endl ≪
␣  ␣  ␣  ≪ endl ≪  ≪ record str .substr (start pos ,

curr pos − start pos ) ≪ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

temp strm ≪ ␣ ≪ ≪ ≪ ≪ ≪ ;

record str .replace(start pos , curr pos − start pos , temp strm.str ( )); temp strm.str ( );

#if 0 /∗ 1 ∗/ temp strm ≪ ␣ ␣ ≪ record str ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif temp strm ≪ prefix str ≪ record ctr^{++} ≪ prefix str 1 ≪ record str ≪ suffix str ; cmd str = temp strm.str ( ); temp strm.str ( );

#if 0 /∗ 1 ∗/ temp strm ≪ ≪ endl ≪ cmd str ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

try {

cdb ExecuteSQL(cmd str .c str ( )); } catch(CDBException ∗e){ /∗ The error code is in e m nRetCode ∗/

temp strm ≪  ␣␣  ␣  ≪ endl ≪

        ␣      ␣     ␣       ␣  ≪ endl ≪  ␣    ␣  ␣ ≪

e m nRetCode ≪ endl ≪  ␣      ␣  ␣ ≪ e m strError ≪ endl ≪  ␣  ␣ ≪

cmd str ;

#if 0 /∗ 1 ∗/

≪ endl ≪  ␣         ␣   ␣   ␣    ␣   ␣    ␣    ␣  ␣  ;

#endif AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); e Delete( ); curr record .Close( ); in file strm.close( );

#if 0 /∗ 1 ∗/

log file ≪ endl ≪ cmd str ≪ endl ; #endif

record str .clear ( ); cmd str .clear ( ); continue; } /∗ catch ∗/

#if 0 /∗ 1 ∗/

AfxMessageBox ( ␣ ␣ ); #endif

record str .clear ( ); cmd str .clear ( ); } /∗ while (¬in file strm.eof ( )) ∗/

#if 0

if (strlen(resumption token) > 0) { temp strm ≪ ␣ ␣␣ ␣ ␣ ≪ resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

} #endif

delete[ ] temp resumption token; temp resumption token = 0;

340. End of “Test reading XML data from a file”.

Close open resources and exit function successfully with return value 0. [LDF 2006.05.26.] ⟨ Define Metadata Source functions 321 ⟩ +≡

in file strm.close( ); curr record .Close( );

#if 0 /∗ 1 ∗/ temp strm ≪ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

92  SUB-UPDATE DATABASE TIMMS  IWF Metadata Harvester I §341

#endif return 0; } /∗ End of Metadata Source ::sub update database dbt definition. ∗/ 341. Sub-update database TIMMS. [LDF Undated.]

Log

[LDF 2006.07.06.] Renamed this file to sub_update_database_timms.cpp from sub_update_database.cpp.

[LDF 2006.09.11.] Added const char ∗records file name argument.

[LDF 2006.10.09.] Moved the definition of Metadata Source ::sub update database timms from sub_update_database_timms.cpp to this file (mtdtsrc.web).

⟨ Declare Metadata Source functions 320 ⟩ +≡

int sub update database timms (CDatabase ∗cdb, Records &curr record , char ∗resumption token, const char ∗records file name);

342. ⟨ Define Metadata Source functions 321 ⟩ +≡

§343  IWF Metadata Harvester I  SUB-UPDATE DATABASE TIMMS 93

int Metadata Source ::sub update database timms (CDatabase ∗cdb, Records &curr record , char ∗resumption token, const char ∗records file name){ 343. Read XML data from records.xml. [LDF 2006.05.29.] ⟨ Define Metadata Source functions 321 ⟩ +≡

ifstream in file strm(records file name); stringstream temp strm; if (in file strm.is open( )) {

#if 0 /∗ 1 ∗/

AfxMessageBox ( ␣ ␣ ); #endif

} else {

temp strm ≪ ␣␣ ␣ ␣␣ ≪ ␣ ␣ ␣

≪ endl ≪ ␣ ␣ ␣ ␣ ␣ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); curr record .Close( ); return 1;

} /∗ else (Failed to open in file strm). LDF 2006.05.30. ∗/ string record str ; string prefix str ; string prefix str 1 ; string suffix str ; string cmd str ; int ret val = 0;

temp strm ≪  ␣                     ␣  ≪

    ␣                     ␣ ␣ ≪  ␣

≪ ≪
≪

    ␣               ␣ ≪  ≪ ␣ ;

prefix str = temp strm.str ( ); temp strm.str ( ); prefix str 1 = ␣ ; suffix str = ␣ ; char ∗temp resumption token; temp resumption token = new char[ ];

344. Call parse record in a loop until we reach the end of in file strm. [LDF 2006.05.30.] ⟨ Define Metadata Source functions 321 ⟩ +≡

unsigned long record ctr = 1; strcpy (resumption token, ); while (¬in file strm.eof ( )) { strcpy (temp resumption token, ); ret val = parse record (&in file strm, &record str , temp resumption token); 345. The records file contained a resumption token. [LDF 2006.08.29.] ⟨ Define Metadata Source functions 321 ⟩ +≡

if (strlen(temp resumption token) > 0) {

strcpy (resumption token, temp resumption token); #if 0 /∗ 1 ∗/

temp strm ≪ ␣ ␣ ≪ resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif } /∗ if (strlen(temp resumption token) > 0) ∗/ if (ret val ≡ 1) {

temp strm ≪ ␣␣ ␣ ␣␣ ≪

␣  ≪ endl ≪  ␣        ␣              ␣    ␣

    ␣     ␣ ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); curr record .Close( ); in file strm.close( ); return 1;

} /∗ if (ret val ≠ 0) ∗/ else if (ret val ≡ 2) {

#if 0

temp strm ≪ ␣ ␣␣ ≪ ␣ ␣ ␣

␣  ␣              ␣       ␣ ≪  ␣ ␣  ≪ endl ≪

  ␣        ␣            ␣    ␣       ␣     ␣ ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif #if 0 /∗ 1 ∗/

if (strlen(resumption token) > 0) { temp strm ≪ ␣ ␣ ␣ ␣ ␣ ␣ ≪ resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

} #endif

delete[ ] temp resumption token; temp resumption token = 0; 346. Close open resources and exit function successfully with return value 0. [LDF 2006.05.26.] ⟨ Define Metadata Source functions 321 ⟩ +≡

curr record .Close( ); in file strm.close( ); return 0; } /∗ else if (ret val ≡ 2) ∗/

#if 0 temp strm ≪ ≪ endl ≪ record str ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif temp strm ≪ prefix str ≪ record ctr^{++} ≪ prefix str 1 ≪ record str ≪ suffix str ; cmd str = temp strm.str ( ); temp strm.str ( );

#if 0 temp strm ≪ ≪ endl ≪ cmd str ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

try {

cdb ExecuteSQL(cmd str .c str ( )); } catch(CDBException ∗e) { /∗ The error code is in e m nRetCode ∗/

temp strm ≪  ␣␣  ␣  ≪ endl ≪

      ␣      ␣     ␣       ␣  ≪ endl ≪  ␣    ␣  ␣ ≪

e m nRetCode ≪ endl ≪  ␣      ␣  ␣ ≪ e m strError ≪ endl ≪  ␣  ␣ ≪
cmd str ≪ endl ≪  ␣         ␣   ␣   ␣    ␣   ␣    ␣    ␣  ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

e Delete( );

curr record .Close( );

in file strm.close( ); #if 0 /∗ 1 ∗/

log file mutex .Lock ( );

log file ≪ endl ≪ cmd str ≪ endl ;

log file mutex .Unlock ( ); #endif

record str .clear ( );

cmd str .clear ( );

continue; } /∗ catch ∗/

#if 0

AfxMessageBox ( ␣ ␣ ); #endif

record str .clear ( ); cmd str .clear ( ); } /∗ while (¬in file strm.eof ( )) ∗/

#if 0

if (strlen(resumption token) > 0) { temp strm ≪ ␣ ␣␣ ␣ ␣ ≪ resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

} #endif

delete[ ] temp resumption token; temp resumption token = 0;

347. End of reading XML data from the records file. [LDF 2006.09.11.] Close open resources and exit function successfully with return value 0. [LDF 2006.05.26.]

⟨ Define Metadata Source functions 321 ⟩ +≡ in file strm.close( ); curr record .Close( ); return 0; } /∗ End of Metadata Source ::sub update database timms definition. ∗/

348. Parse record. [LDF Undated.] ⟨ Declare Metadata Source functions 320 ⟩ +≡

int parse record (ifstream ∗in strm, string ∗out str , char ∗resumption token);

349. ⟨ Define Metadata Source ::parse record 349 ⟩ ≡

int Metadata Source ::parse record (ifstream ∗in strm, string ∗out str , char ∗resumption token){ stringstream temp strm;

char curr char = ; char special str [3] = ; char tag str [ ]; int tag ctr = 0; stringstream message strm;

See also sections 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,

373, 374, and 375. This code is cited in section 11. This code is used in section 377.

350. Error handling: ifstream ∗in strm ≡ 0 [LDF 2006.05.29.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (in strm ≡ 0) {

message strm ≪  ␣␣  ␣               ␣␣          ␣        ␣  ␣  ≪ endl ≪

      ␣        ␣             ␣    ␣       ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( );

return 1; } /∗ if (in strm ≡ 0) ∗/

351. Error handling: out str ≡ 0. [LDF 2006.05.29.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (out str ≡ 0) {

message strm ≪  ␣␣  ␣               ␣␣        ␣        ␣  ␣  ≪ endl ≪

      ␣        ␣             ␣    ␣       ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( );

§352  IWF Metadata Harvester I  PARSE RECORD 97

return 1; } /∗ if (out str ≡ 0) ∗/ ∗out str = ; /∗ Clear ∗out str . LDF 2006.05.29. ∗/ 352. Outer loop. [LDF 2006.05.29.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

BOOL skipping = true; for ( ; ; ) { curr char = in strm get ( );

353. Found either before a < record > began, or if one has begun, before it ended. The former case is alright, the second is an error condition. [LDF 2006.05.30.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (curr char ≡ ) {

if (skipping ) { #if 0

message strm ≪  ␣  ≪ endl ≪

          ␣     ␣    ␣         ␣      ␣ ␣          ␣  ≪ endl ≪
          ␣        ␣            ␣    ␣       ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( ); #endif

return 2; } /∗ if (skipping ) ∗/ else {

message strm ≪  ␣␣  ␣  ≪ endl ≪

          ␣     ␣    ␣         ␣      ␣ ␣          ␣  ≪ endl ≪
          ␣        ␣              ␣    ␣       ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( );

return 1; } /∗ else (¬skipping ) ∗/

} /∗ if (curr char ≡ ) ∗/

354. Found while skipping ≡ true. [LDF 2006.05.29.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (skipping ∧ curr char ≡ ) { #if 0

98  PARSE RECORD  IWF Metadata Harvester I §355

log file ≪ ␣ ␣ ≪ curr char ≪ ␣␣ ␣ ␣ ; #endif 355. Discard everything until first < record > tag. [LDF 2006.05.29.]

Check the first character after : If it’s not or , just continue. If in strm get ( ) returns , just return 2. [LDF 2006.05.30.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

tag ctr = 0; strcpy (tag str , ); curr char = in strm get ( ); if (curr char ≡ ) {

return 2; } tag str [tag ctr ] = curr char ; ++tag ctr ; if (¬(curr char ≡ ∨ curr char ≡ )) {

#if 0

log file ≪ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ≪ endl ; #endif

continue; }

356. ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

while (tag ctr < ∧ curr char ≠ ) { curr char = in strm get ( );

357. Error handling: curr char ≡ . [LDF 2006.05.30.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (curr char ≡ ) {

message strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ␣ ␣ ≪ endl ≪

      ␣        ␣              ␣    ␣       ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( );

return 1; } /∗ if (curr char ≡ ) ∗/

358. ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

tag str [tag ctr ] = curr char ; ++tag ctr ; } /∗ End of inner while LDF 2006.05.29. ∗/

359. tag ctr ≥ ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (tag ctr ≥ ) {

message strm ≪ ␣              ␣ ␣ ≪  ␣  ␣  ≪ endl ≪
␣  ␣ ≪ tag ctr ≪ endl ≪  ␣  ␣  ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( );

continue;

}  /∗ if (tag ctr ≥  ) ∗/

360. ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

else { −tag ctr ; tag str [tag ctr ] = ;

} /∗ else (tag ctr < ) ∗/ #if 0

message strm ≪ ␣ ␣ ≪ tag str ; AfxMessageBox (message strm.str ( ).c str ( )); message strm.str ( );

#endif

if (¬ stricmp(tag str , )) { #if 0

AfxMessageBox ( ␣ ); #endif

∗out str += ;

skipping = false; }

361. ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

else if (¬ strnicmp(tag str , , 15)) { #if 0

temp strm ≪ ␣ ␣ ␣␣ ␣ ␣ ≪ tag str ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

362.

To Do

Add error handling. [LDF 2006.07.04.]

⟨ Define Metadata Source ::parse record 349 ⟩ +≡

int i; for (i = 0; ; ^{++}i) { curr char = in strm get ( ); if (curr char ≡ ) { resumption token[i] = ; #if 0

temp strm ≪ ␣ ␣␣ ␣ ␣ ≪ resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

363. Discard characters up to and including the closing .

To Do

Add error handling. [LDF 2006.07.04.]

⟨ Define Metadata Source ::parse record 349 ⟩ +≡

while (curr char ≠ ) {

curr char = in strm get ( ); } break; } /∗ if (curr char = ) ∗/ 364. Collecting characters and storing them in resumption token. [LDF Undated.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

else {

resumption token[i] = curr char ; } } /∗ for ∗/

#if 0 temp strm ≪ ␣ ␣ ≪ resumption token; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif } /∗ else if (¬ strnicmp(tag str , , 15)) ∗/ else {

#if 0

AfxMessageBox ( ␣ ␣ ); #endif

continue; } continue; } /∗ if (skipping ∧ curr char ≡ ) ∗/

365. Check tag. Exit function if it’s “⟨/record⟩”. [LDF 2006.05.29.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (¬skipping ∧ curr char ≡ ) { ∗out str += curr char ; curr char = in strm get ( );

366. Error handling: curr char ≡ . [LDF 2006.05.30.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (curr char ≡ ) {

message strm ≪  ␣␣  ␣  ≪ endl ≪

      ␣     ␣     ␣          ␣ ␣       ␣  ≪ endl ≪
      ␣        ␣              ␣    ␣       ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( );

return 1; } /∗ if (curr char ≡ ) ∗/ if (curr char ≠ ) {

∗out str += curr char ; } else if (curr char ≡ ) { ∗out str += curr char ; strcpy (tag str , ); tag ctr = 0;

367. Check the first character after : If it’s not or , just continue. [LDF 2006.05.30.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

tag ctr = 0; strcpy (tag str , ); curr char = in strm get ( ); 368. Error handling: curr char ≡ . [LDF 2006.05.30.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (curr char ≡ ) {

message strm ≪  ␣␣  ␣  ≪ endl ≪

    ␣     ␣     ␣          ␣ ␣       ␣  ≪ endl ≪
    ␣        ␣              ␣    ␣       ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( )); message strm.str ( ); return 1;

} /∗ if (curr char ≡ ) ∗/ tag str [tag ctr ] = curr char ; ++tag ctr ; if (¬(curr char ≡ ∨ curr char ≡ )) {

#if 0

log file ≪ ␣ ␣ ␣ ␣ ␣ ≪ ␣ ␣ ␣ ␣ ≪ endl ; #endif

∗out str += curr char ; continue;

} while (curr char ≠ ) { curr char = in strm get ( ); 369. Error handling: curr char ≡ . [LDF 2006.05.30.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (curr char ≡ ) {

message strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ␣ ␣ ≪ endl ≪

      ␣        ␣              ␣    ␣       ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( );

return 1; } /∗ if (curr char ≡ ) ∗/ tag str [tag ctr^{++}] = curr char ; } /∗ while ∗/ tag str [^{−}tag ctr ] = ;

#if 0 message strm ≪ ␣ ␣ ≪ tag str ; log file ≪ message strm.str ( ) ≪ endl ; AfxMessageBox (message strm.str ( ).c str ( )); message strm.str ( );

#endif ∗out str += tag str ; ∗out str += ; if (¬ stricmp(tag str , )) {

#if 0

log file ≪ ␣ ␣␣ ␣ ≪ endl ; #endif

return 0; }

#if 0

else {

log file ≪ ␣ ␣ ␣␣ ≪ endl ; }

#endif } /∗ else if (curr char ≡ ) ∗/ } /∗ if (¬skipping ∧ curr char ≡ ) ∗/ else

if (skipping ) /∗ and curr char ≠ . ∗/

{ #if 0

log file ≪ ␣ ␣ ≪ curr char ≪ ␣␣ ␣ ␣ ; #endif

continue; }

370. Not skipping and curr char ≠ . [LDF 2006.05.29.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

else { 371. Special character encoding. [LDF Undated.]

Log

[LDF 2006.10.04.] Changed the conditional from if (curr char ≡ ~ A ) to if (curr char ≡ ^A ∨ curr char ≡

~ A ).

⟨ Define Metadata Source ::parse record 349 ⟩ +≡ if (curr char ≡ ^A ∨ curr char ≡ ~ A ) { special str [0] = curr char ; curr char = in strm get ( );

372. Error handling: curr char ≡ . [LDF 2006.05.30.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

if (curr char ≡ ) {

message strm ≪  ␣␣  ␣  ≪ endl ≪

      ␣     ␣     ␣          ␣ ␣       ␣         ␣  ≪ endl ≪
      ␣        ␣              ␣    ␣       ␣     ␣ ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( );

return 1; } /∗ if (curr char ≡ ) ∗/ special str [1] = curr char ; special str [2] = ;

104  HANDLE SPECIAL CHARACTERS  IWF Metadata Harvester I §373

373. Handle special characters. Handle special characters in Metadata Source::parse record.

See also ⟨ Special character formatting 11 ⟩. [LDF 2006.10.02.]

Log

[LDF 2006.10.26.] Added code.

[LDF 2006.10.30.] Removed the code for handling specific special characters. Now looking the encodings up in special char encodings map.

[LDF 2006.10.30.] Now adding “XXX” to ∗out str , if the special character coding is unknown. Formerly, the special character coding was added anyway, which caused errors when attempting to write it to the database.

⟨ Define Metadata Source ::parse record 349 ⟩ +≡ map⟨string, char⟩::iterator iter = special char encodings map.find (string(special str )); if (iter ≡ special char encodings map.end ( )) {

message strm ≪ ␣ ␣ ␣ ␣ ␣ ␣␣ ≪ curr char ≪ endl ≪ ␣ ␣ ≪ special str ≪ endl ≪ ␣ ␣ ≪ ∗out str ≪ endl ≪

        ␣       ␣  ␣  ;

AfxMessageBox (message strm.str ( ).c str ( ));

message strm.str ( ); ∗out str += ;

}

else { #if 0 /∗ 1 ∗/

temp strm ≪ ≪ special str ≪ ␣ ␣ ≪ iter second ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( ); #endif

∗out str += iter second ; } } /∗ if (curr char ≡ ^A ∨ curr char ≡ ~ A ) (Special character sequence). ∗/

374. ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

else

if (curr char ≡ ) { ∗out str += ;

} else {

∗out str += curr char ; }

} /∗ else (Not skipping and curr char ≠ ). ∗/

375. End of outer loop. [LDF 2006.05.29.] ⟨ Define Metadata Source ::parse record 349 ⟩ +≡

} /∗ Outer while. ∗/

} /∗ End of Metadata Source ::parse record definition. ∗/

376. Putting class Metadata Source together. [LDF Undated.]

§377  IWF Metadata Harvester I  PUTTING CLASS METADATA SOURCE TOGETHER 105

377. This is what’s compiled.

⟨ Include files 20 ⟩ ⟨ Initialize static constants in class Metadata Source 317 ⟩ ⟨ Define Metadata Source functions 321 ⟩ ⟨ Define Metadata Source ::parse record 349 ⟩

106  PUTTING CLASS METADATA SOURCE TOGETHER  IWF Metadata Harvester I §378

378. This is what’s written to mtdtsrc.h. ⟨ 378 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ Declare class Metadata Source 315 ⟩

379. Selector (selector.web). [LDF 2006.10.04.]

Log

[LDF 2006.10.04.] Created this file. It contains code formerly in Selector.h, Selector.cpp, select from database.cpp,

list records.cpp, fill table streams.cpp, write html from streams.cpp, and list table.cpp.

⟨ selector.web 379 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 6 and 9. This code is used in section 881.

380. Include files. ⟨ Include files 20 ⟩ +≡ #include

381. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

382. Preprocessor macro definitions. ⟨ Preprocessor macro definitions 18 ⟩ +≡

383. Forward declarations. [LDF Undated.] ⟨ Forward declarations 383 ⟩ ≡

class Dialog 2;

This code is used in section 502.

384. Declare class Selector. [LDF Undated.]

Log

[LDF 2006.08.01.] Added friend declaration for class Dialog 2.

⟨ Declare class Selector 384 ⟩ ≡

class Selector {

friend class Dialog 2; protected: Records curr record ;

CDatabase ∗cdb;

unsigned short use date type; unsigned short query type; Records records ; Records Temp records temp; Temp IDs temp ids ; Temp IDs 1 temp ids 1 ; Contributors Temp contributors temp; Creators Temp creators temp;

§384  IWF Metadata Harvester I  DECLARE CLASS SELECTOR 107

Descriptions Temp descriptions temp; Identifiers Temp identifiers temp; Languages Temp languages temp; Publishers Temp publishers temp; Rights Temp rights temp; Subjects Temp subjects temp; Titles Temp titles temp; Types Temp types temp; Contributors contributors ; Creators creators ; Subjects subjects ; Titles titles ; stringstream contributor strm; stringstream creator strm; stringstream dc date strm; stringstream description strm; stringstream header datestamp strm; stringstream identifier strm; stringstream language strm; stringstream publisher strm; stringstream rights strm; stringstream subject strm; stringstream title strm; stringstream type strm; stringstream temp strm; ofstream html strm; map⟨unsigned short, string⟩ sort field map; map⟨unsigned short, string⟩ timespan map;

public: ⟨ Declare Selector functions 387 ⟩ static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ;

108  DECLARE CLASS SELECTOR  IWF Metadata Harvester I §384

static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned short ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ; static const unsigned int ;

};

This code is used in section 502.

385. Initialize static constants in class Selector. [LDF Undated.] ⟨ Initialize static constants in class Selector 385 ⟩ ≡

const unsigned short Selector :: = 0; const unsigned short Selector :: = 1; const unsigned short Selector :: = 2; const unsigned int Selector :: = 1; const unsigned int Selector :: = 2; const unsigned int Selector :: = 4; const unsigned int Selector :: = 8; const unsigned int Selector :: = 16; const unsigned int Selector :: = 32; const unsigned int Selector :: = 64; const unsigned int Selector :: = 128; const unsigned int Selector :: = 256; const unsigned int Selector :: = 512; const unsigned int Selector :: = 1024; const unsigned int Selector :: = 2048; const unsigned int Selector :: = 1; const unsigned int Selector :: = 2; const unsigned int Selector :: = 4; const unsigned int Selector :: = 8; const unsigned int Selector :: = 16; const unsigned short Selector :: = 0; const unsigned short Selector :: = 1; const unsigned short Selector :: = 2; const unsigned short Selector :: = 3; const unsigned short Selector :: = 4;

§385  IWF Metadata Harvester I  INITIALIZE STATIC CONSTANTS IN CLASS SELECTOR 109

const unsigned short Selector :: = 5; const unsigned short Selector :: = 6; const unsigned short Selector :: = 7; const unsigned short Selector :: = 8; const unsigned short Selector :: = 9; const unsigned short Selector :: = 10; const unsigned short Selector :: = 11; const unsigned short Selector :: = 12; const unsigned short Selector :: = 13; const unsigned short Selector :: = 14; const unsigned short Selector :: = 1; const unsigned short Selector :: = 2; const unsigned short Selector :: = 1; const unsigned short Selector :: = 2; const unsigned short Selector :: = 1; const unsigned short Selector :: = 2; const unsigned short Selector :: = 3; const unsigned short Selector :: = 4; const unsigned short Selector :: = 5;

This code is used in section 501.

386. Functions. [LDF 2006.10.04.]

387. Constructor. ⟨ Declare Selector functions 387 ⟩ ≡

Selector(void);

See also sections 395, 397, 417, 440, 456, and 485. This code is used in section 384.

388. ⟨ Define Selector functions 388 ⟩ ≡

Selector ::Selector(void): use date type( ) { curr record .Open( ); cdb = curr record .m pDatabase; BOOL b;

See also sections 389, 390, 391, 392, 393, 394, 396, 398, 399, 400, 401, 402, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, and 499.

This code is used in section 501.

389. Test whether cdb is open. [LDF 2006.05.26.] ⟨ Define Selector functions 388 ⟩ +≡

try {

b = cdb IsOpen( ); } catch(CDBException ∗e) {

temp strm ≪ ␣ ␣ ␣ ␣ ≪ e m strError ≪

      ␣                    ␣ ≪  ␣     ␣      ␣     ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

e Delete( );

errno = 1;

return; } /∗ catch ∗/

#if 0

if (b) AfxMessageBox (  ␣  ␣  );
else AfxMessageBox (  ␣     ␣  );

#endif

390. Test whether cdb can be updated. [LDF 2006.05.26.] ⟨ Define Selector functions 388 ⟩ +≡

try {

b = cdb CanUpdate( ); } catch(CDBException ∗e) {

temp strm ≪ ␣ ␣ ␣ ␣ ≪ e m strError ≪ endl ≪

      ␣                    ␣              ␣ ≪  ␣      ␣     ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

e Delete( );

errno = 1;

return; } /∗ catch ∗/

#if 0

if (b) AfxMessageBox (  ␣   ␣  ␣  );
else AfxMessageBox (  ␣   ␣  ␣  );

#endif 391. Test whether transactions are supported for cdb. [LDF 2006.05.26.] ⟨ Define Selector functions 388 ⟩ +≡

try {

b = cdb CanTransact ( ); } catch(CDBException ∗e) {

temp strm ≪ ␣ ␣ ␣ ␣ ≪ e m strError ≪ endl ≪

      ␣                      ␣              ␣ ≪  ␣      ␣     ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

e Delete( );

errno = 1;

return; } /∗ catch ∗/

#if 0

if (b) AfxMessageBox (  ␣   ␣   ␣         ␣     ␣  );
else AfxMessageBox (  ␣       ␣  ␣         ␣     ␣  );

#endif

392. Fill sort field map. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

sort field map[  ] =  ␣  ;
sort field map[  ] =  ;
sort field map[  ] =  ;
sort field map[  ] =  ␣  ;
sort field map[  ] =  ␣       ␣  ;

393. Fill timespan map. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

timespan map[  ] = ␣  ;
timespan map[  ] =  ;
timespan map[  ] =  ;
timespan map[  ] =  ␣  ;
timespan map[  ] =  ␣  ;
timespan map[  ] =  ␣  ;
timespan map[  ] =  ␣     ␣   ␣     ␣  ;
timespan map[  ] =  ␣   ␣  ;
timespan map[  ] =  ␣    ␣  ;
timespan map[  ] =  ␣    ␣   ␣    ␣  ;
timespan map[  ] =  ␣   ␣  ;
timespan map[  ] =  ␣    ␣  ;
timespan map[  ] =  ␣   ␣  ;
timespan map[  ] =  ␣  ␣  ;
timespan map[  ] = ␣  ;

394. ⟨ Define Selector functions 388 ⟩ +≡

errno = 0; return; } /∗ End of Selector ::Selector(void) definition. ∗/

395. Destructor. ⟨ Declare Selector functions 387 ⟩ +≡

∼Selector(void);

396. ⟨ Define Selector functions 388 ⟩ +≡

Selector ::∼Selector(void) {

if (curr record .IsOpen( )) curr record .Close( ); cdb = NULL;

}

397. Select from database. [LDF Undated.] ⟨ Declare Selector functions 387 ⟩ +≡

§398  IWF Metadata Harvester I  SELECT FROM DATABASE 113

int select from database( const unsigned int select value, CString &search str , const unsigned int search options ); 398. ⟨ Define Selector functions 388 ⟩ +≡

int Selector ::select from database( const unsigned int select value, CString &search str , const unsigned int search options ){

int ret val = 0; stringstream sql strm; unsigned int search arg = search options & ∼ ;

#if 0 /∗ 1 ∗/ temp strm ≪ ␣ ␣ ≪ search arg ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

temp strm ≪ ␣ ␣ ␣ ␣ ≪ ≪ search str ≪ ␣ ≪

search arg ≪ ␣ ; if (select value & ) temp strm ≪ ␣ ; else temp strm ≪ ␣ ; if (select value & ) temp strm ≪ ␣ ; else temp strm ≪ ␣ ; if (select value & ) temp strm ≪ ␣ ; else temp strm ≪ ␣ ; if (select value & ) temp strm ≪ ␣ ; else temp strm ≪ ␣ ; if (select value & ) temp strm ≪ ␣ ; else temp strm ≪ ␣ ; if (select value & ) temp strm ≪ ␣ ; else temp strm ≪ ␣ ; if (select value & ) temp strm ≪ ␣ ; else temp strm ≪ ␣ ; if (select value & ) temp strm ≪ ␣ ; else temp strm ≪ ␣ ; if (select value & ) temp strm ≪ ␣ ; else temp strm ≪ ␣ ; if (select value & ) temp strm ≪ ; else temp strm ≪ ;

399. ⟨ Define Selector functions 388 ⟩ +≡

try {

114  SELECT FROM DATABASE  IWF Metadata Harvester I §400

cdb ExecuteSQL(temp strm.str ( ).c str ( )); } 400. The error code is in e m nRetCode. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

catch(CDBException ∗e) {

temp strm ≪ ␣ ␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ≪ e m nRetCode ≪ endl ≪ ␣ ␣ ≪ e m strError ≪ endl ≪

    ␣                      ␣              ␣    ␣      ␣      ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); e Delete( ); return −1;

} /∗ catch ∗/ temp strm.str ( ); /∗ Do not delete! ∗/ 401. Get items from Temp IDs table. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

long record ctr = 0; temp ids .Open( ); while (¬temp ids .IsEOF ( )) {

temp ids .MoveNext ( ); } record ctr = temp ids .GetRecordCount ( ); html strm.open( ); html strm ≪ ␣ ␣ ≪ endl ≪ endl ≪ ␣ ␣ ␣ ≪

␣ ␣ ␣ ≪ endl ≪

≪ endl ≪ ␣ ≪ ␣ ≪ endl ≪

    ␣  ≪  ␣                     ␣

␣      ␣  ≪  ≪ copyright html str ≪

    ␣          ␣  ≪  ␣           ␣  ≪

search str ≪ ; BOOL first field = ; html strm ≪ ␣ ␣ ; if (select value & ) {

if (first field ) first field = ; else html strm ≪ ␣ ; html strm ≪ ;

} if (select value & ) {

if (first field ) first field = ; else html strm ≪ ␣ ; html strm ≪ ;

} if (select value & ) {

if (first field ) first field = ; else html strm ≪ ␣ ; html strm ≪ ;

} if (select value & ) {

if (first field ) first field = ; else html strm ≪ ␣ ; html strm ≪ ;

} if (select value & ) {

if (first field ) first field = ; else html strm ≪ ␣ ; html strm ≪ ;

} if (select value & ) {

if (first field ) first field = ; else html strm ≪ ␣ ; html strm ≪ ;

} if (select value & ) {

if (first field ) first field = ; else html strm ≪ ␣ ; html strm ≪ ;

} if (select value & ) {

if (first field ) first field = ;

else html strm ≪ ␣ ;

html strm ≪ ; } if (select value & ) {

if (first field ) first field = ;

else html strm ≪ ␣ ;

html strm ≪ ; } if (select value & ) {

if (first field ) first field = ;

else html strm ≪ ␣ ;

html strm ≪ ; } html strm ≪ ;

402. Search Options. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ␣ ␣ ;

if (search options &  ) html strm ≪  ␣  ␣    ␣   ␣     ␣     ␣ ;
else if (search options &  ) html strm ≪  ␣    ␣     ␣ ;
else if (search options &  ) html strm ≪  ␣  ␣       ␣      ␣ ;
else if (search options &  ) html strm ≪  ␣      ␣ ;

else html strm ≪ ␣ ␣ ␣ ␣ ␣ ␣ ;

if (search options &  ) html strm ≪  ␣  ;
else html strm ≪  ␣        ␣    ␣     ␣   ␣  ;

html strm ≪ ; if (record ctr ≤ 0) {

html strm ≪  ␣       ␣  ≪

      ␣          ␣  ≪  ;

temp ids .Close( );

if (records temp.IsOpen( )) records temp.Close( );

html strm.close( );

return 0; } else {

html strm ≪ ␣ ␣ ≪ record ctr ≪ ; temp ids .MoveFirst ( );

}

html strm ≪  ␣          ␣  ;

403. Open record sets for the temporary tables. [LDF Undated.] 404. ⟨ Define Selector functions 388 ⟩ +≡

contributors temp.Open( ); creators temp.Open( ); descriptions temp.Open( ); identifiers temp.Open( ); languages temp.Open( ); publishers temp.Open( ); rights temp.Open( ); subjects temp.Open( ); titles temp.Open( ); types temp.Open( );

405. Loop through temp ids and fill the other temporary tables. [LDF Undated.]

Log

[LDF 2006.08.29.] !! BUG FIX: Now closing and reopening records temp instead of calling CRecordset ::Requery ( ). I had problems with the latter function in ZTest. The use of Requery was causing the problem that large data sets weren’t sorted completely until the search had been performed two or three times.

⟨ Define Selector functions 388 ⟩ +≡

int temp ctr = 1; while (¬temp ids .IsEOF ( )) { sql strm ≪ ␣

    ␣      ␣            ␣ ≪  ␣ ␣    ␣       ␣     ␣         ␣  ␣ ≪

temp ids .m temp id ; cdb ExecuteSQL(sql strm.str ( ).c str ( )); sql strm.str ( );

406. This doesn’t seem to be needed anymore. Leaving the code here, just in case. [LDF 2006.08.29.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

if (records temp.IsOpen( )) records temp.Close( ); #endif

407. ⟨ Define Selector functions 388 ⟩ +≡

records temp.Open( );

html strm ≪  ␣  ≪ temp ctr ≪  ␣      ␣ ≪ temp ctr^{++} ≪
≪  ␣ ≪ records temp.m record id ≪  ;

ret val = fill table streams (cdb); 408. Error handling: fill table streams failed. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (ret val ≡ −1) {

temp strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ≪ endl ≪

    ␣        ␣              ␣    ␣       ␣     ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); temp ids .Close( ); html strm.close( ); if (records temp.IsOpen( )) records temp.Close( ); return −1;

} /∗ if (ret val ≡ −1) (fill table streams failed.) ∗/ #if 0 /∗ 1 ∗/

temp strm ≪ ␣ ␣ ≪ records temp.m record id ≪ endl ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

409. Write from streams to html strm. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

ret val = write html from streams ( , select value, &search str );

410. Error handling: write html from streams failed. ⟨ Define Selector functions 388 ⟩ +≡

if (ret val ≠ 0) {

temp strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ≪ ret val ≪ ≪ endl ≪

    ␣        ␣              ␣    ␣       ␣     ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); temp ids .Close( ); html strm.close( ); /∗ Currently, there is no error return from write html from streams . If I add

one, and I close these record sets, I’ll have to remove this code. LDF 2006.06.27. ∗/

#if 0 /∗ 1 ∗/

if (records temp.IsOpen( )) #endif

records temp.Close( ); contributors temp.Close( ); creators temp.Close( ); descriptions temp.Close( ); identifiers temp.Close( ); languages temp.Close( ); publishers temp.Close( ); rights temp.Close( ); subjects temp.Close( ); titles temp.Close( ); types temp.Close( ); return −1;

} /∗ if (ret val ≠ 0) (write html from streams failed.) ∗/ 411. Move to next record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

temp ids .MoveNext ( ); records temp.Close( ); } /∗ while (Iterating through records temp) ∗/

412. Write final code to html strm and close it. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ; html strm.close( );

413. Close record sets. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

temp ids .Close( );

414. WARNING! records temp shouldn’t be open at this point. [LDF 2006.08.29.] ⟨ Define Selector functions 388 ⟩ +≡

if (records temp.IsOpen( )) {

temp strm ≪ ␣␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ≪

      ≪ ␣         ␣   ␣␣      ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

records temp.Close( ); } /∗ if (records temp.IsOpen( )) ∗/

415. ⟨ Define Selector functions 388 ⟩ +≡

contributors temp.Close( ); creators temp.Close( ); descriptions temp.Close( ); identifiers temp.Close( ); languages temp.Close( ); publishers temp.Close( ); rights temp.Close( ); subjects temp.Close( ); titles temp.Close( ); types temp.Close( );

416. Exit select from database, returning the number of records. ⟨ Define Selector functions 388 ⟩ +≡

return record ctr ; } /∗ End of Selector ::select from database definition. ∗/

417. List records. [LDF Undated.] ⟨ Declare Selector functions 387 ⟩ +≡

120  LIST RECORDS  IWF Metadata Harvester I §418

int list records ( unsigned short sort field , unsigned short sort order , unsigned short timespan, BOOL suppress duplicate records ); 418. ⟨ Define Selector functions 388 ⟩ +≡

int Selector ::list records (unsigned short sort field , unsigned short sort order , unsigned short

timespan, BOOL suppress duplicate records ){

if (sort field <  ∨ sort field >  ) {
temp strm ≪  ␣␣  ␣  ≪ endl ≪

␣ ␣ ␣ ␣ ≪ sort field ≪ endl ≪

      ␣  ␣  ␣                      ␣    ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

sort field = ; } stringstream sql strm; sql strm ≪ ␣ ␣ ␣ ␣ ≪

    ␣          ␣     ␣       ␣  ␣ ␣ ;

§419  IWF Metadata Harvester I  LIST RECORDS 121

419. Timespan. ⟨ Define Selector functions 388 ⟩ +≡

int day of month; int day of week ; int month of year ; CTime t0 ; stringstream timespan strm; timespan strm.str ( ); string date type str ; if (use date type ≡ ) date type str = ; else date type str = ;

if (timespan ≤  ∨ timespan >  ) {
temp strm ≪  ␣␣  ␣  ≪ endl ≪

␣ ␣ ␣ ␣ ≪ timespan ≪ endl ≪

      ␣          ␣   ␣            ␣    ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

timespan = ; } if (timespan ≡ ) ; /∗ Do nothing. ∗/ else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( );

timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( );

t0 −= CTimeSpan(1, 0, 0, 0);

timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( );

day of week = t0 .GetDayOfWeek ( ) − 1;

t0 −= CTimeSpan(day of week , 0, 0, 0);

timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( );

day of week = t0 .GetDayOfWeek ( ) − 1;

t0 −= CTimeSpan(7 + day of week , 0, 0, 0);

timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( );

day of month = t0 .GetDay ( );

t0 −= CTimeSpan(day of month − 1, 0, 0, 0);

timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format (  ␣  ) ≪ ␣    ␣ ;

} else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); day of month = t0 .GetDay ( ); t0 −= CTimeSpan(day of month, 0, 0, 0); day of month = t0 .GetDay ( ); t0 −= CTimeSpan(day of month − 1, 0, 0, 0); timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); month of year = t0 .GetMonth( ); if (month of year > 5) {

CTime t1 (t0 .GetYear ( ), month of year − 5, 1, 0, 0, 0); t0 = t1 ;

} else {

CTime t1 (t0 .GetYear ( ) − 1, month of year + 7, 1, 0, 0, 0); t0 = t1 ;

} timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ), 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 1, 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 2, 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 5, 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 10, 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 20, 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } unsigned int select value = 0; if (sort field ≡ ) {

#if 0 temp strm ≪ ␣ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif if (timespan ≠ ) sql strm ≪ ␣ ≪ timespan strm.str ( ); sql strm ≪ ␣ ␣ ␣ ;

} else if (sort field ≡ ) {

#if 0 temp strm ≪ ␣ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

sql strm ≪ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ≪

    ␣          ␣  ␣           ␣ ≪  ␣           ␣ ␣             ␣ ;

if (timespan ≠  ) sql strm ≪  ␣ ≪ timespan strm.str ( );

sql strm ≪ ␣ ␣ ␣ ; select value = ;

} else if (sort field ≡ ) {

#if 0 temp strm ≪ ␣ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif sql strm ≪ ␣ ␣ ␣ ␣ ≪ ␣ ␣ ␣ ␣ ; if (timespan ≠ ) sql strm ≪ ␣ ≪ timespan strm.str ( ); sql strm ≪ ␣ ␣ ␣ ; select value = ;

} else if (sort field ≡ ) { #if 0

temp strm ≪ ␣ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif if (timespan ≠ ) sql strm ≪ ␣ ≪ timespan strm.str ( ); sql strm ≪ ␣ ␣ ␣ ; select value = ;

} else if (sort field ≡ ) {

#if 0 temp strm ≪ ␣ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif if (timespan ≠ ) sql strm ≪ ␣ ≪ timespan strm.str ( ); sql strm ≪ ␣ ␣ ␣ ;

}

420. Sort order. ⟨ Define Selector functions 388 ⟩ +≡

if (¬(sort order ≡  ∨ sort order ≡  )) {
temp strm ≪  ␣␣  ␣  ≪ endl ≪

␣ ␣ ␣ ␣ ≪ sort order ≪ endl ≪

    ␣  ␣  ␣                ␣   ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); sort order = ;

}

if (sort order ≡  ) sql strm ≪  ␣ ;
else if (sort order ≡  ) sql strm ≪  ␣ ;

421. Pass the command stored in sql strm to SQL-Server. ⟨ Define Selector functions 388 ⟩ +≡ #if 0

AfxMessageBox ( ␣ ␣ ␣ ); temp strm ≪ ␣ ␣ ≪ sql strm.str ( ); AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

try {

cdb ExecuteSQL(sql strm.str ( ).c str ( )); } 422. The error code is in e m nRetCode. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

catch(CDBException ∗e) {

temp strm ≪ ␣ ␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ≪ e m nRetCode ≪ endl ≪ ␣ ␣ ≪ e m strError ≪ endl ≪

      ␣              ␣             ␣     ␣      ␣     ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

e Delete( );

return −1; } /∗ catch ∗/ sql strm.str ( ); temp ids .Open( ); long record ctr = 0; while (¬temp ids .IsEOF ( )) {

temp ids .MoveNext ( ); } record ctr = temp ids .GetRecordCount ( );

#if 1 temp strm ≪ ␣ ␣␣ ≪ record ctr ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

423. Open html strm and write header. ⟨ Define Selector functions 388 ⟩ +≡

html strm.open( ); html strm ≪ ␣ ␣ ≪ endl ≪ endl ≪ ␣ ␣ ␣ ≪

␣ ␣ ␣ ≪ endl ≪

≪ endl ≪ ␣ ≪

␣ ≪ endl ≪

    ␣  ≪  ␣                     ␣

␣       ␣  ≪  ≪ copyright html str ≪

    ␣          ␣  ≪  ␣          ␣ ≪

sort field map[sort field ] ≪  ≪  ␣          ␣ ;
if (sort order ≡  ) html strm ≪  ;

else html strm ≪ ; html strm ≪ ≪ ␣ ≪ timespan map[timespan] ≪

; 424. Duplicate Records. [LDF Undated.]

Currently, there can only be duplicate records if sorting by creators. [LDF 2006.07.03.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ␣ ␣ ; if (sort field ≡ ) {

if (suppress duplicate records ) html strm ≪ ;

else html strm ≪  ␣  ;
}  /∗ if (sort field ≡  ) ∗/
else  /∗ sort field ≠  ∗/

{

html strm ≪  ␣  ;
}  /∗ else (sort field ≠  ) ∗/

html strm ≪ ; if (record ctr ≤ 0) {

html strm ≪  ␣       ␣  ≪

      ␣          ␣  ≪  ;

temp ids .Close( ); #if 0

records temp.Close( );

/∗ Closing records temp here causes a run-time error. I don’t know why. LDF 2006.06.28. ∗/ #endif

html strm.close( );

return 0; } else /∗ (record ctr > 0) ∗/ {

425. Recount records, if if suppress duplicate records ≡ . [LDF Undated.] Currently, there can only be duplicate records if sorting by creators. [LDF 2006.07.03.]

⟨ Define Selector functions 388 ⟩ +≡

if (suppress duplicate records ∧ sort field ≡ ) { temp ids 1 .Open(CRecordset ::dynaset , ␣ ␣ ␣ ␣ ); while (¬temp ids 1 .IsEOF ( )) {

temp ids 1 .MoveNext ( ); } record ctr = temp ids 1 .GetRecordCount ( ); temp strm ≪ ␣ ␣ ␣␣ ≪ record ctr ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); temp ids 1 .Close( );

}  /∗ if (suppress duplicate records ∧ sort field ≡  ) ∗/
html strm ≪  ␣          ␣ ≪ record ctr ≪  ;

temp ids .MoveFirst ( ); } /∗ else ((record ctr > 0)) ∗/

html strm ≪  ␣          ␣  ;

426. Open record sets for the temporary tables. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

records temp.Open( ); contributors temp.Open( ); creators temp.Open( ); descriptions temp.Open( ); identifiers temp.Open( ); languages temp.Open( ); publishers temp.Open( ); rights temp.Open( ); subjects temp.Open( ); titles temp.Open( ); types temp.Open( );

427. Loop through temp ids and fill the other temporary tables. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

int ret val ; unsigned long temp ctr = 1; set⟨unsigned long⟩ used ids ; set⟨unsigned long⟩::iterator iter ; while (¬temp ids .IsEOF ( )) {

428. Eliminate duplicates if suppress duplicate records ≡  ∧sort field ≡  . [LDF Undated.]

Currently, there can only be duplicate records if sorting by creators. [LDF 2006.07.03.] ⟨ Define Selector functions 388 ⟩ +≡

if (suppress duplicate records ∧ sort field ≡ ) { iter = used ids .find (temp ids .m temp id );

429. Record not used yet. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (iter ≡ used ids .end ( )) {

used ids .insert (temp ids .m temp id ); #if 0

temp strm ≪ ␣ ≪ temp ids .m temp id ≪ ␣ ␣ ␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif } /∗ if (iter ≡ used ids .end ( )) ∗/ 430. Record already used. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

else /∗ (iter ≠ used ids .end ( )) ∗/ {

#if 0 temp strm ≪ ␣ ≪ temp ids .m temp id ≪ ␣ ␣ ␣␣ ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif temp ids .MoveNext ( ); continue;

} /∗ else (iter ≠ used ids .end ( )) ∗/ } /∗ if (suppress duplicate records ∧ sort field ≡ ) ∗/ sql strm ≪ ␣ ␣ ␣ ␣ ≪

␣ ␣ ␣ ␣ ␣ ␣ ␣ ≪ temp ids .m temp id ; #if 0

temp strm ≪ ␣ ␣ ␣ ; temp strm ≪ ␣ ␣ ≪ sql strm.str ( ); AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

try {

cdb ExecuteSQL(sql strm.str ( ).c str ( )); }

431. The error code is in e m nRetCode. ⟨ Define Selector functions 388 ⟩ +≡

catch(CDBException ∗e) {

temp strm ≪ ␣ ␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ≪ e m nRetCode ≪ endl ≪ ␣ ␣ ≪ e m strError ≪ endl ≪

    ␣              ␣             ␣     ␣      ␣     ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); e Delete( ); temp ids .Close( ); records temp.Close( ); contributors temp.Close( ); creators temp.Close( ); descriptions temp.Close( ); identifiers temp.Close( ); languages temp.Close( ); publishers temp.Close( ); rights temp.Close( ); subjects temp.Close( ); titles temp.Close( ); types temp.Close( ); return −1;

} /∗ catch ∗/ 432.

Log

[LDF 2006.08.29.] !! BUG FIX: Now closing and reopening records temp instead of calling CRecordset ::Requery . I’ve had problems with the latter function.

⟨ Define Selector functions 388 ⟩ +≡ sql strm.str ( ); records temp.Close( ); records temp.Open( ); html strm ≪ ␣ ≪ temp ctr ≪ ␣ ␣ ≪ temp ctr ≪

≪ ␣ ≪ records temp.m record id ≪ ;

++temp ctr ; ret val = fill table streams (cdb);

433. Error handling: fill table streams failed. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (ret val ≡ −1) {

temp strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ≪ endl ≪

      ␣        ␣              ␣    ␣       ␣     ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

temp ids .Close( );

html strm.close( );

return −1; }

#if 0 temp strm ≪ ␣ ␣ ≪ records temp.m record id ≪ endl ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif

434. Write from streams to html strm. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

ret val = write html from streams ( , select value); 435. Error handling: write html from stream failed. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (ret val ≠ 0) {

temp strm ≪ ␣␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ≪ ret val ≪

≪ endl ≪ ␣ ␣ ␣ ␣ ␣ ␣ ;

AfxMessageBox (temp strm.str ( ).c str ( ));

temp strm.str ( );

temp ids .Close( );

html strm.close( ); /∗ Currently, there is no error return from write html from streams . If I add

one, and I close these record sets, I’ll have to remove this code. LDF 2006.06.27. ∗/ records temp.Close( ); contributors temp.Close( ); creators temp.Close( ); descriptions temp.Close( ); identifiers temp.Close( ); languages temp.Close( ); publishers temp.Close( ); rights temp.Close( ); subjects temp.Close( ); titles temp.Close( ); types temp.Close( ); return −1;

}

436. Move to next record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

temp ids .MoveNext ( ); } /∗ while (Iterating through temp ids ) ∗/

437. Write final code to html strm and close it. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ; html strm.close( );

438. Close record sets. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

temp ids .Close( ); records temp.Close( ); contributors temp.Close( ); creators temp.Close( ); descriptions temp.Close( ); identifiers temp.Close( ); languages temp.Close( ); publishers temp.Close( ); rights temp.Close( ); subjects temp.Close( ); titles temp.Close( ); types temp.Close( ); 439. Exit function successfully with record ctr . [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

return record ctr ; } /∗ End of Selector ::list records definition. ∗/

440. Fill table streams. [LDF Undated.] This function is called by Selector ::select from database, which is defined in select_from_database.cpp.

[LDF 2006.08.29.]

Log

[LDF 2006.08.29.] !! BUG FIX: Now closing and reopening the “ temp” objects that reference the various record sets, e.g., contributors temp, creators temp, etc. Formerly, I called CRecordset ::Requery on them. However, I had problems with the latter function in ZTest. Requery was causing the problem that large data sets weren’t sorted completely until the search had been performed two or three times. Closing and reopening the objects solved the problem.

⟨ Declare Selector functions 387 ⟩ +≡ int fill table streams (CDatabase ∗cdb);

441. ⟨ Define Selector functions 388 ⟩ +≡

int Selector ::fill table streams (CDatabase ∗cdb){

442. Clear streams. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

contributor strm.str ( ); creator strm.str ( ); dc date strm.str ( ); description strm.str ( ); header datestamp strm.str ( ); identifier strm.str ( ); language strm.str ( ); publisher strm.str ( ); rights strm.str ( ); subject strm.str ( ); title strm.str ( ); type strm.str ( ); temp strm ≪ ␣ ␣ ≪ records temp.m record id ; try {

132  FILL TABLE STREAMS  IWF Metadata Harvester I §443

cdb ExecuteSQL(temp strm.str ( ).c str ( )); } 443. The error code is in e m nRetCode. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

catch(CDBException ∗e) {

temp strm ≪ ␣ ␣ ␣ ≪ endl ≪ ␣ ␣ ␣ ≪ e m nRetCode ≪ endl ≪ ␣ ␣ ≪ e m strError ≪ endl ≪

    ␣                      ␣              ␣    ␣      ␣      ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); e Delete( ); records temp.Close( ); contributors temp.Close( ); creators temp.Close( ); descriptions temp.Close( ); identifiers temp.Close( ); languages temp.Close( ); publishers temp.Close( ); rights temp.Close( ); subjects temp.Close( ); titles temp.Close( ); types temp.Close( ); return −1;

} /∗ catch ∗/ temp strm.str ( );

444. Write dc date to dc date strm. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

dc date strm ≪ records temp.m dc date.Format (  ␣  ) ≪  ;

445. Write header datestamp to header datestamp strm. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

header datestamp strm ≪ records temp.m header datestamp.Format (  ␣  ) ≪  ;

446. Iterate through contributors for current record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

contributors temp.Requery ( ); #else

contributors temp.Close( ); contributors temp.Open( );

#endif

while (¬contributors temp.IsEOF ( )) {

temp strm ≪ ␣ ␣ ␣ ≪ contributors temp.m contributor id ≪ endl ≪

␣ ␣ ≪ contributors temp.m dc contributor ≪ endl ; contributor strm ≪ contributors temp.m dc contributor ≪ ; contributors temp.MoveNext ( );

} /∗ while ∗/ #if 0

AfxMessageBox (temp strm.str ( ).c str ( )); #endif

§447  IWF Metadata Harvester I  FILL TABLE STREAMS 133

temp strm.str ( ); 447. Iterate through creators for current record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

creators temp.Requery ( ); #else

creators temp.Close( );

creators temp.Open( ); #endif

while (¬creators temp.IsEOF ( )) {

temp strm ≪ ␣ ␣ ␣ ≪ creators temp.m creator id ≪ endl ≪ ␣ ␣ ≪

creators temp.m dc creator ≪ endl ; creator strm ≪ creators temp.m dc creator ≪ ; creators temp.MoveNext ( );

} /∗ while ∗/

448. Iterate through descriptions for current record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

descriptions temp.Requery ( ); #else

descriptions temp.Close( );

descriptions temp.Open( ); #endif

while (¬descriptions temp.IsEOF ( )) {

temp strm ≪ ␣ ␣ ␣ ≪ descriptions temp.m description id ≪ endl ≪

␣ ␣ ≪ descriptions temp.m dc description ≪ endl ; description strm ≪ descriptions temp.m dc description ≪ ; descriptions temp.MoveNext ( );

} /∗ while ∗/ #if 0

AfxMessageBox (temp strm.str ( ).c str ( )); #endif

temp strm.str ( ); 449. Iterate through identifiers for current record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

identifiers temp.Requery ( ); #else

identifiers temp.Close( );

identifiers temp.Open( ); #endif

while (¬identifiers temp.IsEOF ( )) {

temp strm ≪ ␣ ␣ ␣ ≪ identifiers temp.m identifier id ≪ endl ≪

␣ ␣ ≪ identifiers temp.m dc identifier ≪ endl ; identifier strm ≪ ␣ ≪ identifiers temp.m dc identifier ≪ ␣ ≪

identifiers temp.m dc identifier ≪ ␣ ; identifiers temp.MoveNext ( );

} /∗ while ∗/ #if 0

AfxMessageBox (temp strm.str ( ).c str ( )); #endif

temp strm.str ( );

450. Iterate through languages for current record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

languages temp.Requery ( ); #else

languages temp.Close( );

languages temp.Open( ); #endif

while (¬languages temp.IsEOF ( )) {

temp strm ≪ ␣ ␣ ␣ ≪ languages temp.m language id ≪ endl ≪ ␣ ␣ ≪

languages temp.m dc language ≪ endl ; language strm ≪ languages temp.m dc language ≪ ; languages temp.MoveNext ( );

} /∗ while ∗/ #if 0

AfxMessageBox (temp strm.str ( ).c str ( )); #endif

temp strm.str ( ); 451. Iterate through publishers for current record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

publishers temp.Requery ( ); #else

publishers temp.Close( );

publishers temp.Open( ); #endif

while (¬publishers temp.IsEOF ( )) {

temp strm ≪ ␣ ␣ ␣ ≪ publishers temp.m publisher id ≪ endl ≪

␣ ␣ ≪ publishers temp.m dc publisher ≪ endl ; publisher strm ≪ publishers temp.m dc publisher ≪ ; publishers temp.MoveNext ( );

} /∗ while ∗/ #if 0

AfxMessageBox (temp strm.str ( ).c str ( )); #endif

temp strm.str ( );

452. Iterate through rights for current record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

rights temp.Requery ( ); #else

rights temp.Close( );

rights temp.Open( ); #endif

while (¬rights temp.IsEOF ( )) {

temp strm ≪ ␣ ␣ ␣ ≪ rights temp.m rights id ≪ endl ≪ ␣ ␣ ≪

rights temp.m dc rights ≪ endl ;

rights strm ≪ ␣  ≪ rights temp.m dc rights ≪  ␣ ≪ rights temp.m dc rights ≪

        ␣  ;

rights temp.MoveNext ( ); } /∗ while ∗/

#if 0

AfxMesageBox (temp strm.str ( ).c str ( )); #endif

temp strm.str ( ); 453. Iterate through subjects for current record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

subjects temp.Requery ( ); #else

subjects temp.Close( );

subjects temp.Open( ); #endif

while (¬subjects temp.IsEOF ( )) {

temp strm ≪ ␣ ␣ ␣ ≪ subjects temp.m subject id ≪ endl ≪ ␣ ␣ ≪

subjects temp.m dc subject ≪ endl ; subject strm ≪ subjects temp.m dc subject ≪ ; subjects temp.MoveNext ( );

} /∗ while ∗/ #if 0

AfxMessageBox (temp strm.str ( ).c str ( )); #endif

temp strm.str ( );

454. Iterate through titles for current record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

titles temp.Requery ( ); #else

titles temp.Close( );

titles temp.Open( ); #endif

while (¬titles temp.IsEOF ( )) {

temp strm ≪ ␣ ␣ ␣ ≪ titles temp.m title id ≪ endl ≪ ␣ ␣ ≪

titles temp.m dc title ≪ endl ; title strm ≪ titles temp.m dc title ≪ ; titles temp.MoveNext ( );

} /∗ while ∗/ #if 0

AfxMessageBox (temp strm.str ( ).c str ( )); #endif

temp strm.str ( ); 455. Iterate through types for current record. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

types temp.Requery ( ); #else

types temp.Close( ); types temp.Open( );

#endif

while (¬types temp.IsEOF ( )) {

temp strm ≪ ␣ ␣ ␣ ≪ types temp.m type id ≪ endl ≪ ␣ ␣ ≪

types temp.m dc type ≪ endl ; type strm ≪ types temp.m dc type ≪ ; types temp.MoveNext ( );

} /∗ while ∗/ #if 0

AfxMessageBox (temp strm.str ( ).c str ( )); #endif

temp strm.str ( ); return 0; } /∗ End of Selector ::fill table streams definition. ∗/

456. Write HTML from streams. [LDF Undated.] ⟨ Declare Selector functions 387 ⟩ +≡

138  WRITE HTML FROM STREAMS  IWF Metadata Harvester I §457

int write html from streams ( unsigned short query type, unsigned int select value = 0, CString ∗search str = 0); 457. ⟨ Define Selector functions 388 ⟩ +≡

int Selector ::write html from streams ( unsigned short query type, unsigned int select value, CString ∗search str ){ string contributor str ;

string creator str ; string dc date str ; string description str ; string header datestamp str ; string identifier str ; string language str ; string publisher str ; string rights str ; string subject str ; string title str ; string type str ; contributor str = contributor strm.str ( ); creator str = creator strm.str ( ); dc date str = dc date strm.str ( ); description str = description strm.str ( ); header datestamp str = header datestamp strm.str ( ); identifier str = identifier strm.str ( ); language str = language strm.str ( ); publisher str = publisher strm.str ( ); rights str = rights strm.str ( ); subject str = subject strm.str ( ); title str = title strm.str ( ); type str = type strm.str ( ); string ::iterator iter ; string ::size type pos = 0; string search color str = ; string non search color str = ; string font begin str ; string font begin str save = ␣ ; string ::size type font begin str len; string ::size type search str len = 0; if (search str ) search str len = search str GetLength( ); string font end str = ; string replacement str = ; if (search str ) {

replacement str = font begin str ; replacement str += ∗search str ; replacement str += font end str ;

§458  IWF Metadata Harvester I  WRITE HTML FROM STREAMS 139

} 458. erase value is the length of the HTML code appended to contributor str , creator str , and the other strings . If the code is changed, the value of erase value may have to be changed, too! [LDF 2006.06.27.] ⟨ Define Selector functions 388 ⟩ +≡

string ::size type erase value = 5; string temp find str ; string temp search str ; long contributor ctr = 0; long creator ctr = 0; long description ctr = 0; long identifier ctr = 0; long language ctr = 0; long publisher ctr = 0; long rights ctr = 0; long subject ctr = 0; long title ctr = 0; long type ctr = 0;

459. ⟨ Define Selector functions 388 ⟩ +≡

contributor ctr = contributors temp.GetRecordCount ( ); creator ctr = creators temp.GetRecordCount ( ); description ctr = descriptions temp.GetRecordCount ( ); identifier ctr = identifiers temp.GetRecordCount ( ); language ctr = languages temp.GetRecordCount ( ); publisher ctr = publishers temp.GetRecordCount ( ); rights ctr = rights temp.GetRecordCount ( ); subject ctr = subjects temp.GetRecordCount ( ); title ctr = titles temp.GetRecordCount ( ); type ctr = types temp.GetRecordCount ( );

460. Find search str and color it, if we performed a search for it. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (query type ≡ ∧ select value ∧ search str ) { temp search str = ∗search str ; strlwr (const cast⟨char ∗⟩(temp search str .c str ( ))); 461. Contributors. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (contributor ctr ≤ 0) ; /∗ Do nothing. ∗/ else /∗ contributor ctr > 0 ∗/ {

if (select value & ) font begin str = font begin str save + search color str + ; else font begin str = font begin str save + non search color str + ; font begin str len = font begin str .length( ); pos = 0; temp find str = contributor str .erase(contributor str .length( ) − erase value); strlwr (const cast⟨char ∗⟩(temp find str .c str ( ))); while ( ) {

pos = temp find str .find (temp search str , pos ); if (pos ≡ string ::npos ) break; else {

contributor str .insert (pos , font begin str ); temp find str .insert (pos , font begin str ); pos += search str len + font begin str len; contributor str .insert (pos , font end str ); temp find str .insert (pos , font end str ); pos += font end str .length( ); continue;

} /∗ else ∗/ } /∗ while ∗/

} /∗ else (contributor ctr > 0) ∗/ temp find str = ; 462. Creators. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (creator ctr ≤ 0) ; /∗ Do nothing. ∗/ else /∗ creator ctr > 0 ∗/ {

if (select value & ) font begin str = font begin str save + search color str + ; else font begin str = font begin str save + non search color str + ; font begin str len = font begin str .length( ); pos = 0; temp find str = creator str .erase(creator str .length( ) − erase value); strlwr (const cast⟨char ∗⟩(temp find str .c str ( ))); while ( ) {

pos = temp find str .find (temp search str , pos ); if (pos ≡ string ::npos ) break; else {

creator str .insert (pos , font begin str ); temp find str .insert (pos , font begin str ); pos += search str len + font begin str len; creator str .insert (pos , font end str ); temp find str .insert (pos , font end str ); pos += font end str .length( ); continue;

} /∗ else ∗/ } /∗ while ∗/

} /∗ else (creator ctr > 0) ∗/ temp find str = ; 463. Descriptions. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

description ctr = descriptions temp.GetRecordCount ( ); if (description ctr ≤ 0) ; /∗ Do nothing. ∗/ else /∗ description ctr > 0 ∗/ {

if (select value & ) font begin str = font begin str save + search color str + ; else font begin str = font begin str save + non search color str + ; font begin str len = font begin str .length( ); pos = 0; temp find str = description str .erase(description str .length( ) − erase value); strlwr (const cast⟨char ∗⟩(temp find str .c str ( ))); while ( ) {

pos = temp find str .find (temp search str , pos ); if (pos ≡ string ::npos ) break; else {

description str .insert (pos , font begin str ); temp find str .insert (pos , font begin str ); pos += search str len + font begin str len; description str .insert (pos , font end str ); temp find str .insert (pos , font end str ); pos += font end str .length( ); continue;

} /∗ else ∗/ } /∗ while ∗/

} /∗ else (description ctr > 0) ∗/ temp find str = ; 464. Identifiers. [LDF Undated.]

Don’t color the search string in identifier str . [LDF 2006.06.26.] ⟨ Define Selector functions 388 ⟩ +≡ #if 0 /∗ 1 ∗/

if (identifier ctr ≤ 0) ; /∗ Do nothing. ∗/ else /∗ identifier ctr > 0 ∗/ {

if (select value & ) font begin str = font begin str save + search color str + ; else font begin str = font begin str save + non search color str + ; font begin str len = font begin str .length( ); pos = 0; temp find str = identifier str .erase(identifier str .length( ) − erase value); strlwr (const cast⟨char ∗⟩(temp find str .c str ( ))); while ( ) {

pos = temp find str .find (temp search str , pos ); if (pos ≡ string ::npos ) break; else {

identifier str .insert (pos , font begin str ); temp find str .insert (pos , font begin str ); pos += search str len + font begin str len; identifier str .insert (pos , font end str ); temp find str .insert (pos , font end str ); pos += font end str .length( ); continue;

} /∗ else ∗/ } /∗ while ∗/

} /∗ else (identifier ctr > 0) ∗/ temp find str = ;

#endif 465. Languages. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

language ctr = languages temp.GetRecordCount ( ); if (language ctr ≤ 0) ; /∗ Do nothing. ∗/ else /∗ language ctr > 0 ∗/ {

if (select value & ) font begin str = font begin str save + search color str + ; else font begin str = font begin str save + non search color str + ; font begin str len = font begin str .length( ); pos = 0; temp find str = language str .erase(language str .length( ) − erase value); strlwr (const cast⟨char ∗⟩(temp find str .c str ( ))); while ( ) {

pos = temp find str .find (temp search str , pos ); if (pos ≡ string ::npos ) break; else {

language str .insert (pos , font begin str ); temp find str .insert (pos , font begin str ); pos += search str len + font begin str len; language str .insert (pos , font end str ); temp find str .insert (pos , font end str ); pos += font end str .length( ); continue;

} /∗ else ∗/ } /∗ while ∗/

} /∗ else (language ctr > 0) ∗/ temp find str = ; 466. Publishers. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

publisher ctr = publishers temp.GetRecordCount ( ); if (publisher ctr ≤ 0) ; /∗ Do nothing. ∗/ else /∗ publisher ctr > 0 ∗/ {

if (select value & ) font begin str = font begin str save + search color str + ; else font begin str = font begin str save + non search color str + ; font begin str len = font begin str .length( ); pos = 0; temp find str = publisher str .erase(publisher str .length( ) − erase value); strlwr (const cast⟨char ∗⟩(temp find str .c str ( ))); while ( ) {

pos = temp find str .find (temp search str , pos ); if (pos ≡ string ::npos ) break; else {

publisher str .insert (pos , font begin str ); temp find str .insert (pos , font begin str ); pos += search str len + font begin str len; publisher str .insert (pos , font end str ); temp find str .insert (pos , font end str ); pos += font end str .length( ); continue;

} /∗ else ∗/ } /∗ while ∗/

} /∗ else (publisher ctr > 0) ∗/ temp find str = ; 467. Rights. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

rights ctr = rights temp.GetRecordCount ( ); if (rights ctr ≤ 0) ; /∗ Do nothing. ∗/ else /∗ rights ctr > 0 ∗/ {

if (select value & ) font begin str = font begin str save + search color str + ; else font begin str = font begin str save + non search color str + ; font begin str len = font begin str .length( ); pos = 0; temp find str = rights str .erase(rights str .length( ) − erase value); strlwr (const cast⟨char ∗⟩(temp find str .c str ( ))); while ( ) {

pos = temp find str .find (temp search str , pos ); if (pos ≡ string ::npos ) break; else {

rights str .insert (pos , font begin str ); temp find str .insert (pos , font begin str ); pos += search str len + font begin str len; rights str .insert (pos , font end str ); temp find str .insert (pos , font end str ); pos += font end str .length( ); continue;

} /∗ else ∗/ } /∗ while ∗/

} /∗ else (rights ctr > 0) ∗/ temp find str = ; 468. Subjects. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

subject ctr = subjects temp.GetRecordCount ( ); if (subject ctr ≤ 0) ; /∗ Do nothing. ∗/ else /∗ subject ctr > 0 ∗/ {

if (select value & ) font begin str = font begin str save + search color str + ; else font begin str = font begin str save + non search color str + ; font begin str len = font begin str .length( ); pos = 0; temp find str = subject str .erase(subject str .length( ) − erase value); strlwr (const cast⟨char ∗⟩(temp find str .c str ( ))); while ( ) {

pos = temp find str .find (temp search str , pos ); if (pos ≡ string ::npos ) break; else {

subject str .insert (pos , font begin str ); temp find str .insert (pos , font begin str ); pos += search str len + font begin str len; subject str .insert (pos , font end str ); temp find str .insert (pos , font end str ); pos += font end str .length( ); continue;

} /∗ else ∗/ } /∗ while ∗/

} /∗ else (subject ctr > 0) ∗/ temp find str = ; 469. Titles. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

title ctr = titles temp.GetRecordCount ( ); if (title ctr ≤ 0) ; /∗ Do nothing. ∗/ else /∗ title ctr > 0 ∗/ {

if (select value & ) font begin str = font begin str save + search color str + ; else font begin str = font begin str save + non search color str + ; font begin str len = font begin str .length( ); pos = 0; temp find str = title str .erase(title str .length( ) − erase value); strlwr (const cast⟨char ∗⟩(temp find str .c str ( ))); while ( ) {

pos = temp find str .find (temp search str , pos ); if (pos ≡ string ::npos ) break; else {

title str .insert (pos , font begin str );

temp find str .insert (pos , font begin str ); pos += search str len + font begin str len; title str .insert (pos , font end str ); temp find str .insert (pos , font end str ); pos += font end str .length( ); continue;

} /∗ else ∗/ } /∗ while ∗/

} /∗ else (title ctr > 0) ∗/ temp find str = ; 470. Types. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

type ctr = types temp.GetRecordCount ( ); if (type ctr ≤ 0) ; /∗ Do nothing. ∗/ else /∗ type ctr > 0 ∗/ {

if (select value & ) font begin str = font begin str save + search color str + ; else font begin str = font begin str save + non search color str + ; font begin str len = font begin str .length( ); pos = 0; temp find str = type str .erase(type str .length( ) − erase value); strlwr (const cast⟨char ∗⟩(temp find str .c str ( ))); while ( ) {

pos = temp find str .find (temp search str , pos );

if (pos ≡ string ::npos ) break;

else { type str .insert (pos , font begin str ); temp find str .insert (pos , font begin str ); pos += search str len + font begin str len; type str .insert (pos , font end str ); temp find str .insert (pos , font end str ); pos += font end str .length( ); continue;

} /∗ else ∗/ } /∗ while ∗/

} /∗ else (type ctr > 0) ∗/ temp find str = ; } /∗ if (query type ≡ ∧ select value ∧ search str ) ∗/ else

if (query type ≡ ∧ select value) {

font begin str = font begin str save + search color str + ; }

471. Output strings to html strm. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

472. Title(s). [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (title ctr ≤ 0 ∨ title strm.tellp( ) ≤ 0) html strm ≪ ␣ ; else {

if (title ctr ≡ 1) html strm ≪ ␣ ; else html strm ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; } html strm ≪ title str ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font end str ; } html strm ≪ ;

} 473. Creator(s). [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (creator ctr ≤ 0 ∨ creator strm.tellp( ) ≤ 0)

html strm ≪ ␣ ; else {

if (creator ctr ≡ 1) html strm ≪ ␣ ; else html strm ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; } html strm ≪ creator str ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font end str ; } html strm ≪ ;

}

474. Description(s). [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (description ctr ≤ 0 ∨ description strm.tellp( ) ≤ 0)

html strm ≪ ␣ ; else {

if (description ctr ≡ 1) html strm ≪ ␣ ; else html strm ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; } html strm ≪ description str ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font end str ; } html strm ≪ ;

}

475. Contributor(s). [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (contributor ctr ≤ 0 ∨ contributor strm.tellp( ) ≤ 0)

html strm ≪ ␣ ; else {

if (contributor ctr ≡ 1) html strm ≪ ␣ ; else html strm ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; } html strm ≪ contributor str ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font end str ; } html strm ≪ ;

} 476. Subject(s). [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (subject ctr ≤ 0 ∨ subject strm.tellp( ) ≤ 0)

html strm ≪ ␣ ; else {

if (subject ctr ≡ 1) html strm ≪ ␣ ; else html strm ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; } html strm ≪ subject str ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font end str ; } html strm ≪ ;

}

477. Identifier(s). [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (identifier ctr ≤ 0 ∨ identifier strm.tellp( ) ≤ 0)

html strm ≪ ␣ ; else {

if (identifier ctr ≡ 1) html strm ≪ ␣ ; else html strm ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; } html strm ≪ identifier str ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font end str ; } html strm ≪ ;

}

478. Publisher(s). [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (publisher ctr ≤ 0 ∨ publisher strm.tellp( ) ≤ 0)

html strm ≪ ␣ ; else {

if (publisher ctr ≡ 1) html strm ≪ ␣ ; else html strm ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; } html strm ≪ publisher str ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font end str ; } html strm ≪ ;

} 479. dc date. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; }

html strm ≪  ␣              ␣ ≪ dc date str ≪  ;
if (query type ≡  ∧ select value ≡  ) {

html strm ≪ font end str ; } html strm ≪ ;

480. header datestamp. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; }

html strm ≪  ␣        ␣              ␣ ≪ header datestamp str ≪  ;
if (query type ≡  ∧ select value ≡  ) {

html strm ≪ font end str ; } html strm ≪ ;

481. Language(s). [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (language ctr ≤ 0 ∨ language strm.tellp( ) ≤ 0)

html strm ≪ ␣ ; else {

if (language ctr ≡ 1) html strm ≪ ␣ ; else html strm ≪ ; html strm ≪ language str ≪ ; html strm ≪ ;

}

482. Type(s). [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (type ctr ≤ 0 ∨ type strm.tellp( ) ≤ 0) html strm ≪ ␣ ; else {

if (type ctr ≡ 1) html strm ≪ ␣ ; else html strm ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; } html strm ≪ type str ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font end str ; } html strm ≪ ;

} 483. Rights. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

if (rights ctr ≤ 0 ∨ rights strm.tellp( ) ≤ 0) html strm ≪ ␣ ; else {

if (rights ctr ≡ 1) html strm ≪ ␣ ; else html strm ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font begin str ; } html strm ≪ rights str ≪ ; if (query type ≡ ∧ select value ≡ ) {

html strm ≪ font end str ; } html strm ≪ ;

}

html strm ≪  ␣          ␣  ;

484. Clear streams and strings. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

contributor strm.str ( ); dc date strm.str ( ); creator strm.str ( ); description strm.str ( ); header datestamp strm.str ( ); identifier strm.str ( ); language strm.str ( ); publisher strm.str ( ); rights strm.str ( ); subject strm.str ( ); title strm.str ( ); type strm.str ( ); contributor str = ; creator str = ; dc date str = ; description str = ; header datestamp str = ; identifier str = ; language str = ; publisher str = ; rights str = ; subject str = ; title str = ; type str = ; return 0; } /∗ End of Selector ::write html from streams definition. ∗/

485. List table. [LDF Undated.] ⟨ Declare Selector functions 387 ⟩ +≡

154  LIST TABLE  IWF Metadata Harvester I §486

int list table( unsigned short table, unsigned short timespan, unsigned short sort order ); 486. ⟨ Define Selector functions 388 ⟩ +≡

int Selector ::list table( unsigned short table, unsigned short timespan, unsigned short sort order ){

int ret val = 0;

487. Timespan. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

int day of month; int day of week ; int month of year ; CTime t0 ; stringstream timespan strm; timespan strm.str ( ); string date type str ;

488. ⟨ Define Selector functions 388 ⟩ +≡

if (use date type ≡ ) date type str = ; else date type str = ; string sort order str ;

sort order str = (sort order ≡  ) ?  :  ;

§489  IWF Metadata Harvester I  LIST TABLE 155

489. ⟨ Define Selector functions 388 ⟩ +≡

if (timespan ≤  ∨ timespan >  ) {
temp strm ≪  ␣␣  ␣  ≪ endl ≪

␣ ␣ ␣ ␣ ≪ timespan ≪ endl ≪

    ␣          ␣   ␣            ␣    ␣  ;

AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( ); timespan = ;

} if (timespan ≡ ) ; /∗ Do nothing. ∗/ else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); t0 −= CTimeSpan(1, 0, 0, 0); timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); day of week = t0 .GetDayOfWeek ( ) − 1; t0 −= CTimeSpan(day of week , 0, 0, 0); timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); day of week = t0 .GetDayOfWeek ( ) − 1; t0 −= CTimeSpan(7 + day of week , 0, 0, 0); timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } 490. ⟨ Define Selector functions 388 ⟩ +≡

else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); day of month = t0 .GetDay ( ); t0 −= CTimeSpan(day of month − 1, 0, 0, 0); timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); day of month = t0 .GetDay ( ); t0 −= CTimeSpan(day of month, 0, 0, 0); day of month = t0 .GetDay ( ); t0 −= CTimeSpan(day of month − 1, 0, 0, 0); timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) { t0 = CTime ::GetCurrentTime( ); month of year = t0 .GetMonth( ); if (month of year > 5) {

CTime t1 (t0 .GetYear ( ), month of year − 5, 1, 0, 0, 0); t0 = t1 ;

} else {

CTime t1 (t0 .GetYear ( ) − 1, month of year + 7, 1, 0, 0, 0); t0 = t1 ;

} 491. ⟨ Define Selector functions 388 ⟩ +≡

timespan strm ≪ date type str ≪ ␣  ␣                 ␣ ≪ t0 .Format (  ␣  ) ≪

␣    ␣ ; }

else

if (timespan ≡ ) { t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ), 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 1, 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 2, 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 5, 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 10, 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; } else if (timespan ≡ ) {

t0 = CTime ::GetCurrentTime( ); CTime t1 (t0 .GetYear ( ) − 20, 1, 1, 0, 0, 0); t0 = t1 ; timespan strm ≪ date type str ≪ ␣ ␣ ␣ ≪

t0 .Format ( ␣ ) ≪ ␣ ␣ ; }

if (table ≡  ) { html strm.open(  );

492. Write header to html strm. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪  ␣                 ␣  ≪ endl ≪ endl ≪

    ␣    ␣       ␣ ≪  ␣    ␣     ␣  ≪

endl ≪ ≪ endl ≪

    ␣  ≪  ␣

≪  ␣  ≪

    ␣                     ␣             ␣           ␣  ≪

≪ copyright html str ≪

    ␣          ␣  ≪  ≪  ␣          ␣ ≪

; temp strm ≪ ␣ ␣ ␣ ≪

    ␣       ␣        ␣                 ␣ ≪
    ␣                 ␣           ␣ ≪
    ␣           ␣   ␣  ␣       ␣  ␣  ␣                    ␣   ␣  ␣ ≪
    ␣                ␣ ␣ ␣ ≪  ␣                 ␣ ␣                ␣ ≪
    ␣           ␣ ␣           ␣ ;

if (timespan ≠  ) temp strm ≪  ␣ ≪ timespan strm.str ( );

temp strm ≪ ␣ ␣ ␣ ≪ sort order str ; cdb ExecuteSQL(temp strm.str ( ).c str ( )); temp strm.str ( ); contributors temp.Open( ); unsigned long contributor ctr ; while (¬contributors temp.IsEOF ( )) {

contributors temp.MoveNext ( ); } contributor ctr = contributors temp.GetRecordCount ( ); if (contributor ctr ≡ 0) {

html strm ≪  ␣           ␣  ≪

      ␣          ␣  ;

return 0; } else ret val = contributor ctr ;

html strm ≪  ␣          ␣ ≪ contributor ctr ≪  ≪

    ␣          ␣  ;

contributors temp.MoveFirst ( ); contributor ctr = 1; while (¬contributors temp.IsEOF ( )) {

html strm ≪ contributor ctr^{++} ≪ ␣ ≪ contributors temp.m dc contributor ≪ ␣ ;

temp strm ≪  ␣        ␣ ≪  ␣        ␣       ␣          ␣ ≪

      ␣       ␣  ␣  ␣                     ␣  ␣   ␣ ≪  ␣  ␣␣ ␣ ≪

␣ ␣ ␣ ≪ contributors temp.m contributor id ≪ ␣ ≪ ␣ ␣ ␣ ≪ contributors temp.m contributor id ≪ ␣ ≪

      ␣           ␣ ␣  ;

cdb ExecuteSQL(temp strm.str ( ).c str ( ));

temp strm.str ( );

temp ids .Open( );

while (¬temp ids .IsEOF ( )) {

temp ids .MoveNext ( ); } /∗ while (¬temp ids .IsEOF ( )) ∗/ if (temp ids .GetRecordCount ( ) > 0) { temp ids .MoveFirst ( ); while (¬temp ids .IsEOF ( )) {

html strm ≪ ≪ ␣ ≪ temp ids .m temp id ≪

≪ temp ids .m temp id ≪ ␣ ; temp ids .MoveNext ( );

} /∗ while (¬temp ids .IsEOF ( )) ∗/ } /∗ if (temp ids .GetRecordCount ( ) > 0) ∗/ temp ids .Close( ); html strm ≪ ; contributors temp.MoveNext ( );

} /∗ while (¬contributors temp.IsEOF ( )) ∗/ contributors temp.Close( );

493. Write trailer to html strm and close it. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ≪ ␣ ␣ ≪

;

html strm.close( ); }  /∗ if (table ≡  ) ∗/
else if (table ≡  ) { html strm.open(  );

494. Write header to html strm. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ␣ ␣ ≪ endl ≪ endl ≪ ␣ ␣ ␣ ≪ ␣ ␣ ␣ ≪ endl ≪ ≪ endl ≪ ␣ ≪ ␣ ≪ endl ≪

    ␣  ≪  ␣
    ␣             ␣        ␣  ≪  ≪

copyright html str ≪  ␣          ␣  ≪  ≪

    ␣          ␣ ≪  ;

temp strm ≪  ␣             ␣      ␣ ≪  ␣

    ␣        ␣             ␣            ␣ ≪  ␣           ␣ ≪
    ␣        ␣  ␣   ␣       ␣  ␣  ␣                ␣  ␣  ␣ ≪
    ␣           ␣  ␣ ␣   ␣             ␣ ␣           ␣ ≪
    ␣           ␣ ␣           ␣ ;

if (timespan ≠  ) temp strm ≪  ␣ ≪ timespan strm.str ( );

temp strm ≪ ␣ ␣ ␣ ≪ sort order str ; cdb ExecuteSQL(temp strm.str ( ).c str ( )); temp strm.str ( ); creators temp.Open( ); unsigned long creator ctr ; while (¬creators temp.IsEOF ( )) {

creators temp.MoveNext ( ); } creator ctr = creators temp.GetRecordCount ( ); if (creator ctr ≡ 0) {

html strm ≪  ␣        ␣  ≪

      ␣          ␣  ;

return 0; } else ret val = creator ctr ;

html strm ≪  ␣          ␣ ≪ creator ctr ≪  ≪

    ␣          ␣  ;

creators temp.MoveFirst ( ); creator ctr = 1; while (¬creators temp.IsEOF ( )) {

html strm ≪ creator ctr^{++} ≪ ␣ ≪ creators temp.m dc creator ≪ ␣ ;

temp strm ≪  ␣        ␣ ≪  ␣        ␣       ␣          ␣ ≪

      ␣       ␣  ␣  ␣                ␣  ␣    ␣ ≪  ␣  ␣␣ ␣ ≪

␣ ␣ ␣ ≪ creators temp.m creator id ≪ ␣ ≪ ␣ ␣ ␣ ≪ creators temp.m creator id ≪ ␣ ≪ ␣ ␣ ␣ ;

cdb ExecuteSQL(temp strm.str ( ).c str ( ));

temp strm.str ( );

temp ids .Open( );

while (¬temp ids .IsEOF ( )) {

temp ids .MoveNext ( ); } /∗ while (¬temp ids .IsEOF ( )) ∗/ if (temp ids .GetRecordCount ( ) > 0) {

temp ids .MoveFirst ( );

while (¬temp ids .IsEOF ( )) {

html strm ≪  ≪ ␣  ≪ temp ids .m temp id ≪

≪ temp ids .m temp id ≪ ␣ ; temp ids .MoveNext ( );

} /∗ while (¬temp ids .IsEOF ( )) ∗/ } /∗ if (temp ids .GetRecordCount ( ) > 0) ∗/ temp ids .Close( ); html strm ≪ ; creators temp.MoveNext ( );

} /∗ while (¬creators temp.IsEOF ( )) ∗/ creators temp.Close( );

495. Write trailer to html strm and close it. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ≪ ␣ ␣ ≪

;

html strm.close( ); }  /∗ if (table ≡  ) ∗/
else if (table ≡  ) { html strm.open(  );

496. Write header to html strm. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ␣ ␣ ≪ endl ≪ endl ≪ ␣ ␣ ␣ ≪ ␣ ␣ ␣ ≪ endl ≪ ≪ endl ≪ ␣ ≪

␣ ≪ endl ≪

    ␣  ≪  ␣
    ␣             ␣        ␣  ≪  ≪

copyright html str ≪  ␣          ␣  ≪  ≪

    ␣          ␣ ≪  ;

if (timespan ≡ )

temp strm ≪  ␣        ␣       ␣        ␣ ≪  ␣          ␣     ␣ ≪

      ␣ ≪  ␣  ␣  ;

else temp strm ≪  ␣        ␣       ␣        ␣ ≪  ␣            ␣    ␣ ≪

      ␣  ␣ ␣ ≪ ␣       ␣  ␣  ␣                ␣  ␣  ␣ ≪
      ␣          ␣  ␣           ␣ ≪  ␣           ␣ ␣             ␣ ≪

␣ ≪ timespan strm.str ( ) ≪  ␣  ␣  ;

#if 0

AfxMessageBox (temp strm.str ( ).c str ( )); #endif

cdb ExecuteSQL(temp strm.str ( ).c str ( )); temp strm.str ( ); temp ids .Open( ); unsigned long subject ctr = 0; set⟨unsigned long⟩ used ids ; set⟨unsigned long⟩::iterator iter ; while (¬temp ids .IsEOF ( )) {

iter = used ids .find (temp ids .m temp id );

if (iter ≡ used ids .end ( )) { ++subject ctr ; used ids .insert (temp ids .m temp id );

}

temp ids .MoveNext ( ); } if (subject ctr ≡ 0) {

html strm ≪  ␣        ␣  ≪

      ␣          ␣  ;

return 0; } else ret val = subject ctr ;

html strm ≪  ␣          ␣ ≪ subject ctr ≪  ≪

    ␣          ␣  ;

temp ids .MoveFirst ( ); #if 0

temp strm ≪ ␣ ␣ ␣ ≪ subject ctr ; AfxMessageBox (temp strm.str ( ).c str ( )); temp strm.str ( );

#endif subject ctr = 1; used ids .clear ( ); subjects .Open( ); while (¬temp ids .IsEOF ( )) {

iter = used ids .find (temp ids .m temp id ); if (iter ≡ used ids .end ( )) {

used ids .insert (temp ids .m temp id ); } else {

temp ids .MoveNext ( );

continue; } subjects .SetAbsolutePosition(temp ids .m temp id ); html strm ≪ subject ctr^{++} ≪ ␣ ≪ subjects .m dc subject ≪ ␣ ;

temp strm ≪  ␣          ␣ ≪  ␣          ␣       ␣          ␣ ≪

    ␣       ␣  ␣  ␣                ␣  ␣    ␣ ≪  ␣  ␣␣ ␣ ≪

␣ ␣ ␣ ≪ temp ids .m temp id ≪ ␣ ≪ ␣ ␣ ␣ ≪ temp ids .m temp id ≪ ␣ ≪ ␣ ␣ ␣ ;

cdb ExecuteSQL(temp strm.str ( ).c str ( )); temp strm.str ( ); temp ids 1 .Open( ); while (¬temp ids 1 .IsEOF ( )) {

temp ids 1 .MoveNext ( ); } /∗ while (¬temp ids 1 .IsEOF ( )) ∗/ if (temp ids 1 .GetRecordCount ( ) > 0) {

temp ids 1 .MoveFirst ( );

while (¬temp ids 1 .IsEOF ( )) {

html strm ≪  ≪  ␣  ≪
temp ids 1 .m temp id ≪  ≪ temp ids 1 .m temp id ≪  ␣ ;

temp ids 1 .MoveNext ( ); } /∗ while (¬temp ids 1 .IsEOF ( )) ∗/

} /∗ if (temp ids 1 .GetRecordCount ( ) > 0) ∗/ html strm ≪ ; temp ids .MoveNext ( ); temp ids 1 .Close( );

} /∗ while (¬temp ids .IsEOF ( )) ∗/ temp ids .Close( ); subjects .Close( );

497. Write trailer to html strm and close it. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ≪ ␣ ␣ ≪

;

html strm.close( ); }  /∗ if (table ≡  ) ∗/
else if (table ≡  ) { html strm.open(  );

498. Write header to html strm. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ␣ ␣ ≪ endl ≪ endl ≪ ␣ ␣ ␣ ≪ ␣ ␣ ␣ ≪ endl ≪

≪ endl ≪

    ␣  ≪  ␣  ≪

    ␣  ≪  ␣
    ␣             ␣      ␣  ≪  ≪

copyright html str ≪  ␣          ␣  ≪  ≪

    ␣          ␣ ≪  ;

temp strm ≪ ␣ ␣ ␣ ␣ ␣ ␣ ≪

    ␣      ␣  ␣  ␣       ␣  ␣ ␣     ␣           ␣ ␣           ␣ ;

if (timespan ≠  ) temp strm ≪  ␣ ≪ timespan strm.str ( ) ≪ ␣ ;

temp strm ≪ ␣ ␣ ␣ ≪ sort order str ; cdb ExecuteSQL(temp strm.str ( ).c str ( )); temp strm.str ( ); temp ids .Open( ); unsigned long title ctr ; while (¬temp ids .IsEOF ( )) {

temp ids .MoveNext ( ); } title ctr = temp ids .GetRecordCount ( ); if (title ctr ≡ 0) {

html strm ≪  ␣      ␣  ≪

      ␣          ␣  ;

return 0; } else ret val = title ctr ;

html strm ≪  ␣          ␣ ≪ title ctr ≪  ≪

    ␣          ␣  ;

temp ids .MoveFirst ( ); title ctr = 1; titles .Open( ); while (¬temp ids .IsEOF ( )) {

titles .SetAbsolutePosition(temp ids .m temp id );

html strm ≪ title ctr^{++} ≪ ␣ ≪ ␣ ≪

temp ids .m temp id ≪ ␣ ≪ titles .m dc title ≪ ; temp ids .MoveNext ( );

} titles .Close( ); temp ids .Close( );

499. Write trailer to html strm and close it. [LDF Undated.] ⟨ Define Selector functions 388 ⟩ +≡

html strm ≪ ≪ ␣ ␣ ≪

; html strm.close( ); } /∗ if (table ≡ ) ∗/ return ret val ; } /∗ End of int Selector ::list table definition. ∗/

500. Putting Selector together.

§501  IWF Metadata Harvester I  PUTTING SELECTOR TOGETHER 165

501. This is what’s compiled.

⟨ Include files 20 ⟩ ⟨ Preprocessor macro definitions 18 ⟩ ⟨ Initialize static constants in class Selector 385 ⟩ ⟨ Define Selector functions 388 ⟩

166  PUTTING SELECTOR TOGETHER  IWF Metadata Harvester I §502

502. This is what’s written to selector.h. ⟨ 502 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ Forward declarations 383 ⟩

⟨ Declare class Selector 384 ⟩

503. Records (records.web).

Log

[LDF 2006.10.04.] Created this file. It contains code formerly in Records.h and Records.cpp.

⟨ records.web 503 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

504. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

505. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ ≡

using namespace std;

See also sections 526, 547, 568, 589, 610, 631, 652, 673, 694, 715, 736, 757, 778, 799, 820, 841, and 862. This code is used in sections 522, 543, 564, 585, 606, 627, 648, 669, 690, 711, 732, 753, 774, 795, 816, 837, 858, and 879.

506. Include files. ⟨ Include files 20 ⟩ +≡ #include

507. Records class declaration.

Log

[LDF 2006.06.16.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Records 507 ⟩ ≡ class Records : public CRecordset { public: long m record id ;

CStringA m header identifier ; CTime m header datestamp; CStringA m header status ; CTime m dc date; ⟨ Declare Records functions 509 ⟩

};

This code is used in section 522.

508. Functions.

509. Constructor. ⟨ Declare Records functions 509 ⟩ ≡ Records(CDatabase ∗pDatabase = NULL); (Records)

See also sections 511, 513, 515, 517, and 519. This code is used in section 507.

510. ⟨ Define Records functions 510 ⟩ ≡

(Records, CRecordset) Records ::Records(CDatabase ∗pdb) : CRecordset(pdb) {

m record id = 0;

m header identifier = ;

m header datestamp;

m header status = ;

m dc date;

m nFields = 5;

m nDefaultType = dynaset ; }

See also sections 512, 514, 516, 518, and 520. This code is used in section 523.

511. Get default connect. [LDF 2006.06.16.] ⟨ Declare Records functions 509 ⟩ +≡

virtual CString GetDefaultConnect ( );

512. ⟨ Define Records functions 510 ⟩ +≡

CString Records ::GetDefaultConnect ( ) {

return ( ); }

513. Standard-SQL for Recordset. [LDF 2006.06.16.] ⟨ Declare Records functions 509 ⟩ +≡

virtual CString GetDefaultSQL( );

514. ⟨ Define Records functions 510 ⟩ +≡

CString Records ::GetDefaultSQL( ) {

return ( ); }

515. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.16.] ⟨ Declare Records functions 509 ⟩ +≡

168  DO FIELD EXCHANGE  IWF Metadata Harvester I §516

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 516. ⟨ Define Records functions 510 ⟩ +≡

void Records ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m record id ); RFX Text (pFX , ( ), m header identifier , 1023); RFX Date(pFX , ( ), m header datestamp); RFX Text (pFX , ( ), m header status , 1023); RFX Date(pFX , ( ), m dc date);

}

517. Assert Valid. [LDF 2006.06.16.] ⟨ Declare Records functions 509 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

518. ⟨ Define Records functions 510 ⟩ +≡ #ifdef

void Records ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

519. Dump. [LDF 2006.06.16.] ⟨ Declare Records functions 509 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

520. ⟨ Define Records functions 510 ⟩ +≡ #ifdef

void Records ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

521. Putting Records together.

522. This is what gets written to records.h. ⟨ 522 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Records 507 ⟩

§523  IWF Metadata Harvester I  PUTTING RECORDS TOGETHER 169

523. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Records functions 510 ⟩

524. Records Temp (rcrdstmp.web).

Log

[LDF 2006.10.09.] Created this file. It contains code formerly in Records Temp.h and Records Temp.cpp.

⟨ rcrdstmp.web 524 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

525. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

526. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

527. Include files. ⟨ Include files 20 ⟩ +≡ #include

528. Records Temp class declaration.

Log

[LDF 2006.06.20.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Records Temp 528 ⟩ ≡ class Records Temp : public CRecordset { public: long m record id ;

CStringA m header identifier ; CTime m header datestamp; CStringA m header status ; CTime m dc date; ⟨ Declare Records Temp functions 530 ⟩

};

This code is used in section 543.

529. Functions.

530. Constructor. ⟨ Declare Records Temp functions 530 ⟩ ≡

Records Temp(CDatabase ∗pDatabase = NULL); (Records Temp)

See also sections 532, 534, 536, 538, and 540. This code is used in section 528.

531. ⟨ Define Records Temp functions 531 ⟩ ≡

(Records Temp, CRecordset) Records Temp ::Records Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m record id = 0;

m header identifier = ;

m header datestamp;

m header status = ;

m dc date;

m nFields = 5;

m nDefaultType = dynaset ; }

See also sections 533, 535, 537, 539, and 541. This code is used in section 544.

532. Get default connect. [LDF 2006.06.20.] ⟨ Declare Records Temp functions 530 ⟩ +≡

virtual CString GetDefaultConnect ( );

533. ⟨ Define Records Temp functions 531 ⟩ +≡

CString Records Temp ::GetDefaultConnect ( ) {

return ( ); }

534. Standard-SQL for Recordset. [LDF 2006.06.20.] ⟨ Declare Records Temp functions 530 ⟩ +≡

virtual CString GetDefaultSQL( );

535. ⟨ Define Records Temp functions 531 ⟩ +≡

CString Records Temp ::GetDefaultSQL( ) {

return ( ); }

536. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.20.] ⟨ Declare Records Temp functions 530 ⟩ +≡

§537  IWF Metadata Harvester I  DO FIELD EXCHANGE 171

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 537. ⟨ Define Records Temp functions 531 ⟩ +≡

void Records Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m record id ); RFX Text (pFX , ( ), m header identifier , 1023); RFX Date(pFX , ( ), m header datestamp); RFX Text (pFX , ( ), m header status , 1023); RFX Date(pFX , ( ), m dc date);

}

538. Assert Valid. [LDF 2006.06.20.] ⟨ Declare Records Temp functions 530 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

539. ⟨ Define Records Temp functions 531 ⟩ +≡ #ifdef

void Records Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

540. Dump. [LDF 2006.06.20.] ⟨ Declare Records Temp functions 530 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

541. ⟨ Define Records Temp functions 531 ⟩ +≡ #ifdef

void Records Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

542. Putting Records Temp together.

543. This is what gets written to rcrdstmp.h. ⟨ 543 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Records Temp 528 ⟩

172  PUTTING RECORDS TEMP TOGETHER  IWF Metadata Harvester I §544

544. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Records Temp functions 531 ⟩

545. Creators (creators.web).

Log

[LDF 2006.10.04.] Created this file. It contains code formerly in Creators.h and Creators.cpp.

⟨ creators.web 545 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

546. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

547. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

548. Include files. ⟨ Include files 20 ⟩ +≡ #include

549. Creators class declaration.

Log

[LDF 2006.06.30.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Creators 549 ⟩ ≡ class Creators : public CRecordset { public: long m creator id ;

CStringA m dc creator ; long m institution id ; long m person id ; ⟨ Declare Creators functions 551 ⟩

};

This code is used in section 564.

550. Functions.

551. Constructor. ⟨ Declare Creators functions 551 ⟩ ≡

Creators(CDatabase ∗pDatabase = NULL); (Creators)

See also sections 553, 555, 557, 559, and 561. This code is used in section 549.

552. ⟨ Define Creators functions 552 ⟩ ≡

(Creators, CRecordset) Creators ::Creators(CDatabase ∗pdb) : CRecordset(pdb) {

m creator id = 0;

m dc creator = ;

m institution id = 0;

m person id = 0;

m nFields = 4;

m nDefaultType = dynaset ; }

See also sections 554, 556, 558, 560, and 562. This code is used in section 565.

553. Get default connect. [LDF 2006.06.30.] ⟨ Declare Creators functions 551 ⟩ +≡

virtual CString GetDefaultConnect ( );

554. ⟨ Define Creators functions 552 ⟩ +≡

CString Creators ::GetDefaultConnect ( ) {

return ( ); }

555. Standard-SQL for Recordset. [LDF 2006.06.30.] ⟨ Declare Creators functions 551 ⟩ +≡

virtual CString GetDefaultSQL( );

556. ⟨ Define Creators functions 552 ⟩ +≡

CString Creators ::GetDefaultSQL( ) {

return ( ); }

557. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.30.] ⟨ Declare Creators functions 551 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 558. ⟨ Define Creators functions 552 ⟩ +≡

void Creators ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m creator id ); RFX Text (pFX , ( ), m dc creator , 1023); RFX Long (pFX , ( ), m institution id ); RFX Long (pFX , ( ), m person id );

}

559. Assert Valid. [LDF 2006.06.30.] ⟨ Declare Creators functions 551 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

560. ⟨ Define Creators functions 552 ⟩ +≡ #ifdef

void Creators ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

561. Dump. [LDF 2006.06.30.] ⟨ Declare Creators functions 551 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

562. ⟨ Define Creators functions 552 ⟩ +≡ #ifdef

void Creators ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

563. Putting Creators together.

564. This is what gets written to creators.h. ⟨ 564 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Creators 549 ⟩

§565  IWF Metadata Harvester I  PUTTING CREATORS TOGETHER 175

565. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Creators functions 552 ⟩

566. Creators Temp (crtrstmp.web).

Log

[LDF 2006.10.04.] Created this file. It contains code formerly in Creators Temp.h and Creators Temp.cpp.

⟨ crtrstmp.web 566 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

567. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

568. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

569. Include files. ⟨ Include files 20 ⟩ +≡ #include

570. Creators Temp class declaration.

Log

[LDF 2006.06.21.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Creators Temp 570 ⟩ ≡ class Creators Temp : public CRecordset { public: long m creator id ;

CStringA m dc creator ; long m institution id ; long m person id ; ⟨ Declare Creators Temp functions 572 ⟩

};

This code is used in section 585.

571. Functions.

572. Constructor. ⟨ Declare Creators Temp functions 572 ⟩ ≡

Creators Temp(CDatabase ∗pDatabase = NULL); (Creators Temp)

See also sections 574, 576, 578, 580, and 582. This code is used in section 570.

573. ⟨ Define Creators Temp functions 573 ⟩ ≡

(Creators Temp, CRecordset) Creators Temp ::Creators Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m creator id = 0;

m dc creator = ;

m institution id = 0;

m person id = 0;

m nFields = 4;

m nDefaultType = dynaset ; }

See also sections 575, 577, 579, 581, and 583. This code is used in section 586.

574. Get default connect. [LDF 2006.06.21.] ⟨ Declare Creators Temp functions 572 ⟩ +≡

virtual CString GetDefaultConnect ( );

575. ⟨ Define Creators Temp functions 573 ⟩ +≡

CString Creators Temp ::GetDefaultConnect ( ) {

return ( ); }

576. Standard-SQL for Recordset. [LDF 2006.06.21.] ⟨ Declare Creators Temp functions 572 ⟩ +≡

virtual CString GetDefaultSQL( );

577. ⟨ Define Creators Temp functions 573 ⟩ +≡

CString Creators Temp ::GetDefaultSQL( ) {

return ( ); }

578. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.21.] ⟨ Declare Creators Temp functions 572 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 579. ⟨ Define Creators Temp functions 573 ⟩ +≡

void Creators Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m creator id ); RFX Text (pFX , ( ), m dc creator , 1023); RFX Long (pFX , ( ), m institution id ); RFX Long (pFX , ( ), m person id );

}

580. Assert Valid. [LDF 2006.06.21.] ⟨ Declare Creators Temp functions 572 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

581. ⟨ Define Creators Temp functions 573 ⟩ +≡ #ifdef

void Creators Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

582. Dump. [LDF 2006.06.21.] ⟨ Declare Creators Temp functions 572 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

583. ⟨ Define Creators Temp functions 573 ⟩ +≡ #ifdef

void Creators Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

584. Putting Creators Temp together.

585. This is what gets written to crtrstmp.h. ⟨ 585 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Creators Temp 570 ⟩

178  PUTTING CREATORS TEMP TOGETHER  IWF Metadata Harvester I §586

586. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Creators Temp functions 573 ⟩

587. Contributors (cntrbtrs.web).

Log

[LDF 2006.10.04.] Created this file. It contains code formerly in Contributors.h and Contributors.cpp.

⟨ cntrbtrs.web 587 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

588. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

589. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

590. Include files. ⟨ Include files 20 ⟩ +≡ #include

591. Contributors class declaration.

Log

[LDF 2006.06.30.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Contributors 591 ⟩ ≡ class Contributors : public CRecordset { public: long m contributor id ;

CStringA m dc contributor ;

long m institution id ; long m person id ; ⟨ Declare Contributors functions 593 ⟩

};

This code is used in section 606.

592. Functions.

593. Constructor. ⟨ Declare Contributors functions 593 ⟩ ≡

Contributors(CDatabase ∗pDatabase = NULL); (Contributors)

See also sections 595, 597, 599, 601, and 603. This code is used in section 591.

594. ⟨ Define Contributors functions 594 ⟩ ≡

(Contributors, CRecordset) Contributors ::Contributors(CDatabase ∗pdb) : CRecordset(pdb) {

m contributor id = 0;

m dc contributor = ;

m institution id = 0;

m person id = 0;

m nFields = 4;

m nDefaultType = dynaset ; }

See also sections 596, 598, 600, 602, and 604. This code is used in section 607.

595. Get default connect. [LDF 2006.06.30.] ⟨ Declare Contributors functions 593 ⟩ +≡

virtual CString GetDefaultConnect ( );

596. ⟨ Define Contributors functions 594 ⟩ +≡

CString Contributors ::GetDefaultConnect ( ) {

return ( ); }

597. Standard-SQL for Recordset. [LDF 2006.06.30.] ⟨ Declare Contributors functions 593 ⟩ +≡

virtual CString GetDefaultSQL( );

598. ⟨ Define Contributors functions 594 ⟩ +≡

CString Contributors ::GetDefaultSQL( ) {

return ( ); }

599. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.30.] ⟨ Declare Contributors functions 593 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 600. ⟨ Define Contributors functions 594 ⟩ +≡

void Contributors ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m contributor id ); RFX Text (pFX , ( ), m dc contributor , 1023); RFX Long (pFX , ( ), m institution id ); RFX Long (pFX , ( ), m person id );

}

601. Assert Valid. [LDF 2006.06.30.] ⟨ Declare Contributors functions 593 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

602. ⟨ Define Contributors functions 594 ⟩ +≡ #ifdef

void Contributors ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

603. Dump. [LDF 2006.06.30.] ⟨ Declare Contributors functions 593 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

604. ⟨ Define Contributors functions 594 ⟩ +≡ #ifdef

void Contributors ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

605. Putting Contributors together.

606. This is what gets written to cntrbtrs.h. ⟨ 606 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Contributors 591 ⟩

§607  IWF Metadata Harvester I  PUTTING CONTRIBUTORS TOGETHER 181

607. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Contributors functions 594 ⟩

608. Contributors Temp (cntrbtmp.web).

Log

[LDF 2006.10.04.] Created this file. It contains code formerly in Contributors Temp.h and Contribu-

tors Temp.cpp.

⟨ cntrbtmp.web 608 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

609. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

610. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

611. Include files. ⟨ Include files 20 ⟩ +≡ #include

612. Contributors Temp class declaration.

Log

[LDF 2006.06.22.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Contributors Temp 612 ⟩ ≡ class Contributors Temp : public CRecordset { public: long m contributor id ;

CStringA m dc contributor ;

long m institution id ; long m person id ; ⟨ Declare Contributors Temp functions 614 ⟩

};

This code is used in section 627.

613. Functions.

614. Constructor. ⟨ Declare Contributors Temp functions 614 ⟩ ≡

Contributors Temp(CDatabase ∗pDatabase = NULL); (Contributors Temp)

See also sections 616, 618, 620, 622, and 624. This code is used in section 612.

615. ⟨ Define Contributors Temp functions 615 ⟩ ≡

(Contributors Temp, CRecordset) Contributors Temp ::Contributors Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m contributor id = 0;

m dc contributor = ;

m institution id = 0;

m person id = 0;

m nFields = 4;

m nDefaultType = dynaset ; }

See also sections 617, 619, 621, 623, and 625. This code is used in section 628.

616. Get default connect. [LDF 2006.06.22.] ⟨ Declare Contributors Temp functions 614 ⟩ +≡

virtual CString GetDefaultConnect ( );

617. ⟨ Define Contributors Temp functions 615 ⟩ +≡

CString Contributors Temp ::GetDefaultConnect ( ) {

return ( ); }

618. Standard-SQL for Recordset. [LDF 2006.06.22.] ⟨ Declare Contributors Temp functions 614 ⟩ +≡

virtual CString GetDefaultSQL( );

619. ⟨ Define Contributors Temp functions 615 ⟩ +≡

CString Contributors Temp ::GetDefaultSQL( ) {

return ( ); }

620. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.22.] ⟨ Declare Contributors Temp functions 614 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 621. ⟨ Define Contributors Temp functions 615 ⟩ +≡

void Contributors Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m contributor id ); RFX Text (pFX , ( ), m dc contributor , 1023); RFX Long (pFX , ( ), m institution id ); RFX Long (pFX , ( ), m person id );

}

622. Assert Valid. [LDF 2006.06.22.] ⟨ Declare Contributors Temp functions 614 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

623. ⟨ Define Contributors Temp functions 615 ⟩ +≡ #ifdef

void Contributors Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

624. Dump. [LDF 2006.06.22.] ⟨ Declare Contributors Temp functions 614 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

625. ⟨ Define Contributors Temp functions 615 ⟩ +≡ #ifdef

void Contributors Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

626. Putting Contributors Temp together.

627. This is what gets written to cntrbtmp.h. ⟨ 627 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Contributors Temp 612 ⟩

184  PUTTING CONTRIBUTORS TEMP TOGETHER  IWF Metadata Harvester I §628

628. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Contributors Temp functions 615 ⟩

629. Titles (titles.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Titles.h and Titles.cpp.

⟨ titles.web 629 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

630. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

631. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

632. Include files. ⟨ Include files 20 ⟩ +≡ #include

633. Titles class declaration.

Log

[LDF 2006.06.30.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Titles 633 ⟩ ≡ class Titles : public CRecordset { public: long m title id ;

long m record id ; CStringA m dc title; ⟨ Declare Titles functions 635 ⟩

};

This code is used in section 648.

634. Functions.

635. Constructor. ⟨ Declare Titles functions 635 ⟩ ≡

Titles(CDatabase ∗pDatabase = NULL); (Titles)

See also sections 637, 639, 641, 643, and 645. This code is used in section 633.

636. ⟨ Define Titles functions 636 ⟩ ≡

(Titles, CRecordset) Titles ::Titles(CDatabase ∗pdb) : CRecordset(pdb) {

m title id = 0;

m record id = 0;

m dc title = ;

m nFields = 3;

m nDefaultType = dynaset ; }

See also sections 638, 640, 642, 644, and 646. This code is used in section 649.

637. Get default connect. [LDF 2006.06.30.] ⟨ Declare Titles functions 635 ⟩ +≡

virtual CString GetDefaultConnect ( );

638. ⟨ Define Titles functions 636 ⟩ +≡

CString Titles ::GetDefaultConnect ( ) {

return ( ); }

639. Standard-SQL for Recordset. [LDF 2006.06.30.] ⟨ Declare Titles functions 635 ⟩ +≡

virtual CString GetDefaultSQL( );

640. ⟨ Define Titles functions 636 ⟩ +≡

CString Titles ::GetDefaultSQL( ) {

return ( ); }

641. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.30.] ⟨ Declare Titles functions 635 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 642. ⟨ Define Titles functions 636 ⟩ +≡

void Titles ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m title id ); RFX Long (pFX , ( ), m record id ); RFX Text (pFX , ( ), m dc title, 1023);

}

643. Assert Valid. [LDF 2006.06.30.] ⟨ Declare Titles functions 635 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

644. ⟨ Define Titles functions 636 ⟩ +≡ #ifdef

void Titles ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

645. Dump. [LDF 2006.06.30.] ⟨ Declare Titles functions 635 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

646. ⟨ Define Titles functions 636 ⟩ +≡ #ifdef

void Titles ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

647. Putting Titles together.

648. This is what gets written to titles.h. ⟨ 648 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Titles 633 ⟩

§649  IWF Metadata Harvester I  PUTTING TITLES TOGETHER 187

649. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Titles functions 636 ⟩

650. Titles Temp (ttlstmp.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Titles Temp.h and Titles Temp.cpp.

⟨ ttlstmp.web 650 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

651. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

652. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

653. Include files. ⟨ Include files 20 ⟩ +≡ #include

654. Titles Temp class declaration.

Log

[LDF 2006.06.20.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Titles Temp 654 ⟩ ≡ class Titles Temp : public CRecordset { public: long m title id ;

long m record id ; CStringA m dc title; ⟨ Declare Titles Temp functions 656 ⟩

};

This code is used in section 669.

655. Functions.

656. Constructor. ⟨ Declare Titles Temp functions 656 ⟩ ≡

Titles Temp(CDatabase ∗pDatabase = NULL); (Titles Temp)

See also sections 658, 660, 662, 664, and 666. This code is used in section 654.

657. ⟨ Define Titles Temp functions 657 ⟩ ≡

(Titles Temp, CRecordset) Titles Temp ::Titles Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m title id = 0;

m record id = 0;

m dc title = ;

m nFields = 3;

m nDefaultType = dynaset ; }

See also sections 659, 661, 663, 665, and 667. This code is used in section 670.

658. Get default connect. [LDF 2006.06.20.] ⟨ Declare Titles Temp functions 656 ⟩ +≡

virtual CString GetDefaultConnect ( );

659. ⟨ Define Titles Temp functions 657 ⟩ +≡

CString Titles Temp ::GetDefaultConnect ( ) {

return ( ); }

660. Standard-SQL for Recordset. [LDF 2006.06.20.] ⟨ Declare Titles Temp functions 656 ⟩ +≡

virtual CString GetDefaultSQL( );

661. ⟨ Define Titles Temp functions 657 ⟩ +≡

CString Titles Temp ::GetDefaultSQL( ) {

return ( ); }

662. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.20.] ⟨ Declare Titles Temp functions 656 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 663. ⟨ Define Titles Temp functions 657 ⟩ +≡

void Titles Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m title id ); RFX Long (pFX , ( ), m record id ); RFX Text (pFX , ( ), m dc title, 1023);

}

664. Assert Valid. [LDF 2006.06.20.] ⟨ Declare Titles Temp functions 656 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

665. ⟨ Define Titles Temp functions 657 ⟩ +≡ #ifdef

void Titles Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

666. Dump. [LDF 2006.06.20.] ⟨ Declare Titles Temp functions 656 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

667. ⟨ Define Titles Temp functions 657 ⟩ +≡ #ifdef

void Titles Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

668. Putting Titles Temp together.

669. This is what gets written to ttlstmp.h. ⟨ 669 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Titles Temp 654 ⟩

190  PUTTING TITLES TEMP TOGETHER  IWF Metadata Harvester I §670

670. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Titles Temp functions 657 ⟩

671. Descriptions Temp (dscrptmp.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Descriptions Temp.h and Descrip-

tions Temp.cpp.

⟨ dscrptmp.web 671 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

672. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

673. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

674. Include files. ⟨ Include files 20 ⟩ +≡ #include

675. Descriptions Temp class declaration.

Log

[LDF 2066.06.22.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Descriptions Temp 675 ⟩ ≡ class Descriptions Temp : public CRecordset { public: long m description id ;

long m record id ;

CStringA m dc description;

⟨ Declare Descriptions Temp functions 677 ⟩ };

This code is used in section 690.

676. Functions.

677. Constructor. ⟨ Declare Descriptions Temp functions 677 ⟩ ≡

Descriptions Temp(CDatabase ∗pDatabase = NULL); (Descriptions Temp)

See also sections 679, 681, 683, 685, and 687. This code is used in section 675.

678. ⟨ Define Descriptions Temp functions 678 ⟩ ≡

(Descriptions Temp, CRecordset) Descriptions Temp ::Descriptions Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m description id = 0;

m record id = 0;

m dc description = ;

m nFields = 3;

m nDefaultType = dynaset ; }

See also sections 680, 682, 684, 686, and 688. This code is used in section 691.

679. Get default connect. [LDF 2066.06.22.] ⟨ Declare Descriptions Temp functions 677 ⟩ +≡

virtual CString GetDefaultConnect ( );

680. ⟨ Define Descriptions Temp functions 678 ⟩ +≡

CString Descriptions Temp ::GetDefaultConnect ( ) {

return ( ); }

681. Standard-SQL for Recordset. [LDF 2066.06.22.] ⟨ Declare Descriptions Temp functions 677 ⟩ +≡

virtual CString GetDefaultSQL( );

682. ⟨ Define Descriptions Temp functions 678 ⟩ +≡

CString Descriptions Temp ::GetDefaultSQL( ) {

return ( ); }

683. Do Field Exchange. RFX-Unterstützung. [LDF 2066.06.22.] ⟨ Declare Descriptions Temp functions 677 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 684. ⟨ Define Descriptions Temp functions 678 ⟩ +≡

void Descriptions Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m description id ); RFX Long (pFX , ( ), m record id ); RFX Text (pFX , ( ), m dc description, 2048);

}

685. Assert Valid. [LDF 2066.06.22.] ⟨ Declare Descriptions Temp functions 677 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

686. ⟨ Define Descriptions Temp functions 678 ⟩ +≡ #ifdef

void Descriptions Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

687. Dump. [LDF 2066.06.22.] ⟨ Declare Descriptions Temp functions 677 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

688. ⟨ Define Descriptions Temp functions 678 ⟩ +≡ #ifdef

void Descriptions Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

689. Putting Descriptions Temp together.

690. This is what gets written to dscrptmp.h. ⟨ 690 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Descriptions Temp 675 ⟩

§691  IWF Metadata Harvester I  PUTTING DESCRIPTIONS TEMP TOGETHER 193

691. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Descriptions Temp functions 678 ⟩

692. Subjects (subjects.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Subjects.h and Subjects.cpp.

⟨ subjects.web 692 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

693. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

694. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

695. Include files. ⟨ Include files 20 ⟩ +≡ #include

696. Subjects class declaration.

Log

[LDF 2006.06.30.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Subjects 696 ⟩ ≡ class Subjects : public CRecordset { public: long m subject id ;

CStringA m dc subject ;

⟨ Declare Subjects functions 698 ⟩ };

This code is used in section 711.

697. Functions.

698. Constructor. ⟨ Declare Subjects functions 698 ⟩ ≡

Subjects(CDatabase ∗pDatabase = NULL); (Subjects)

See also sections 700, 702, 704, 706, and 708. This code is used in section 696.

699. ⟨ Define Subjects functions 699 ⟩ ≡

(Subjects, CRecordset) Subjects ::Subjects(CDatabase ∗pdb) : CRecordset(pdb) {

m subject id = 0;

m dc subject = ;

m nFields = 2;

m nDefaultType = dynaset ; }

See also sections 701, 703, 705, 707, and 709. This code is used in section 712.

700. Get default connect. [LDF 2006.06.30.] ⟨ Declare Subjects functions 698 ⟩ +≡

virtual CString GetDefaultConnect ( );

701. ⟨ Define Subjects functions 699 ⟩ +≡

CString Subjects ::GetDefaultConnect ( ) {

return ( ); }

702. Standard-SQL for Recordset. [LDF 2006.06.30.] ⟨ Declare Subjects functions 698 ⟩ +≡

virtual CString GetDefaultSQL( );

703. ⟨ Define Subjects functions 699 ⟩ +≡

CString Subjects ::GetDefaultSQL( ) {

return ( ); }

704. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.30.] ⟨ Declare Subjects functions 698 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 705. ⟨ Define Subjects functions 699 ⟩ +≡

void Subjects ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m subject id ); RFX Text (pFX , ( ), m dc subject , 1023);

}

706. Assert Valid. [LDF 2006.06.30.] ⟨ Declare Subjects functions 698 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

707. ⟨ Define Subjects functions 699 ⟩ +≡ #ifdef

void Subjects ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

708. Dump. [LDF 2006.06.30.] ⟨ Declare Subjects functions 698 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

709. ⟨ Define Subjects functions 699 ⟩ +≡ #ifdef

void Subjects ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

710. Putting Subjects together.

711. This is what gets written to subjects.h. ⟨ 711 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Subjects 696 ⟩

196  PUTTING SUBJECTS TOGETHER  IWF Metadata Harvester I §712

712. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Subjects functions 699 ⟩

713. Subjects Temp (sbjcttmp.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Subjects Temp.h and Subjects Temp.cpp.

⟨ sbjcttmp.web 713 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

714. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

715. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

716. Include files. ⟨ Include files 20 ⟩ +≡ #include

717. Subjects Temp class declaration.

Log

[LDF 2006.06.20.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Subjects Temp 717 ⟩ ≡ class Subjects Temp : public CRecordset { public: long m subject id ;

CStringA m dc subject ;

⟨ Declare Subjects Temp functions 719 ⟩ };

This code is used in section 732.

718. Functions.

719. Constructor. ⟨ Declare Subjects Temp functions 719 ⟩ ≡

Subjects Temp(CDatabase ∗pDatabase = NULL); (Subjects Temp)

See also sections 721, 723, 725, 727, and 729. This code is used in section 717.

720. ⟨ Define Subjects Temp functions 720 ⟩ ≡

(Subjects Temp, CRecordset) Subjects Temp ::Subjects Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m subject id = 0;

m dc subject = ;

m nFields = 2;

m nDefaultType = dynaset ; }

See also sections 722, 724, 726, 728, and 730. This code is used in section 733.

721. Get default connect. [LDF 2006.06.20.] ⟨ Declare Subjects Temp functions 719 ⟩ +≡

virtual CString GetDefaultConnect ( );

722. ⟨ Define Subjects Temp functions 720 ⟩ +≡

CString Subjects Temp ::GetDefaultConnect ( ) {

return ( ); }

723. Standard-SQL for Recordset. [LDF 2006.06.20.] ⟨ Declare Subjects Temp functions 719 ⟩ +≡

virtual CString GetDefaultSQL( );

724. ⟨ Define Subjects Temp functions 720 ⟩ +≡

CString Subjects Temp ::GetDefaultSQL( ) {

return ( ); }

725. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.20.] ⟨ Declare Subjects Temp functions 719 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 726. ⟨ Define Subjects Temp functions 720 ⟩ +≡

void Subjects Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m subject id ); RFX Text (pFX , ( ), m dc subject , 1023);

}

727. Assert Valid. [LDF 2006.06.20.] ⟨ Declare Subjects Temp functions 719 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

728. ⟨ Define Subjects Temp functions 720 ⟩ +≡ #ifdef

void Subjects Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

729. Dump. [LDF 2006.06.20.] ⟨ Declare Subjects Temp functions 719 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

730. ⟨ Define Subjects Temp functions 720 ⟩ +≡ #ifdef

void Subjects Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

731. Putting Subjects Temp together.

732. This is what gets written to sbjcttmp.h. ⟨ 732 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Subjects Temp 717 ⟩

§733  IWF Metadata Harvester I  PUTTING SUBJECTS TEMP TOGETHER 199

733. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Subjects Temp functions 720 ⟩

734. Identifiers Temp (identtmp.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Identifiers Temp.h and Identifiers Temp.cpp.

⟨ identtmp.web 734 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

735. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

736. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

737. Include files. ⟨ Include files 20 ⟩ +≡ #include

738. Identifiers Temp class declaration.

Log

[LDF 2006.06.22.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Identifiers Temp 738 ⟩ ≡ class Identifiers Temp : public CRecordset { public: long m identifier id ;

CStringA m dc identifier ;

⟨ Declare Identifiers Temp functions 740 ⟩ };

This code is used in section 753.

739. Functions.

740. Constructor. ⟨ Declare Identifiers Temp functions 740 ⟩ ≡

Identifiers Temp(CDatabase ∗pDatabase = NULL); (Identifiers Temp)

See also sections 742, 744, 746, 748, and 750. This code is used in section 738.

741. ⟨ Define Identifiers Temp functions 741 ⟩ ≡

(Identifiers Temp, CRecordset) Identifiers Temp ::Identifiers Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m identifier id = 0;

m dc identifier = ;

m nFields = 2;

m nDefaultType = dynaset ; }

See also sections 743, 745, 747, 749, and 751. This code is used in section 754.

742. Get default connect. [LDF 2006.06.22.] ⟨ Declare Identifiers Temp functions 740 ⟩ +≡

virtual CString GetDefaultConnect ( );

743. ⟨ Define Identifiers Temp functions 741 ⟩ +≡

CString Identifiers Temp ::GetDefaultConnect ( ) {

return ( ); }

744. Standard-SQL for Recordset. [LDF 2006.06.22.] ⟨ Declare Identifiers Temp functions 740 ⟩ +≡

virtual CString GetDefaultSQL( );

745. ⟨ Define Identifiers Temp functions 741 ⟩ +≡

CString Identifiers Temp ::GetDefaultSQL( ) {

return ( ); }

746. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.22.] ⟨ Declare Identifiers Temp functions 740 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 747. ⟨ Define Identifiers Temp functions 741 ⟩ +≡

void Identifiers Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m identifier id ); RFX Text (pFX , ( ), m dc identifier , 1024);

}

748. Assert Valid. [LDF 2006.06.22.] ⟨ Declare Identifiers Temp functions 740 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

749. ⟨ Define Identifiers Temp functions 741 ⟩ +≡ #ifdef

void Identifiers Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

750. Dump. [LDF 2006.06.22.] ⟨ Declare Identifiers Temp functions 740 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

751. ⟨ Define Identifiers Temp functions 741 ⟩ +≡ #ifdef

void Identifiers Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

752. Putting Identifiers Temp together.

753. This is what gets written to identtmp.h. ⟨ 753 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Identifiers Temp 738 ⟩

202  PUTTING IDENTIFIERS TEMP TOGETHER  IWF Metadata Harvester I §754

754. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Identifiers Temp functions 741 ⟩

755. Languages Temp (langtmp.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Languages Temp.h and Languages Temp.cpp.

⟨ langtmp.web 755 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

756. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

757. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

758. Include files. ⟨ Include files 20 ⟩ +≡ #include

759. Languages Temp class declaration.

Log

[LDF 2006.06.22.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Languages Temp 759 ⟩ ≡ class Languages Temp : public CRecordset { public: long m language id ;

CStringA m dc language;

⟨ Declare Languages Temp functions 761 ⟩ };

This code is used in section 774.

760. Functions.

761. Constructor. ⟨ Declare Languages Temp functions 761 ⟩ ≡

Languages Temp(CDatabase ∗pDatabase = NULL); (Languages Temp)

See also sections 763, 765, 767, 769, and 771. This code is used in section 759.

762. ⟨ Define Languages Temp functions 762 ⟩ ≡

(Languages Temp, CRecordset) Languages Temp ::Languages Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m language id = 0;

m dc language = ;

m nFields = 2;

m nDefaultType = dynaset ; }

See also sections 764, 766, 768, 770, and 772. This code is used in section 775.

763. Get default connect. [LDF 2006.06.22.] ⟨ Declare Languages Temp functions 761 ⟩ +≡

virtual CString GetDefaultConnect ( );

764. ⟨ Define Languages Temp functions 762 ⟩ +≡

CString Languages Temp ::GetDefaultConnect ( ) {

return ( ); }

765. Standard-SQL for Recordset. [LDF 2006.06.22.] ⟨ Declare Languages Temp functions 761 ⟩ +≡

virtual CString GetDefaultSQL( );

766. ⟨ Define Languages Temp functions 762 ⟩ +≡

CString Languages Temp ::GetDefaultSQL( ) {

return ( ); }

767. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.22.] ⟨ Declare Languages Temp functions 761 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 768. ⟨ Define Languages Temp functions 762 ⟩ +≡

void Languages Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m language id ); RFX Text (pFX , ( ), m dc language, 1023);

}

769. Assert Valid. [LDF 2006.06.22.] ⟨ Declare Languages Temp functions 761 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

770. ⟨ Define Languages Temp functions 762 ⟩ +≡ #ifdef

void Languages Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

771. Dump. [LDF 2006.06.22.] ⟨ Declare Languages Temp functions 761 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

772. ⟨ Define Languages Temp functions 762 ⟩ +≡ #ifdef

void Languages Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

773. Putting Languages Temp together.

774. This is what gets written to langtmp.h. ⟨ 774 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Languages Temp 759 ⟩

§775  IWF Metadata Harvester I  PUTTING LANGUAGES TEMP TOGETHER 205

775. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Languages Temp functions 762 ⟩

776. Publishers Temp (pblshtmp.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Publishers Temp.h and Publishers Temp.cpp.

⟨ pblshtmp.web 776 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

777. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

778. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

779. Include files. ⟨ Include files 20 ⟩ +≡ #include

780. Publishers Temp class declaration.

Log

[LDF 2006.06.22.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Publishers Temp 780 ⟩ ≡ class Publishers Temp : public CRecordset { public: long m publisher id ;

CStringA m dc publisher ;

long m person id ; long m institution id ; long m company id ; ⟨ Declare Publishers Temp functions 782 ⟩

};

This code is used in section 795.

781. Functions.

782. Constructor. ⟨ Declare Publishers Temp functions 782 ⟩ ≡

Publishers Temp(CDatabase ∗pDatabase = NULL); (Publishers Temp)

See also sections 784, 786, 788, 790, and 792. This code is used in section 780.

783. ⟨ Define Publishers Temp functions 783 ⟩ ≡

(Publishers Temp, CRecordset) Publishers Temp ::Publishers Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m publisher id = 0;

m dc publisher = ;

m person id = 0;

m institution id = 0;

m company id = 0;

m nFields = 5;

m nDefaultType = dynaset ; }

See also sections 785, 787, 789, 791, and 793. This code is used in section 796.

784. Get default connect. [LDF 2006.06.22.] ⟨ Declare Publishers Temp functions 782 ⟩ +≡

virtual CString GetDefaultConnect ( );

785. ⟨ Define Publishers Temp functions 783 ⟩ +≡

CString Publishers Temp ::GetDefaultConnect ( ) {

return ( ); }

786. Standard-SQL for Recordset. [LDF 2006.06.22.] ⟨ Declare Publishers Temp functions 782 ⟩ +≡

virtual CString GetDefaultSQL( );

787. ⟨ Define Publishers Temp functions 783 ⟩ +≡

CString Publishers Temp ::GetDefaultSQL( ) {

return ( ); }

788. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.22.] ⟨ Declare Publishers Temp functions 782 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 789. ⟨ Define Publishers Temp functions 783 ⟩ +≡

void Publishers Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m publisher id ); RFX Text (pFX , ( ), m dc publisher , 1023); RFX Long (pFX , ( ), m person id ); RFX Long (pFX , ( ), m institution id ); RFX Long (pFX , ( ), m company id );

}

790. Assert Valid. [LDF 2006.06.22.] ⟨ Declare Publishers Temp functions 782 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

791. ⟨ Define Publishers Temp functions 783 ⟩ +≡ #ifdef

void Publishers Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

792. Dump. [LDF 2006.06.22.] ⟨ Declare Publishers Temp functions 782 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

793. ⟨ Define Publishers Temp functions 783 ⟩ +≡ #ifdef

void Publishers Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

794. Putting Publishers Temp together.

795. This is what gets written to pblshtmp.h. ⟨ 795 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Publishers Temp 780 ⟩

208  PUTTING PUBLISHERS TEMP TOGETHER  IWF Metadata Harvester I §796

796. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Publishers Temp functions 783 ⟩

797. Rights Temp (rghtstmp.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Rights Temp.h and Rights Temp.cpp.

⟨ rghtstmp.web 797 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

798. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

799. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

800. Include files. ⟨ Include files 20 ⟩ +≡ #include

801. Rights Temp class declaration.

Log

[LDF 2006.06.22.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Rights Temp 801 ⟩ ≡ class Rights Temp : public CRecordset { public: long m rights id ;

CStringA m dc rights ;

⟨ Declare Rights Temp functions 803 ⟩ };

This code is used in section 816.

802. Functions.

803. Constructor. ⟨ Declare Rights Temp functions 803 ⟩ ≡

Rights Temp(CDatabase ∗pDatabase = NULL); (Rights Temp)

See also sections 805, 807, 809, 811, and 813. This code is used in section 801.

804. ⟨ Define Rights Temp functions 804 ⟩ ≡

(Rights Temp, CRecordset) Rights Temp ::Rights Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m rights id = 0;

m dc rights = ;

m nFields = 2;

m nDefaultType = dynaset ; }

See also sections 806, 808, 810, 812, and 814. This code is used in section 817.

805. Get default connect. [LDF 2006.06.22.] ⟨ Declare Rights Temp functions 803 ⟩ +≡

virtual CString GetDefaultConnect ( );

806. ⟨ Define Rights Temp functions 804 ⟩ +≡

CString Rights Temp ::GetDefaultConnect ( ) {

return ( ); }

807. Standard-SQL for Recordset. [LDF 2006.06.22.] ⟨ Declare Rights Temp functions 803 ⟩ +≡

virtual CString GetDefaultSQL( );

808. ⟨ Define Rights Temp functions 804 ⟩ +≡

CString Rights Temp ::GetDefaultSQL( ) {

return ( ); }

809. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.22.] ⟨ Declare Rights Temp functions 803 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 810. ⟨ Define Rights Temp functions 804 ⟩ +≡

void Rights Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m rights id ); RFX Text (pFX , ( ), m dc rights , 1024);

}

811. Assert Valid. [LDF 2006.06.22.] ⟨ Declare Rights Temp functions 803 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

812. ⟨ Define Rights Temp functions 804 ⟩ +≡ #ifdef

void Rights Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

813. Dump. [LDF 2006.06.22.] ⟨ Declare Rights Temp functions 803 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

814. ⟨ Define Rights Temp functions 804 ⟩ +≡ #ifdef

void Rights Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

815. Putting Rights Temp together.

816. This is what gets written to rghtstmp.h. ⟨ 816 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Rights Temp 801 ⟩

§817  IWF Metadata Harvester I  PUTTING RIGHTS TEMP TOGETHER 211

817. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Rights Temp functions 804 ⟩

818. Types Temp (typestmp.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Types Temp.h and Types Temp.cpp.

⟨ typestmp.web 818 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

819. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

820. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

821. Include files. ⟨ Include files 20 ⟩ +≡ #include

822. Types Temp class declaration.

Log

[LDF 2006.06.22.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Types Temp 822 ⟩ ≡ class Types Temp : public CRecordset { public: long m type id ;

CStringA m dc type;

⟨ Declare Types Temp functions 824 ⟩ };

This code is used in section 837.

823. Functions.

824. Constructor. ⟨ Declare Types Temp functions 824 ⟩ ≡

Types Temp(CDatabase ∗pDatabase = NULL); (Types Temp)

See also sections 826, 828, 830, 832, and 834. This code is used in section 822.

825. ⟨ Define Types Temp functions 825 ⟩ ≡

(Types Temp, CRecordset) Types Temp ::Types Temp(CDatabase ∗pdb) : CRecordset(pdb) {

m type id = 0;

m dc type = ;

m nFields = 2;

m nDefaultType = dynaset ; }

See also sections 827, 829, 831, 833, and 835. This code is used in section 838.

826. Get default connect. [LDF 2006.06.22.] ⟨ Declare Types Temp functions 824 ⟩ +≡

virtual CString GetDefaultConnect ( );

827. ⟨ Define Types Temp functions 825 ⟩ +≡

CString Types Temp ::GetDefaultConnect ( ) {

return ( ); }

828. Standard-SQL for Recordset. [LDF 2006.06.22.] ⟨ Declare Types Temp functions 824 ⟩ +≡

virtual CString GetDefaultSQL( );

829. ⟨ Define Types Temp functions 825 ⟩ +≡

CString Types Temp ::GetDefaultSQL( ) {

return ( ); }

830. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.22.] ⟨ Declare Types Temp functions 824 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 831. ⟨ Define Types Temp functions 825 ⟩ +≡

void Types Temp ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m type id ); RFX Text (pFX , ( ), m dc type, 1023);

}

832. Assert Valid. [LDF 2006.06.22.] ⟨ Declare Types Temp functions 824 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

833. ⟨ Define Types Temp functions 825 ⟩ +≡ #ifdef

void Types Temp ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

834. Dump. [LDF 2006.06.22.] ⟨ Declare Types Temp functions 824 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

835. ⟨ Define Types Temp functions 825 ⟩ +≡ #ifdef

void Types Temp ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

836. Putting Types Temp together.

837. This is what gets written to typestmp.h. ⟨ 837 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Types Temp 822 ⟩

214  PUTTING TYPES TEMP TOGETHER  IWF Metadata Harvester I §838

838. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Types Temp functions 825 ⟩

839. Temp IDs (tempids.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Temp IDs.h and Temp IDs.cpp.

⟨ tempids.web 839 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

840. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

841. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

842. Include files. ⟨ Include files 20 ⟩ +≡ #include

843. Temp IDs class declaration.

Log

[LDF 2006.06.20.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Temp IDs 843 ⟩ ≡ class Temp IDs : public CRecordset { public: long m temp id ;

⟨ Declare Temp IDs functions 845 ⟩ };

This code is used in section 858.

844. Functions.

845. Constructor. ⟨ Declare Temp IDs functions 845 ⟩ ≡

Temp IDs(CDatabase ∗pDatabase = NULL); (Temp IDs)

See also sections 847, 849, 851, 853, and 855. This code is used in section 843.

846. ⟨ Define Temp IDs functions 846 ⟩ ≡

(Temp IDs, CRecordset) Temp IDs ::Temp IDs(CDatabase ∗pdb) : CRecordset(pdb) {

m temp id = 0;

m nFields = 1;

m nDefaultType = dynaset ; }

See also sections 848, 850, 852, 854, and 856. This code is used in section 859.

847. Get default connect. [LDF 2006.06.20.] ⟨ Declare Temp IDs functions 845 ⟩ +≡

virtual CString GetDefaultConnect ( );

848. ⟨ Define Temp IDs functions 846 ⟩ +≡

CString Temp IDs ::GetDefaultConnect ( ) {

return ( ); }

849. Standard-SQL for Recordset. [LDF 2006.06.20.] ⟨ Declare Temp IDs functions 845 ⟩ +≡

virtual CString GetDefaultSQL( );

850. ⟨ Define Temp IDs functions 846 ⟩ +≡

CString Temp IDs ::GetDefaultSQL( ) {

return ( ); }

851. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.20.] ⟨ Declare Temp IDs functions 845 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 852. ⟨ Define Temp IDs functions 846 ⟩ +≡

void Temp IDs ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m temp id );

}

853. Assert Valid. [LDF 2006.06.20.] ⟨ Declare Temp IDs functions 845 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

854. ⟨ Define Temp IDs functions 846 ⟩ +≡ #ifdef

void Temp IDs ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

855. Dump. [LDF 2006.06.20.] ⟨ Declare Temp IDs functions 845 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

856. ⟨ Define Temp IDs functions 846 ⟩ +≡ #ifdef

void Temp IDs ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

857. Putting Temp IDs together.

858. This is what gets written to tempids.h. ⟨ 858 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Temp IDs 843 ⟩

§859  IWF Metadata Harvester I  PUTTING TEMP IDS TOGETHER 217

859. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Temp IDs functions 846 ⟩

860. Temp IDs 1 (tempids1.web).

Log

[LDF 2006.10.05.] Created this file. It contains code formerly in Temp IDs 1.h and Temp IDs 1.cpp.

⟨ tempids1.web 860 ⟩ ≡ /∗ Empty section for use in cross-references. ∗/

This code is cited in sections 7 and 9. This code is used in section 881.

861. Preprocessor macro calls. ⟨ Preprocessor macro calls 17 ⟩ +≡ #pragma once

862. using declarations for namespaces. ⟨ using declarations for namespaces 505 ⟩ +≡

using namespace std;

863. Include files. ⟨ Include files 20 ⟩ +≡ #include

864. Temp IDs 1 class declaration.

Log

[LDF 2006.06.30.] Added this declaration. It was generated by Visual Studio.

⟨ Declare class Temp IDs 1 864 ⟩ ≡ class Temp IDs 1 : public CRecordset { public: long m temp id ;

⟨ Declare Temp IDs 1 functions 866 ⟩ };

This code is used in section 879.

865. Functions.

866. Constructor. ⟨ Declare Temp IDs 1 functions 866 ⟩ ≡

Temp IDs 1(CDatabase ∗pDatabase = NULL); (Temp IDs 1)

See also sections 868, 870, 872, 874, and 876. This code is used in section 864.

867. ⟨ Define Temp IDs 1 functions 867 ⟩ ≡

(Temp IDs 1, CRecordset) Temp IDs 1 ::Temp IDs 1(CDatabase ∗pdb) : CRecordset(pdb) {

m temp id = 0;

m nFields = 1;

m nDefaultType = dynaset ; }

See also sections 869, 871, 873, 875, and 877. This code is used in section 880.

868. Get default connect. [LDF 2006.06.30.] ⟨ Declare Temp IDs 1 functions 866 ⟩ +≡

virtual CString GetDefaultConnect ( );

869. ⟨ Define Temp IDs 1 functions 867 ⟩ +≡

CString Temp IDs 1 ::GetDefaultConnect ( ) {

return ( ); }

870. Standard-SQL for Recordset. [LDF 2006.06.30.] ⟨ Declare Temp IDs 1 functions 866 ⟩ +≡

virtual CString GetDefaultSQL( );

871. ⟨ Define Temp IDs 1 functions 867 ⟩ +≡

CString Temp IDs 1 ::GetDefaultSQL( ) {

return ( ); }

872. Do Field Exchange. RFX-Unterstützung. [LDF 2006.06.30.] ⟨ Declare Temp IDs 1 functions 866 ⟩ +≡

virtual void DoFieldExchange(CFieldExchange ∗pFX ); 873. ⟨ Define Temp IDs 1 functions 867 ⟩ +≡

void Temp IDs 1 ::DoFieldExchange(CFieldExchange ∗pFX )

{ pFX SetFieldType(CFieldExchange ::outputColumn); RFX Long (pFX , ( ), m temp id );

}

874. Assert Valid. [LDF 2006.06.30.] ⟨ Declare Temp IDs 1 functions 866 ⟩ +≡ #ifdef

virtual void AssertValid ( ) const; #endif

875. ⟨ Define Temp IDs 1 functions 867 ⟩ +≡ #ifdef

void Temp IDs 1 ::AssertValid ( ) const

{

CRecordset ::AssertValid ( ); }

#endif

876. Dump. [LDF 2006.06.30.] ⟨ Declare Temp IDs 1 functions 866 ⟩ +≡ #ifdef

virtual void Dump(CDumpContext &dc) const; #endif

877. ⟨ Define Temp IDs 1 functions 867 ⟩ +≡ #ifdef

void Temp IDs 1 ::Dump(CDumpContext &dc) const {

CRecordset ::Dump(dc); }

#endif

878. Putting Temp IDs 1 together.

879. This is what gets written to tempids1.h. ⟨ 879 ⟩ ≡

⟨ Preprocessor macro calls 17 ⟩

⟨ using declarations for namespaces 505 ⟩

⟨ Declare class Temp IDs 1 864 ⟩

880. This is what gets compiled.

⟨ Include files 20 ⟩

⟨ Define Temp IDs 1 functions 867 ⟩

220  PUTTING TEMP IDS 1 TOGETHER  IWF Metadata Harvester I §881

881. This section just prevents CWEAVE from issuing warning messages, which would happen if these empty sections weren’t included somewhere. [LDF 2006.09.27.] ⟨ Dummy sections 15 ⟩ +≡

⟨ Special character formatting 11 ⟩

⟨ atest.web 50 ⟩
⟨ atestdoc.web 75 ⟩
⟨ atstview.web 96 ⟩
⟨ cntrbtmp.web 608 ⟩
⟨ cntrbtrs.web 587 ⟩
⟨ creators.web 545 ⟩
⟨ crtrstmp.web 566 ⟩
⟨ dialog1a.web 130 ⟩
⟨ dialog2a.web 208 ⟩
⟨ dscrptmp.web 671 ⟩
⟨ glblfncs.web 294 ⟩
⟨ identtmp.web 734 ⟩
⟨ langtmp.web 755 ⟩
⟨ mainfrm.web 28 ⟩
⟨ mtdtsrc.web 312 ⟩
⟨ pblshtmp.web 776 ⟩
⟨ rcrdstmp.web 524 ⟩
⟨ records.web 503 ⟩
⟨ resource.web 12 ⟩
⟨ rghtstmp.web 797 ⟩
⟨ sbjcttmp.web 713 ⟩
⟨ selector.web 379 ⟩
⟨ spchrtbl.web 10 ⟩
⟨ stdafx.web 16 ⟩
⟨ subjects.web 692 ⟩
⟨ tempids.web 839 ⟩
⟨ tempids1.web 860 ⟩
⟨ titles.web 629 ⟩
⟨ ttlstmp.web 650 ⟩
⟨ typestmp.web 818 ⟩

882. GNU General Public License. [LDF 2006.10.23.]

GNU GENERAL PUBLIC LICENSE Version 2, June 1991

Copyright \begin{matrix}c \\ ◯ \end{matrix} 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software–to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation’s software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

§882  IWF Metadata Harvester I  GNU GENERAL PUBLIC LICENSE 221

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author’s protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors’ reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone’s free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The “Program”, below, refers to any such program or work, and a “work based on the Program” means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term “modification”.) Each licensee is addressed as “you”.

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

222  GNU GENERAL PUBLIC LICENSE  IWF Metadata Harvester I §882

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients’ exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and “any later version”, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTH-ERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IM-PLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABIL-ITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFEC-TIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR RE-DISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PRO-GRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

⟨one line to give the program’s name and a brief idea of what it does.⟩

Copyright (C) ⟨year⟩ ⟨name of author⟩

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WAR-RANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright \begin{matrix}c \\ ◯ \end{matrix} year name of author

Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’.

This is free software, and you are welcome to redistribute it under certain conditions; type ‘show c’ for details.

The hypothetical commands ‘show w’ and ‘show c’ should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than ‘show w’ and ‘show c’; they could even be mouse-clicks or menu items–whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a “copyright disclaimer” for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright interest in the program ‘Gnomovision’ (which makes passes at compilers) written by James Hacker.

⟨signature of Ty Coon⟩, 1 April 1989 Ty Coon, President of Vice

This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ⟨ GNU General Public License 882 ⟩ ≡ /∗ This section contains no C^{++} code. ∗/

This code is cited in section 2. This code is used in section 884.

883. GNU Free Documentation License. [LDF 2006.10.23.]

GNU Free Documentation License Version 1.2, November 2002

Copyright \begin{matrix}c \\ ◯ \end{matrix} 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other functional and useful document “free” in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a worldwide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

226  GNU FREE DOCUMENTATION LICENSE  IWF Metadata Harvester I §883

A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.

Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text.

A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.

The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

2. VERBATIM COPYING

§883  IWF Metadata Harvester I  GNU FREE DOCUMENTATION LICENSE 227

You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and you may publicly display copies.

3. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers.

If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles.

You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties–for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements”.

6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

8. TRANSLATION

Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.

230  INDEX  IWF Metadata Harvester I §885

ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

Copyright \begin{matrix}c \\ ◯ \end{matrix} YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License”.

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with...Texts.” line with this:

with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. ⟨ GNU Free Documentation License 883 ⟩ ≡ /∗ This section contains no C^{++} code. ∗/

This code is cited in section 2. This code is used in section 884.

884. Include sections without C^{++} code. These sections contain no code, or only commented-out code. However, they must be included somewhere, or CWEAVE will issue warnings. [LDF 2006.09.27.]

⟨ Dummy sections 15 ⟩

⟨ GNU General Public License 882 ⟩

⟨ GNU Free Documentation License 883 ⟩

885. Index.

: 74. : \underline{18}. : 20. : \underline{14}. : \underline{14}. : \underline{14}. : \underline{14}. : \underline{18}. : 31, 41, 42, 43, 44, 51, 76, 89, 90, 91, 92,

99, 107, 112, 113, 114, 115, 517, 518, 519, 520, 538, 539, 540, 541, 559, 560, 561, 562, 580, 581, 582, 583, 601, 602, 603, 604, 622, 623, 624, 625, 643, 644, 645, 646, 664, 665, 666, 667, 685, 686, 687, 688, 706, 707, 708, 709, 727, 728, 729, 730, 748, 749, 750, 751, 769, 770, 771, 772, 790, 791, 792, 793, 811, 812, 813, 814, 832, 833, 834, 835, 853, 854, 855, 856, 874, 875, 876, 877.

stricmp: 360, 369. strnicmp: 361, 364. : 62, 136, 200, 217, 302, 512, 514, 516, 533, 535, 537, 554, 556, 558, 575, 577, 579, 596, 598, 600, 617, 619, 621, 638, 640, 642, 659, 661, 663, 680, 682, 684, 701, 703, 705, 722, 724, 726, 743, 745, 747, 764, 766, 768, 785, 787, 789, 806, 808, 810, 827, 829, 831, 848, 850, 852, 869, 871, 873.

temp: 440. : \underline{310}. : \underline{18}. : \underline{18}. : \underline{18}. aboutDlg : \underline{64}. AddDocTemplate: 62. AddRequestHeaders : 200, 302. afx msg: 45, 63, 123, 125, 148, 150, 152, 154,

156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 188, 190, 230, 232, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 274, 276, 278, 280, 282, 284, 286, 288.

AfxEnableControlContainer : 62.

AfxMesageBox : 452.

§885  IWF Metadata Harvester I  INDEX 231

AfxMessageBox : 62, 181, 184, 185, 187, 194, 195, 196, 197, 199, 200, 201, 202, 204, 233, 234, 235, 240, 242, 243, 270, 272, 275, 300, 301, 302, 303, 304, 306, 308, 328, 329, 330, 331, 332, 333, 334, 335, 337, 338, 339, 340, 343, 345, 346, 350, 351, 353, 357, 359, 360, 361, 362, 364, 366, 368, 369, 372, 373, 389, 390, 391, 398, 400, 408, 410, 414, 418, 419, 420, 421, 422, 425, 429, 430, 431, 433, 435, 443, 446, 448, 449, 450, 451, 453, 454, 455, 489, 496.

AfxOleInit : 62. AfxParseURL: 198, 199, 200, 299, 300, 301. : 177, 195, 196, 223, 256, \underline{384}, \underline{385},

393, 419, 489, 492, 494, 496, 498. : 14. : 14. ar : \underline{87}, \underline{88}. : 107. : 109. AssertValid : \underline{41}, \underline{42}, \underline{89}, \underline{90}, \underline{112}, \underline{113}, \underline{517}, \underline{518},

\underline{538}, \underline{539}, \underline{559}, \underline{560}, \underline{580}, \underline{581}, \underline{601}, \underline{602}, \underline{622}, \underline{623}, \underline{643}, \underline{644}, \underline{664}, \underline{665}, \underline{685}, \underline{686}, \underline{706}, \underline{707}, \underline{727}, \underline{728}, \underline{748}, \underline{749}, \underline{769}, \underline{770}, \underline{790}, \underline{791}, \underline{811}, \underline{812}, \underline{832}, \underline{833}, \underline{853}, \underline{854}, \underline{874}, \underline{875}.

atest.web: 6, 9, \underline{50}.
atestdoc.web: 6, 9, \underline{75}.
atstview.web: 6, 9, \underline{96}.

b: \underline{194}, \underline{298}, \underline{329}, \underline{388}. : 217, 246, 248, 250, 254,

\underline{384}, \underline{385}, 402. begin: 308. : 48, 57, 71, 94, 128, 192, 290. BOOL: 39, 40, 61, 62, 85, 86, 110, 111, 117, 118,

141, 142, 182, 194, 212, 220, 221, 298, 327, 328, 329, 352, 388, 401, 417, 418.

brace ctr : \underline{339}. : 142, 143, 144, 222, 223, 224. buff : \underline{201}, 202, 204, \underline{233}, 236, 237, 238, \underline{303}, 304. : \underline{201}, 202, 203, \underline{303}. BUG FIX: 203, 232, 269, 274, 280, 282, 286,

288, 405, 432, 440. c str : 181, 184, 185, 187, 194, 195, 196, 197, 199,

200, 201, 202, 204, 233, 234, 235, 240, 242, 243, 270, 272, 273, 275, 281, 283, 287, 289, 300, 301, 302, 303, 306, 308, 328, 329, 332, 333, 334, 335, 337, 338, 339, 340, 343, 345, 346, 350, 351, 353, 357, 359, 360, 361, 362, 364, 366, 368, 369, 372, 373, 389, 390, 391, 398, 399, 400, 405, 408, 410, 414, 418, 419, 420, 421, 422, 425, 429, 430, 431, 433, 435, 442, 443, 446, 448, 449, 450, 451, 452, 453, 454, 455, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 489, 492, 494, 496, 498.

CAboutDlg: 6, 9, 64, \underline{65}, 67, \underline{68}, 70, 71. CanTransact : 331, 391. CanUpdate: 330, 390. CArchive: 87, 88. CATestApp: 6, 9, \underline{54}, 55, 56, 57, 59, \underline{60}, 62, 64. CATestDoc: 6, 9, 62, \underline{79}, 81, \underline{82}, \underline{83}, \underline{84}, 86, 88,

90, 92, 94, 106, 107, 109. CATestView: 6, 9, 62, \underline{100}, 102, \underline{103}, \underline{104},

\underline{105}, 107, 109, 111, 113, 115, 118, 120, 122, 124, 126, 128.

: 46. : 46. : 46. : 46. : 46. : 46. CButton: 142, 143, 144, 182, 222, 223, 224, 273. CCommandLineInfo: 62. CDatabase: 328, 336, 337, 341, 342, 384, 440,

441, 509, 510, 530, 531, 551, 552, 572, 573, 593, 594, 614, 615, 635, 636, 656, 657, 677, 678, 698, 699, 719, 720, 740, 741, 761, 762, 782, 783, 803, 804, 824, 825, 845, 846, 866, 867.

CDataExchange: 69, 70, 139, 140, 227, 228. cdb: \underline{328}, 329, 330, 331, 332, 333, \underline{336}, \underline{337}, 339,

\underline{341}, \underline{342}, 346, \underline{384}, 388, 389, 390, 391, 396, 399, 405, 407, 421, 430, 432, \underline{440}, \underline{441}, 442, 492, 494, 496, 498.

CDBException: 329, 330, 331, 332, 339, 346,

389, 390, 391, 400, 422, 431, 443. CDC: 108, 109, 119, 120, 121, 122. CDialog: 65, 68, 70, 71, 133, 136, 140, 142, 192,

212, 217, 221, 226, 228, 290. CDialog 1: 130. CDocument: 79, 86, 90, 92, 94. CDumpContext: 43, 44, 91, 92, 114, 115, 519,

520, 540, 541, 561, 562, 582, 583, 603, 604, 624, 625, 645, 646, 666, 667, 687, 688, 708, 709, 729, 730, 750, 751, 771, 772, 792, 793, 813, 814, 834, 835, 855, 856, 876, 877.

CEdit: 181, 225, 233, 240, 270, 281, 283, 287, 289. CFieldExchange: 515, 516, 536, 537, 557, 558,

578, 579, 599, 600, 620, 621, 641, 642, 662, 663, 683, 684, 704, 705, 725, 726, 746, 747, 767, 768, 788, 789, 809, 810, 830, 831, 851, 852, 872, 873.

CFrameWnd: 32, 40, 42, 44, 46, 48. CHttpConnection: 194, 200, 298, 302. CHttpFile: 194, 298. CInternetSession: 194, 298. clear : 339, 346, 496. CListBox: 222, 223, 233, 270. close: 204, 304, 339, 340, 345, 346, 347, 402, 408,

410, 412, 424, 433, 435, 437, 493, 495, 497, 499. Close: 200, 204, 302, 304, 329, 330, 331, 332, 338,

339, 340, 343, 345, 346, 347, 396, 402, 406, 408, 410, 411, 413, 414, 415, 424, 425, 431, 432, 433, 435, 438, 443, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 492, 494, 496, 498.

CMainFrame: 6, 9, \underline{32}, 35, \underline{36}, \underline{37}, \underline{38}, 40,

42, 44, 46, 48, 62. cmd str : \underline{331}, \underline{338}, 339, \underline{343}, 346. cmdInfo: \underline{62}. CMutex: 24, 55.

cntrbtmp.web: 6, 9, \underline{608}.
cntrbtrs.web: 6, 9, \underline{587}.

command strm: \underline{194}, 196. const iterator: 308. contributor ctr : \underline{458}, 459, 461, 475, \underline{492}. contributor str : \underline{457}, 458, 461, 475, 484. contributor strm: \underline{384}, 442, 446, 457, 475, 484. Contributors: 7, 9, 384, \underline{591}, 593, 594, 596,

598, 600, 602, 604. contributors : \underline{384}. : 237, 238, 239, 287, \underline{384}, \underline{385}, 398,

401, 461, 475, 491, 493. contributors temp: \underline{384}, 404, 410, 415, 426, 431,

435, 438, 440, 443, 446, 459, 492. Contributors Temp: 7, 9, 384, \underline{612}, 614, 615,

617, 619, 621, 623, 625. copy strm: \underline{185}. copyright html str : \underline{24}, \underline{55}, 306, 401, 423, 492,

494, 496, 498. CPoint: 123, 124, 125, 126. CPrintInfo: 117, 118, 119, 120, 121, 122. Create: 46. CreateEx : 46. CREATESTRUCT: 39, 40, 110, 111. creator ctr : \underline{458}, 459, 462, 473, \underline{494}. creator str : \underline{457}, 458, 462, 473, 484. creator strm: \underline{384}, 442, 447, 457, 473, 484. creators : \underline{384}. : 237, 238, 239, 283, \underline{384}, \underline{385}, 398, 401,

419, 462, 473, 493, 495. Creators: 7, 9, 384, \underline{549}, 551, 552, 554, 556,

558, 560, 562.

creators.web: 6, 9, \underline{545}.

Creators Temp: 7, 9, 384, \underline{570}, 572, 573, 575,

577, 579, 581, 583. creators temp: \underline{384}, 404, 410, 415, 426, 431, 435,

438, 440, 443, 447, 459, 494. CRecordset: 23, 405, 425, 432, 440, 507, 510,

518, 520, 528, 531, 539, 541, 549, 552, 560, 562, 570, 573, 581, 583, 591, 594, 602, 604, 612, 615, 623, 625, 633, 636, 644, 646, 654, 657, 665, 667, 675, 678, 686, 688, 696, 699, 707, 709, 717, 720, 728, 730, 738, 741, 749, 751, 759, 762, 770, 772, 780, 783, 791, 793, 801, 804, 812, 814, 822, 825, 833, 835, 843, 846, 854, 856, 864, 867, 875, 877.

                                               crtrstmp.web: 6, 9, \underline{566}.

cs : \underline{39}, \underline{40}, \underline{110}, \underline{111}.

CSingleDocTemplate: 62.

CStatusBar: 32.

CString: 133, 194, 212, 236, 240, 298, 397, 398, 456, 457, 511, 512, 513, 514, 532, 533, 534, 535, 553, 554, 555, 556, 574, 575, 576, 577, 595, 596, 597, 598, 616, 617, 618, 619, 637, 638, 639, 640, 658, 659, 660, 661, 679, 680, 681, 682, 700, 701, 702, 703, 721, 722, 723, 724, 742, 743, 744, 745, 763, 764, 765, 766, 784, 785, 786, 787, 805, 806, 807, 808, 826, 827, 828, 829, 847, 848, 849, 850, 868, 869, 870, 871.

CStringA: 507, 528, 549, 570, 591, 612, 633, 654, 675, 696, 717, 738, 759, 780, 801, 822. CTime: 133, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 181, 193, 194, 419, 487, 489, 490, 491, 507, 528.

ctime: \underline{193}, \underline{194}, 195, 196.

CTimeSpan: 153, 155, 157, 159, 161, 419,

489, 490. CToolBar: 32. curr char : \underline{339}, \underline{349}, 352, 353, 354, 355, 356, 357, 358, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374. curr metadata source: \underline{183}, 185, 187. curr pos : \underline{339}. curr record : \underline{328}, 329, 330, 331, 332, 333, \underline{336}, \underline{337}, 338, 339, 340, \underline{341}, \underline{342}, 343, 345, 346, 347, \underline{384}, 388, 396.

CView: 100, 111, 113, 115, 124, 126, 128.

CWinApp: 54, 57, 62. CWnd: 135, 136, 216, 217. : 512, 533, 554, 575, 596, 617, 638, 659, 680, 701, 722, 743, 764, 785, 806, 827, 848, 869.

date type str : \underline{419}, \underline{487}, 488, 489, 490, 491. day of month: \underline{133}, 159, 161, \underline{419}, \underline{487}, 490. day of week : \underline{133}, 155, 157, \underline{419}, \underline{487}, 489. : 144, 183, 185, 191, 196, \underline{316}, \underline{317}, 333, 338. : \underline{142}, 144. dc: \underline{43}, \underline{44}, \underline{91}, \underline{92}, \underline{114}, \underline{115}, \underline{519}, \underline{520}, \underline{540}, \underline{541}, \underline{561}, \underline{562}, \underline{582}, \underline{583}, \underline{603}, \underline{604}, \underline{624}, \underline{625}, \underline{645}, \underline{646}, \underline{666}, \underline{667}, \underline{687}, \underline{688}, \underline{708}, \underline{709}, \underline{729}, \underline{730}, \underline{750}, \underline{751}, \underline{771}, \underline{772}, \underline{792}, \underline{793}, \underline{813}, \underline{814}, \underline{834}, \underline{835}, \underline{855}, \underline{856}, \underline{876}, \underline{877}.

dc date: 444, 479. dc date str : \underline{457}, 479, 484. dc date strm: \underline{384}, 442, 444, 457, 484. : \underline{384}, \underline{385}, 479. DDX Check : 228. DDX Text : 140, 228. : 31, 51, 76, 99. : \underline{306}, \underline{308}. : 135, \underline{212}, 509, 530, 551, 572,

593, 614, 635, 656, 677, 698, 719, 740, 761, 782, 803, 824, 845, 866.

: 35, 81, 102. : 32, 54, 65, 79, 100,

133, 212. Delete: 329, 330, 331, 332, 339, 346, 389, 390,

391, 400, 422, 431, 443. delete old records : \underline{182}, 185, 186. delete tables : \underline{327}, \underline{328}, 332. description ctr : \underline{458}, 459, 463, 474. description str : \underline{457}, 463, 474, 484. description strm: \underline{384}, 442, 448, 457, 474, 484. : 236, 238, 239, \underline{384}, \underline{385}, 398,

401, 463, 474. Descriptions Temp: 7, 9, 384, \underline{675}, 677, 678,

680, 682, 684, 686, 688. descriptions temp: \underline{384}, 404, 410, 415, 426, 431,

435, 438, 443, 448, 459, 463. Dialog 1: 6, 9, 62, 124, 130, \underline{133}, 135, 136, \underline{137},

\underline{138}, 140, 142, 146, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 180, 181, 187, 189, 191, 192, 194, 204.

Dialog 2: 6, 9, 62, 126, \underline{212}, 216, 217, \underline{218}, \underline{219}, 221, 226, 228, 231, 233, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 275, 277, 279, 281, 283, 285, 287, 289, 290, \underline{383}, \underline{384}.

dialog1a.web: 6, 9, \underline{130}.
dialog2a.web: 6, 9, \underline{208}.

dlg 1 : \underline{62}, \underline{124}. dlg 2 : \underline{62}, \underline{126}. DockControlBar : 46. DoDataExchange: \underline{69}, \underline{70}, 130, \underline{139}, \underline{140}, \underline{227}, \underline{228}. DoFieldExchange: \underline{515}, \underline{516}, \underline{536}, \underline{537}, \underline{557}, \underline{558},

\underline{578}, \underline{579}, \underline{599}, \underline{600}, \underline{620}, \underline{621}, \underline{641}, \underline{642}, \underline{662}, \underline{663}, \underline{683}, \underline{684}, \underline{704}, \underline{705}, \underline{725}, \underline{726}, \underline{746}, \underline{747}, \underline{767}, \underline{768}, \underline{788}, \underline{789}, \underline{809}, \underline{810}, \underline{830}, \underline{831}, \underline{851}, \underline{852}, \underline{872}, \underline{873}.

DoModal : 62, 64, 124, 126. DoPreparePrinting : 118. download records : 133, 185, \underline{193}, \underline{194}, 204.

dscrptmp.web: 6, 9, \underline{671}.

Dump: \underline{43}, \underline{44}, \underline{91}, \underline{92}, \underline{114}, \underline{115}, \underline{519}, \underline{520}, \underline{540}, \underline{541}, \underline{561}, \underline{562}, \underline{582}, \underline{583}, \underline{603}, \underline{604}, \underline{624}, \underline{625},

\underline{645}, \underline{646}, \underline{666}, \underline{667}, \underline{687}, \underline{688}, \underline{708}, \underline{709}, \underline{729},
\underline{730}, \underline{750}, \underline{751}, \underline{771}, \underline{772}, \underline{792}, \underline{793}, \underline{813}, \underline{814},

\underline{834}, \underline{835}, \underline{855}, \underline{856}, \underline{876}, \underline{877}.

dwAccessType: \underline{194}, \underline{298}.

dwHttpRequestFlags : \underline{200}, \underline{302}. DWORD: 194, 200, 298, 302. dwRet : \underline{200}, \underline{302}. dwServiceType: \underline{194}, 198, 199, 200, \underline{298}, 299,

300, 301. dynaset : 425, 510, 531, 552, 573, 594, 615,

636, 657, 678, 699, 720, 741, 762, 783, 804, 825, 846, 867.

e: \underline{329}, \underline{330}, \underline{331}, \underline{332}, \underline{339}, \underline{346}, \underline{389}, \underline{390}, \underline{391},

\underline{400}, \underline{422}, \underline{431}, \underline{443}. edit 1 str : \underline{133}, 136, 140, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 181, 183, 185, 186, 187, 195, 196, 197.

EnableDocking : 46.

end : 308, 373, 429, 430, 496.

: 48, 57, 71, 94, 128, 192, 290. endl : 184, 185, 195, 196, 197, 199, 200, 202, 233, 234, 235, 236, 237, 238, 242, 270, 272, 275, 300, 301, 302, 303, 308, 329, 332, 334, 338, 339, 343, 345, 346, 350, 351, 353, 355, 357, 359, 366, 368, 369, 372, 373, 390, 391, 400, 401, 408, 410, 418, 419, 420, 422, 423, 431, 433, 435, 443, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 489, 492, 494, 496, 498.

eof : 339, 344, 346.

: 353, 355, 357, 366, 368, 369, 372.

erase: 461, 462, 463, 464, 465, 466, 467, 468,

469, 470. erase value: \underline{458}, 461, 462, 463, 464, 465, 466,

467, 468, 469, 470. errno: 242, 272, 389, 390, 391, 394. : 246, 248, 250, 254, \underline{384}, \underline{385}, 402. ExecuteSQL: 332, 339, 346, 399, 405, 421, 430,

442, 492, 494, 496, 498. exit : 149, 179, 231, 285. : 40, 62, 86, 146, 151, 153, 155, 157, 159,

161, 163, 165, 167, 169, 171, 173, 175, 177, 181, 182, 183, 185, 186, 187, 195, 196, 197, 217, 226, 240, 243, 273, 281, 283, 287, 289, 401.

false: 194, 298, 360. file length: \underline{201}, \underline{303}. fill table streams : 407, 408, 432, 433, \underline{440}, \underline{441}, 455. find : 339, 373, 428, 461, 462, 463, 464, 465, 466,

467, 468, 469, 470, 496. first : 308. first field : \underline{401}. font begin str : \underline{457}, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 472, 473, 474, 475, 476, 477, 478, 479, 480, 482, 483. font begin str len: \underline{457}, 461, 462, 463, 464, 465,

466, 467, 468, 469, 470. font begin str save: \underline{457}, 461, 462, 463, 464, 465,

466, 467, 468, 469, 470. font end str : \underline{457}, 461, 462, 463, 464, 465, 466,

467, 468, 469, 470, 472, 473, 474, 475, 476, 477, 478, 479, 480, 482, 483.

Format : 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 181, 195, 196, 419, 444, 445, 489, 490, 491.

get : 352, 355, 356, 362, 363, 365, 367, 368, 371. get http file: \underline{297}, \underline{298}, 304. GetCurrentTime: 151, 153, 155, 157, 159, 161,

163, 165, 167, 169, 171, 173, 175, 181, 419, 489, 490, 491.

GetCurSel : 270. GetDay : 159, 161, 419, 490. GetDayOfWeek : 155, 157, 419, 489. GetDefaultConnect : \underline{511}, \underline{512}, \underline{532}, \underline{533}, \underline{553}, \underline{554},

\underline{574}, \underline{575}, \underline{595}, \underline{596}, \underline{616}, \underline{617}, \underline{637}, \underline{638}, \underline{658}, \underline{659}, \underline{679}, \underline{680}, \underline{700}, \underline{701}, \underline{721}, \underline{722}, \underline{742}, \underline{743}, \underline{763}, \underline{764}, \underline{784}, \underline{785}, \underline{805}, \underline{806}, \underline{826}, \underline{827}, \underline{847}, \underline{848}, \underline{868}, \underline{869}.

GetDefaultSQL: \underline{513}, \underline{514}, \underline{534}, \underline{535}, \underline{555}, \underline{556}, \underline{576}, \underline{577}, \underline{597}, \underline{598}, \underline{618}, \underline{619}, \underline{639}, \underline{640}, \underline{660}, \underline{661}, \underline{681}, \underline{682}, \underline{702}, \underline{703}, \underline{723}, \underline{724}, \underline{744}, \underline{745}, \underline{765}, \underline{766}, \underline{786},

\underline{787}, \underline{807}, \underline{808}, \underline{828}, \underline{829}, \underline{849}, \underline{850}, \underline{870}, \underline{871}.

GetDlgItem: 142, 143, 144, 181, 182, 222, 223,

224, 225, 233, 240, 270, 273, 281, 283, 287, 289. GetDocument : \underline{106}, \underline{107}, 109. GetHttpConnection: 200, 302. GetLength: 201, 303, 457. GetMonth: 163, 419, 490. GetRecordCount : 401, 422, 425, 459, 463, 465,

466, 467, 468, 469, 470, 492, 494, 496, 498. GetSelItems : 233. GetState: 182, 273. GetText : 236. GetWindowText : 233. GetYear : 163, 165, 167, 169, 171, 173, 175,

419, 490, 491.

glblfncs.web: 6, 9, \underline{294}.

header datestamp: 445, 480. header datestamp str : \underline{457}, 480, 484. header datestamp strm: \underline{384}, 442, 445, 457, 484. : \underline{384}, \underline{385}, 480. html strm: \underline{384}, 401, 402, 407, 408, 409, 410, 412,

423, 424, 425, 432, 433, 434, 435, 437, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 491, 492, 493, 494, 495, 496, 497, 498, 499.

: 200, 302. : 200, 302. i: \underline{185}, \underline{201}, \underline{236}, \underline{362}.

id : \underline{315}, 321, 323, 332, 333, 334. : 57. : 57. : 57. : 128. : 128. : 128. : 57. : 33. : 33. : 33. : 33. : \underline{14}, 223, 290. : \underline{14}, 192. : \underline{14}, 222, 290. : \underline{14}, 228, 290. : \underline{14}. : \underline{14}, 290. : \underline{14}, 290. : \underline{14}, 144, 192. : \underline{14}, 142, 182. : \underline{14}, 290. : \underline{14}, 192. : \underline{14}, 290. : \underline{14}. : \underline{14}, 192, 290. : \underline{14}, 192. : \underline{14}, 192. : \underline{14}, 192. : \underline{14}, 192. : \underline{14}, 192. : \underline{14}, 192. : \underline{14}, 192, 290. : \underline{14}, 290. : \underline{14}, 290. : \underline{14}, 140, 181. : \underline{14}, 224, 273. : \underline{14}. : \underline{14}. : \underline{14}, 228, 240, 270, 281, 283, 287, 289. : \underline{14}, 290. : \underline{14}, 225, 228, 233. : \underline{14}, 222, 233. : \underline{14}, 290. : \underline{14}, 223, 270. : \underline{14}, 290. : \underline{14}, 192, 290. : \underline{14}, 192, 290. : \underline{14}, 192, 290. : \underline{14}, 143, 192. : \underline{14}, 142, 192.

: \underline{14}, 224, 290. : \underline{14}, 290. : \underline{14}, 290. : \underline{14}, 290. : \underline{14}, 192. : 192, 290. : 65, 68, 133, 136, 212, 217. : \underline{14}, 65. : \underline{14}, 133. : \underline{14}, 212. identifier ctr : \underline{458}, 459, 464, 477. identifier str : \underline{457}, 464, 477, 484. identifier strm: \underline{384}, 442, 449, 457, 477, 484. : 238, 239, \underline{384}, \underline{385}, 398, 401,

464, 477. identifiers temp: \underline{384}, 404, 410, 415, 426, 431,

435, 438, 443, 449, 459. Identifiers Temp: 7, 9, 384, \underline{738}, 740, 741, 743,

745, 747, 749, 751.

identtmp.web: 6, 9, \underline{734}.

: 192, 290. : \underline{14}, 62. IDR ATestTYPE : \underline{14}. : \underline{14}, 46, 62. ifstream: 338, 343, 348, 349, 350. : 217, 252, \underline{384}, \underline{385}, 398, 402. ignore case: \underline{212}, 217, 228, 252. iid : \underline{322}, \underline{323}. : \underline{136}, \underline{217}, \underline{510}, \underline{531}, \underline{552}, \underline{573},

\underline{594}, \underline{615}, \underline{636}, \underline{657}, \underline{678}, \underline{699}, \underline{720}, \underline{741}, \underline{762},

\underline{783}, \underline{804}, \underline{825}, \underline{846}, \underline{867}.

: 48, 94, 128. in file strm: \underline{338}, 339, 340, \underline{343}, 344, 345, 346, 347. in strm: \underline{348}, \underline{349}, \underline{350}, 352, 355, 356, 362, 363,

365, 367, 368, 371. indicators : \underline{33}, 46. init copyright strings : 61, 62, \underline{305}, \underline{306}. init special char encodings map: 61, 62, \underline{307}, \underline{308}. InitCommonControls : 62. InitInstance: \underline{61}, \underline{62}. insert : 429, 461, 462, 463, 464, 465, 466, 467,

468, 469, 470, 496. InsertString : 222, 223. : 200, 302. : 200, 302. INTERNET PORT: 194, 298. is open: 338, 343. IsEOF : 401, 405, 422, 425, 427, 446, 447, 448, 449,

450, 451, 452, 453, 454, 455, 492, 494, 496, 498. IsKindOf : 107. IsOpen: 329, 389, 396, 402, 406, 408, 410, 414. IsStoring : 88. items ctr : \underline{233}, 234, 235, 236. iter : \underline{308}, \underline{373}, \underline{427}, 428, 429, 430, \underline{457}, \underline{496}. iterator: 373, 427, 457, 496.

                                               langtmp.web: 6, 9, \underline{755}.

language ctr : \underline{458}, 459, 465, 481. language str : \underline{457}, 465, 481, 484. language strm: \underline{384}, 442, 450, 457, 481, 484. : 238, 239, \underline{384}, \underline{385}, 398, 401, 465. languages temp: \underline{384}, 404, 410, 415, 426, 431, 435,

438, 443, 450, 459, 465. Languages Temp: 7, 9, 384, \underline{759}, 761, 762,

764, 766, 768, 770, 772. : 161, 264, \underline{384}, \underline{385}, 393, 419, 490. : 157, \underline{384}, \underline{385}, 393, 419, 489. : 167, 258, \underline{384}, \underline{385}, 393, 419, 491. : 173, \underline{384}, \underline{385}, 393, 419, 491. : 169, \underline{384}, \underline{385}, 393, 419, 491. : 175, \underline{384}, \underline{385}, 393, 419, 491. : 171, \underline{384}, \underline{385}, 393, 419, 491. : 163, 262, \underline{384}, \underline{385}, 393, 419, 490. : 234, 236, 243, 270. : \underline{182}, 183, 187. length: 461, 462, 463, 464, 465, 466, 467, 468,

469, 470. list records : 273, \underline{417}, \underline{418}, 439. list table: 281, 283, 287, 289, \underline{485}, \underline{486}, \underline{499}. LoadStdProfileSettings : 62. LoadToolBar : 46. Lock : 308, 346. log file: 339, 346, 354, 355, 368, 369. log file mutex : \underline{24}, \underline{55}, 346. LPCREATESTRUCT: 45, 46. lpCreateStruct : \underline{45}, \underline{46}. LPCTSTR: 194, 297, 298, 299. m company id : \underline{780}, 783, 789. m contributor id : 446, 492, \underline{591}, 594, 600, \underline{612},

615, 621. m creator id : 447, 494, \underline{549}, 552, 558, \underline{570},

573, 579. m dc contributor : 446, 492, \underline{591}, 594, 600, \underline{612},

615, 621. m dc creator : 447, 494, \underline{549}, 552, 558, \underline{570},

573, 579. m dc date: 444, \underline{507}, 510, 516, \underline{528}, 531, 537.

m dc description: 448, \underline{675}, 678, 684.
m dc identifier : 449, \underline{738}, 741, 747.
m dc language: 450, \underline{759}, 762, 768.
m dc publisher : 451, \underline{780}, 783, 789.
m dc rights : 452, \underline{801}, 804, 810.
m dc subject : 453, 496, \underline{696}, 699, 705, \underline{717},

720, 726. m dc title: 454, 498, \underline{633}, 636, 642, \underline{654}, 657, 663. m dc type: 455, \underline{822}, 825, 831. m description id : 448, \underline{675}, 678, 684. m header datestamp: 445, \underline{507}, 510, 516, \underline{528},

531, 537. m header identifier : \underline{507}, 510, 516, \underline{528}, 531, 537. m header status : \underline{507}, 510, 516, \underline{528}, 531, 537. m identifier id : 449, \underline{738}, 741, 747. m institution id : \underline{549}, 552, 558, \underline{570}, 573, 579, \underline{591},

594, 600, \underline{612}, 615, 621, \underline{780}, 783, 789. m language id : 450, \underline{759}, 762, 768. m nDefaultType: 510, 531, 552, 573, 594, 615,

636, 657, 678, 699, 720, 741, 762, 783, 804, 825, 846, 867.

m nFields : 510, 531, 552, 573, 594, 615, 636, 657,

678, 699, 720, 741, 762, 783, 804, 825, 846, 867. m nRetCode: 332, 339, 346, 400, 422, 431, 443. m pDatabase: 328, 388. m pDocument : 107. m person id : \underline{549}, 552, 558, \underline{570}, 573, 579, \underline{591},

594, 600, \underline{612}, 615, 621, \underline{780}, 783, 789. m pMainWnd : 62. m publisher id : 451, \underline{780}, 783, 789. m record id : 407, 408, 432, 433, 442, \underline{507}, 510,

516, \underline{528}, 531, 537, \underline{633}, 636, 642, \underline{654}, 657, 663, \underline{675}, 678, 684.

m rights id : 452, \underline{801}, 804, 810. m strError : 329, 330, 331, 332, 339, 346, 389,

390, 391, 400, 422, 431, 443. m subject id : 453, \underline{696}, 699, 705, \underline{717}, 720, 726. m temp id : 405, 428, 429, 430, 492, 494, 496, 498,

\underline{843}, 846, 852, \underline{864}, 867, 873. m title id : 454, \underline{633}, 636, 642, \underline{654}, 657, 663. m type id : 455, \underline{822}, 825, 831. m wndStatusBar : \underline{32}, 46. m wndToolBar : \underline{32}, 46.

mainfrm.web: 6, 9, \underline{28}.

map: 24, 55, 308, 373, 384. : 182, \underline{316}, \underline{317}, 338, 343. : \underline{316}, \underline{317}, 349, 356, 359, 360. : 330, 331. message strm: \underline{194}, 197, 199, 200, 202, \underline{298}, 300,

301, 302, 303, \underline{349}, 350, 351, 353, 357, 359, 360, 366, 368, 369, 372, 373.

Metadata Source: 6, 9, 143, 144, 182, 183, 185, 189, 191, 195, 196, \underline{315}, 317, 320, \underline{321}, 322, \underline{323}, \underline{324}, \underline{325}, 328, 335, 337, 340, 341, 342, 347, 349, 375.

metadata source: \underline{133}, 136, 143, 144, 183, 184,

185, 189, 191, \underline{193}, \underline{194}, 195, 196, 197. month of year : \underline{133}, 163, \underline{419}, \underline{487}, 490. MoveFirst : 402, 425, 492, 494, 496, 498.

MoveNext : 401, 411, 422, 425, 430, 436, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 492, 494, 496, 498.

mtdtsrc.web: 6, 9, \underline{312}.

mutex. See CMutex: 3. nFlags : \underline{123}, \underline{124}, \underline{125}, \underline{126}. nIndex : 243. non search color str : \underline{457}, 461, 462, 463, 464, 465,

466, 467, 468, 469, 470. nPort : \underline{194}, 198, 199, 200, \underline{298}, 299, 300, 301, 302. npos : 461, 462, 463, 464, 465, 466, 467, 468,

469, 470. : \underline{316}, \underline{317}. : 181, \underline{384}, \underline{385}, 393, 419, 489. ODBC (Open Database Connectivity): 7. ofstream: 185, 201, 303, 384. : 192, 290. : 57, 128. : 48. : 128. : 128. : 128. OnAppAbout : 57, \underline{63}, \underline{64}. OnBeginPrinting : \underline{119}, \underline{120}. OnBnClickedAllDates : \underline{255}, \underline{256}, 290. OnBnClickedAllRecords : \underline{176}, \underline{177}, 192. OnBnClickedBegOrWholeWord : \underline{245}, \underline{246}, 290. OnBnClickedCancel : \underline{178}, \underline{179}, 192, \underline{284}, \underline{285}, 290. OnBnClickedCaseIgnore: \underline{251}, \underline{252}, 290. OnBnClickedContributors : \underline{286}, \underline{287}, 290. OnBnClickedCreators : \underline{282}, \underline{283}, 290. OnBnClickedDbt : \underline{190}, \underline{191}, 192. OnBnClickedDescending : \underline{274}, \underline{275}, 290. OnBnClickedDownload : \underline{180}, \underline{181}, \underline{187}, 192. OnBnClickedExactMatch: \underline{253}, \underline{254}, 290. OnBnClickedLastMonth: \underline{160}, \underline{161}, 192, \underline{263},

\underline{264}, 290. OnBnClickedLastWeek : \underline{156}, \underline{157}, 192. OnBnClickedLastYear : \underline{166}, \underline{167}, 192. OnBnClickedLast10Years : \underline{172}, \underline{173}, 192. OnBnClickedLast2Years : \underline{168}, \underline{169}, 192. OnBnClickedLast20Years : \underline{174}, \underline{175}, 192. OnBnClickedLast5Years : \underline{170}, \underline{171}, 192. OnBnClickedLast6Months : \underline{162}, \underline{163}, 192, \underline{261},

\underline{262}, 290. OnBnClickedListContributors : 287. OnBnClickedListCreators : 283. OnBnClickedListRecords : \underline{269}, \underline{270}, 273, 290. OnBnClickedListTitles : \underline{280}, \underline{281}, 290. OnBnClickedOk : \underline{148}, \underline{149}, 192, \underline{230}, \underline{231}, 290. OnBnClickedSearch: \underline{232}, \underline{233}, 244, 290. OnBnClickedSinceLastYear : \underline{257}, \underline{258}, 290.

OnBnClickedSubjects : \underline{288}, \underline{289}, 290. OnBnClickedThisMonth: \underline{158}, \underline{159}, 192, \underline{265},

\underline{266}, 290. OnBnClickedThisWeek : \underline{154}, \underline{155}, 192, \underline{267},

\underline{268}, 290. OnBnClickedThisYear : \underline{164}, \underline{165}, 192, \underline{259}, \underline{260},

290. OnBnClickedTimms : \underline{188}, \underline{189}, 192. OnBnClickedToday : \underline{150}, \underline{151}, 192. OnBnClickedUseDcDate: \underline{276}, \underline{277}, 290. OnBnClickedUseHeaderDatestamp: \underline{278}, \underline{279}, 290. OnBnClickedWholeOrPartialWord : \underline{249}, \underline{250}, 290. OnBnClickedWholeWordOnly : \underline{247}, \underline{248}, 290. OnBnClickedYesterday : \underline{152}, \underline{153}, 192. OnCancel : 179, 285. once: 17, 30, 52, 77, 98, 132, 210, 314, 381, 504,

525, 546, 567, 588, 609, 630, 651, 672, 693, 714, 735, 756, 777, 798, 819, 840, 861.

OnCreate: \underline{45}, \underline{46}. OnDraw : \underline{108}, \underline{109}. OnEndPrinting : \underline{121}, \underline{122}. OnFileNew : 57. OnFileOpen: 57. OnFilePrint : 128. OnFilePrintPreview : 128. OnFilePrintSetup: 57. OnInitDialog : \underline{141}, \underline{142}, 146, \underline{220}, \underline{221}, 226. OnLButtonDown: \underline{123}, \underline{124}. OnNewDocument : \underline{85}, \underline{86}. OnOK : 149, 231. OnPreparePrinting : \underline{117}, \underline{118}. OnRButtonDown: \underline{125}, \underline{126}. Open: 328, 388, 401, 404, 407, 422, 425, 426, 432,

446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 492, 494, 496, 498.

open: 201, 303, 338, 401, 423, 491, 493, 495, 497. Open Database Connectivity (ODBC): 7. OpenRequest : 200, 302. out str : \underline{348}, \underline{349}, 351, 360, 365, 366, 368,

369, 373, 374. out strm: \underline{201}, 202, 204, \underline{303}, 304. outputColumn: 516, 537, 558, 579, 600, 621,

642, 663, 684, 705, 726, 747, 768, 789, 810, 831, 852, 873.

parse record : 312, 339, 344, \underline{348}, \underline{349}, 375. ParseCommandLine: 62.

pblshtmp.web: 6, 9, \underline{776}.

pBT : \underline{142}, 143, 144, \underline{182}, \underline{222}, 223, 224, \underline{273}. pDatabase: \underline{509}, \underline{530}, \underline{551}, \underline{572}, \underline{593}, \underline{614}, \underline{635}, \underline{656},

\underline{677}, \underline{698}, \underline{719}, \underline{740}, \underline{761}, \underline{782}, \underline{803}, \underline{824}, \underline{845}, \underline{866}. pdb: \underline{510}, \underline{531}, \underline{552}, \underline{573}, \underline{594}, \underline{615}, \underline{636}, \underline{657}, \underline{678},

\underline{699}, \underline{720}, \underline{741}, \underline{762}, \underline{783}, \underline{804}, \underline{825}, \underline{846}, \underline{867}.

pDC : \underline{108}, \underline{109}, \underline{119}, \underline{120}, \underline{121}, \underline{122}.
pDoc: \underline{109}.
pDocTemplate: \underline{62}.
pDX : \underline{69}, \underline{70}, \underline{139}, \underline{140}, \underline{227}, \underline{228}.
pEB : \underline{225}, \underline{233}.
pFile: \underline{194}, 200, 201, 202, \underline{298}, 302, 303.
pFX : \underline{515}, \underline{516}, \underline{536}, \underline{537}, \underline{557}, \underline{558}, \underline{578}, \underline{579}, \underline{599},

\underline{600}, \underline{620}, \underline{621}, \underline{641}, \underline{642}, \underline{662}, \underline{663}, \underline{683}, \underline{684}, \underline{704}, \underline{705}, \underline{725}, \underline{726}, \underline{746}, \underline{747}, \underline{767}, \underline{768}, \underline{788}, \underline{789}, \underline{809}, \underline{810}, \underline{830}, \underline{831}, \underline{851}, \underline{852}, \underline{872}, \underline{873}.

pInfo: \underline{117}, \underline{118}, \underline{119}, \underline{120}, \underline{121}, \underline{122}.
pLB : \underline{222}, 223, \underline{233}, 236.
point : \underline{123}, \underline{124}, \underline{125}, \underline{126}.
pos : \underline{457}, 461, 462, 463, 464, 465, 466, 467,

468, 469, 470. pParent : \underline{135}, \underline{136}, \underline{216}, \underline{217}. : 194, 298. PreCreateWindow : \underline{39}, \underline{40}, \underline{110}, \underline{111}. prefix str : \underline{338}, 339, \underline{343}, 346. prefix str 1 : \underline{338}, 339, \underline{343}, 346. ProcessShellCommand : 62. pServer : \underline{194}, 200, \underline{298}, 302. pszURL: \underline{194}, 195, 196, 198, \underline{297}, \underline{298}, \underline{299}. publisher ctr : \underline{458}, 459, 466, 478. publisher str : \underline{457}, 466, 478, 484. publisher strm: \underline{384}, 442, 451, 457, 478, 484. : 238, 239, \underline{384}, \underline{385}, 398, 401,

466, 478. publishers temp: \underline{384}, 404, 410, 415, 426, 431, 435,

438, 443, 451, 459, 466. Publishers Temp: 7, 9, 384, \underline{780}, 782, 783,

785, 787, 789, 791, 793. : \underline{384}, \underline{385}, 434, 470, 472, 473, 474, 475, 476, 477, 478, 479, 480, 482, 483.

: \underline{384}, \underline{385}.

: \underline{384}, \underline{385}, 409, 460, 470.

query type: \underline{384}, \underline{456}, \underline{457}, 460, 470, 472, 473, 474, 475, 476, 477, 478, 479, 480, 482, 483.

QueryInfoStatusCode: 200, 302.

                                               rcrdstmp.web: 6, 9, \underline{524}.

Read : 202, 303. record : 353, 355. record ctr : \underline{339}, \underline{344}, 346, \underline{401}, 402, 416, \underline{422},

424, 425, 439. record str : \underline{338}, 339, \underline{343}, 344, 346.

records : \underline{384}.

Records: 7, 9, 328, 336, 337, 341, 342, 384, \underline{507},

509, 510, 512, 514, 516, 518, 520.

                                               records.web: 6, 9, \underline{503}.

records file name: \underline{133}, \underline{193}, \underline{194}, 201, \underline{315}, \underline{327}, \underline{328}, 332, 333, \underline{336}, \underline{337}, 338, \underline{341}, \underline{342}, 343.

records file name strm: \underline{185}, 187.

Records Temp: 7, 9, 384, \underline{528}, 530, 531, 533,

535, 537, 539, 541. records temp: \underline{384}, 402, 405, 406, 407, 408, 410,

411, 414, 424, 426, 431, 432, 433, 435, 438, 442, 443, 444, 445.

replace: 339. replacement str : \underline{457}. Requery : 405, 432, 440, 446, 447, 448, 449, 450,

451, 452, 453, 454, 455.

resource.web: 6, 9, \underline{12}.

result box : \underline{181}, 183, 185, 186, 187, \underline{240}, 243, \underline{270},

273, \underline{281}, \underline{283}, \underline{287}, \underline{289}. result str : \underline{240}. results str : \underline{212}, 217, 228, 240, 243, 273, 281,

283, 287, 289. resumption token: \underline{182}, 183, 185, 187, \underline{193}, \underline{194},

195, 196, \underline{327}, \underline{328}, 332, 333, \underline{336}, \underline{337}, 339, \underline{341}, \underline{342}, 344, 345, 346, \underline{348}, \underline{349}, 362, 364.

ret val : \underline{183}, 185, \underline{194}, 201, 202, 203, \underline{240}, 243, \underline{270}, 273, \underline{281}, \underline{283}, \underline{287}, \underline{289}, \underline{303}, \underline{328}, 332, 333, \underline{338}, 339, \underline{343}, 344, 345, 346, \underline{398}, 407, 408, 409, 410, \underline{427}, 432, 433, 434, 435, \underline{486}, 492, 494, 496, 498, 499.

RFX Date: 516, 537. RFX Long : 516, 537, 558, 579, 600, 621, 642, 663,

684, 705, 726, 747, 768, 789, 810, 831, 852, 873. RFX Text : 516, 537, 558, 579, 600, 621, 642, 663,

684, 705, 726, 747, 768, 789, 810, 831.

rghtstmp.web: 6, 9, \underline{797}.

: 238, 239, \underline{384}, \underline{385}, 398, 401, 467, 483. rights ctr : \underline{458}, 459, 467, 483. rights str : \underline{457}, 467, 483, 484. rights strm: \underline{384}, 442, 452, 457, 483, 484. Rights Temp: 7, 9, 384, \underline{801}, 803, 804, 806,

808, 810, 812, 814. rights temp: \underline{384}, 404, 410, 415, 426, 431, 435,

438, 443, 452, 459, 467. : 62, 107.

sbjcttmp.web: 6, 9, \underline{713}.

search arg : \underline{398}. search color str : \underline{457}, 461, 462, 463, 464, 465,

466, 467, 468, 469, 470. search options : \underline{212}, 217, 233, 243, 246, 248, 250,

252, 254, \underline{397}, \underline{398}, 402. search str : \underline{212}, 217, 228, 233, 243, \underline{397}, \underline{398}, 401,

409, \underline{456}, \underline{457}, 460, 470. search str len: \underline{457}, 461, 462, 463, 464, 465, 466,

467, 468, 469, 470. second : 308, 373. select from database: 243, \underline{397}, \underline{398}, 416, 440. select value: \underline{212}, 217, 236, 237, 238, 239, 240, 243,

\underline{397}, \underline{398}, 401, 409, \underline{419}, 434, \underline{456}, \underline{457}, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 472, 473, 474, 475, 476, 477, 478, 479, 480, 482, 483.

selection str : \underline{236}, 239. selector : \underline{241}, 243, \underline{271}, 273, \underline{281}, \underline{283}, \underline{287}, \underline{289}. Selector: 6, 9, 145, 151, 153, 155, 157, 159, 161,

163, 165, 167, 169, 171, 173, 175, 177, 181, 195, 196, 217, 223, 236, 237, 238, 239, 241, 242, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 271, 272, 275, 277, 279, 281, 283, 287, 289, \underline{384}, 385, 387, \underline{388}, 394, 395, \underline{396}, 398, 416, 418, 439, 440, 441, 455, 457, 484, 486, 499.

selector.web: 6, 9, \underline{379}.

SendRequest : 200, 302. Serialize: \underline{87}, \underline{88}. session: \underline{194}, 200, 204, \underline{298}, 302, 304. set: 427, 496. SetAbsolutePosition: 496, 498. SetCheck : 142, 143, 144, 222, 223, 224. SetCurSel : 223. SetFieldType: 516, 537, 558, 579, 600, 621,

642, 663, 684, 705, 726, 747, 768, 789, 810, 831, 852, 873.

SetFocus : 225. SetIndicators : 46. SetLoginTimeout : 328. SetQueryTimeout : 328. SetRegistryKey : 62. SetSel : 222. ShowWindow : 62. size type: 339, 457, 458. skipping : \underline{352}, 353, 354, 360, 364, 365, 369. : 223, 275, \underline{384}, \underline{385}, 420, 423. sort box : \underline{270}. : 275, \underline{384}, \underline{385}, 420, 488. sort field : \underline{212}, 217, 270, 273, \underline{417}, \underline{418}, 419, 423,

424, 425, 428, 430. : 270, \underline{384}, \underline{385}, 392, 419,

424, 425, 428, 430. : 270, \underline{384}, \underline{385}, 392, 419. : 270, \underline{384}, \underline{385},

392, 418, 419. sort field map: \underline{384}, 392, 423. : 270, \underline{384}, \underline{385}, 392,

418, 419. : 270, \underline{384}, \underline{385}, 392, 419. sort order : \underline{212}, 217, 223, 273, 275, 281, 283, 287,

289, \underline{417}, \underline{418}, 420, 423, \underline{485}, \underline{486}, 488. sort order str : \underline{488}, 492, 494, 498.

spchrtbl.web: 8, 9, \underline{10}.

special characters: 312. special char encodings map: \underline{24}, \underline{55}, 308, 373. special char encodings map mutex : \underline{24}, \underline{55}, 308. special str : \underline{349}, 371, 372, 373. sql strm: \underline{398}, 405, \underline{418}, 419, 420, 421, 422,

430, 432. start pos : \underline{339}. std: \underline{505}, \underline{526}, \underline{547}, \underline{568}, \underline{589}, \underline{610}, \underline{631}, \underline{652}, \underline{673},

\underline{694}, \underline{715}, \underline{736}, \underline{757}, \underline{778}, \underline{799}, \underline{820}, \underline{841}, \underline{862}.

stdafx.web: 6, 9, \underline{16}.

str : 181, 184, 185, 187, 194, 195, 196, 197, 199, 200, 201, 202, 204, 233, 234, 235, 240, 242, 243, 270, 272, 273, 275, 281, 283, 287, 289, 300, 301, 302, 303, 306, 308, 328, 329, 332, 333, 334, 335, 337, 338, 339, 340, 343, 345, 346, 350, 351, 353, 357, 359, 360, 361, 362, 364, 366, 368, 369, 372, 373, 389, 390, 391, 398, 399, 400, 405, 408, 410, 414, 418, 419, 420, 421, 422, 425, 429, 430, 431, 432, 433, 435, 442, 443, 446, 448, 449, 450, 451, 452, 453, 454, 455, 457, 484, 487, 489, 492, 494, 496, 498.

strcpy : 183, 185, 339, 344, 345, 355, 366, 367. string: 24, 55, 308, 331, 338, 339, 343, 348, 349,

373, 384, 419, 457, 458, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 487, 488.

strings : 458. stringstream: 181, 185, 194, 232, 233, 269, 270,

274, 275, 280, 281, 282, 283, 286, 287, 288, 289, 298, 306, 308, 328, 337, 343, 349, 384, 398, 418, 419, 487.

strlen: 187, 195, 196, 339, 345, 346. strlwr : 460, 461, 462, 463, 464, 465, 466, 467,

468, 469, 470. strObject : \underline{194}, 198, 199, 200, \underline{298}, 299, 300,

301, 302. strServerName: \underline{194}, 198, 199, 200, \underline{298}, 299,

300, 301, 302. sub update database dbt : 315, 327, 333, \underline{336},

\underline{337}, 340. sub update database timms : 315, 327, 332, \underline{341},

\underline{342}, 347. subject ctr : \underline{458}, 459, 468, 476, \underline{496}. subject str : \underline{457}, 468, 476, 484. subject strm: \underline{384}, 442, 453, 457, 476, 484. subjects : \underline{384}, 496. : 236, 238, 239, 289, \underline{384}, \underline{385}, 398,

401, 468, 476, 495, 497. Subjects: 7, 9, 384, \underline{696}, 698, 699, 701, 703,

705, 707, 709.

subjects.web: 6, 9, \underline{692}.

Subjects Temp: 7, 9, 384, \underline{717}, 719, 720, 722,

724, 726, 728, 730. subjects temp: \underline{384}, 404, 410, 415, 426, 431, 435,

438, 443, 453, 459, 468. substr : 339. suffix str : \underline{338}, 339, \underline{343}, 346. suppress duplicate records : \underline{212}, 217, 273, \underline{417},

\underline{418}, 424, 425, 428, 430. : 62. szHeaders : 200, 302. table: \underline{485}, \underline{486}, 491, 493, 495, 497, 499. tag ctr : \underline{349}, 355, 356, 358, 359, 360, 366,

367, 368, 369. tag str : \underline{349}, 355, 358, 360, 361, 364, 366, 367,

368, 369. : 46. : \underline{200}, \underline{302}. tellp: 472, 473, 474, 475, 476, 477, 478, 481,

482, 483. temp ctr : \underline{405}, 407, \underline{427}, 432. temp find str : \underline{458}, 461, 462, 463, 464, 465, 466,

467, 468, 469, 470. temp ids : \underline{384}, 401, 402, 405, 408, 410, 411, 413,

422, 424, 425, 427, 428, 429, 430, 431, 433, 435, 436, 438, 492, 494, 496, 498.

Temp IDs: 7, 9, 384, 401, \underline{843}, 845, 846, 848,

850, 852, 854, 856. temp ids 1 : \underline{384}, 425, 496. Temp IDs 1: 7, 9, 384, \underline{864}, 866, 867, 869,

871, 873, 875, 877. temp resumption token: \underline{338}, 339, \underline{343}, 344,

345, 346. temp search str : \underline{458}, 460, 461, 462, 463, 464, 465,

466, 467, 468, 469, 470. temp str : \underline{194}, 195, 196. temp strm: \underline{181}, 184, 185, 187, \underline{194}, 195, 196, 197,

201, 202, 204, \underline{232}, \underline{233}, 234, 235, 236, 237, 238, 240, 242, 243, \underline{269}, \underline{270}, 272, 273, \underline{274}, \underline{275}, \underline{280}, \underline{281}, \underline{282}, \underline{283}, \underline{286}, \underline{287}, \underline{288}, \underline{289}, \underline{298}, \underline{306}, \underline{308}, \underline{328}, 329, 332, 333, 334, 335, \underline{337}, 338, 339, 340, \underline{343}, 345, 346, \underline{349}, 361, 362, 364, 373, \underline{384}, 389, 390, 391, 398, 399, 400, 408, 410, 414, 418, 419, 420, 421, 422, 425, 429, 430, 431, 433, 435, 442, 443, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 489, 492, 494, 496, 498.

tempids.web: 6, 9, \underline{839}.
tempids1.web: 6, 9, \underline{860}.

theApp: \underline{55}, \underline{56}. this : 46. : 159, 266, \underline{384}, \underline{385}, 393, 419, 490. : 155, 268, \underline{384}, \underline{385}, 393, 419, 489. : 165, 260, \underline{384}, \underline{385}, 393, 419, 491. timespan: \underline{133}, 136, 145, 151, 153, 155, 157, 159,

161, 163, 165, 167, 169, 171, 173, 175, 177, 181, 185, 195, 196, \underline{212}, 217, 223, 256, 258, 260, 262, 264, 266, 268, 273, 281, 283, 287, 289, \underline{417}, \underline{418}, 419, 423, \underline{485}, \underline{486}, 489, 490,

491, 492, 494, 496, 498. timespan map: \underline{384}, 393, 423. timespan strm: \underline{419}, \underline{487}, 489, 490, 491, 492,

494, 496, 498. : 143, 183, 185, 189, 195, \underline{316}, \underline{317}, 332, 343. : \underline{142}, 143. title ctr : \underline{458}, 459, 469, 472, \underline{498}. title str : \underline{457}, 469, 472, 484. title strm: \underline{384}, 442, 454, 457, 472, 484. : 236, 238, 239, 281, \underline{384}, \underline{385}, 398, 401,

419, 469, 472, 497, 499. Titles: 7, 9, 384, \underline{633}, 635, 636, 638, 640,

642, 644, 646. titles : \underline{384}, 498.

titles.web: 6, 9, \underline{629}.

Titles Temp: 7, 9, 384, \underline{654}, 656, 657, 659,

661, 663, 665, 667. titles temp: \underline{384}, 404, 410, 415, 426, 431, 435,

438, 443, 454, 459, 469. TO DO: 307, 332, 362, 363. : 145, 151, 181, \underline{384}, \underline{385}, 393, 419, 489. : 46. true: 200, 301, 352, 354. : 40, 62, 86, 146, 182, 186, 217, 222, 226,

233, 273, 401, 425, 428, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470.

ttimespan: \underline{193}, \underline{194}.

ttlstmp.web: 6, 9, \underline{650}.

type ctr : \underline{458}, 459, 470, 482. type str : \underline{457}, 470, 482, 484. type strm: \underline{384}, 442, 455, 457, 482, 484. : 238, 239, \underline{384}, \underline{385}, 398, 401, 470, 482. types temp: \underline{384}, 404, 410, 415, 426, 431, 435,

438, 443, 455, 459, 470. Types Temp: 7, 9, 384, \underline{822}, 824, 825, 827,

829, 831, 833, 835.

typestmp.web: 6, 9, \underline{818}.

t0 : \underline{133}, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 181, 185, \underline{419}, \underline{487}, 489, 490, 491.

t1 : \underline{163}, \underline{165}, \underline{167}, \underline{169}, \underline{171}, \underline{173}, \underline{175}, \underline{419}, \underline{490}, \underline{491}. UCS (Universal Character Set): 11. UINT: 33, 46, 123, 124, 125, 126, 182, 194, 303. ULONGLONG: 201, 303. Unicode Transformation Format (UTF): 11. Universal Character Set (UCS): 11. Unlock : 308, 346. update database: 185, 315, \underline{327}, \underline{328}, \underline{335}. UpdateData: 151, 153, 155, 157, 159, 161, 163,

165, 167, 169, 171, 173, 175, 177, 181, 183, 185, 186, 187, 195, 196, 197, 240, 243, 273, 281, 283, 287, 289.

UpdateWindow : 62, 181, 183, 185, 186, 187, 240,

243, 273, 281, 283, 287, 289. use date type: \underline{212}, 217, 241, 271, 277, 279, 281,

283, 287, 289, \underline{384}, 388, 419, 488. : 217, 277, \underline{384}, \underline{385}, 388, 419, 488. : 279, \underline{384}, \underline{385}. used ids : \underline{427}, 428, 429, 430, \underline{496}. UTF (Unicode Transformation Format): 11. UTF-8 ((8-bit UCS (Universal Character

Set)/Unicode Transformation Format): 11. : \underline{18}. : 246, 248, 250, 254,

\underline{384}, \underline{385}, 402. : 246, 248, 250, 254, \underline{384},

\underline{385}, 402.

: \underline{18}. write: 202, 303. write html from stream: 435. write html from streams : 409, 410, 434, 435,

\underline{456}, \underline{457}, 484. : 46. : 46. : 153, \underline{384}, \underline{385}, 393, 419, 489.

IWF Metadata Harvester I NAMES OF THE SECTIONS 241

⟨ Declare global functions 297, 305, 307 ⟩ Used in section 311. ⟨ Declare CATestApp functions 59, 61, 63 ⟩ Used in section 54. ⟨ Declare CATestDoc functions 83, 85, 87, 89, 91 ⟩ Used in section 79. ⟨ Declare CATestView functions 104, 106, 108, 110, 112, 114, 123, 125 ⟩ Used in section 100. ⟨ Declare Contributors Temp functions 614, 616, 618, 620, 622, 624 ⟩ Used in section 612. ⟨ Declare Contributors functions 593, 595, 597, 599, 601, 603 ⟩ Used in section 591. ⟨ Declare Creators Temp functions 572, 574, 576, 578, 580, 582 ⟩ Used in section 570. ⟨ Declare Creators functions 551, 553, 555, 557, 559, 561 ⟩ Used in section 549. ⟨ Declare Descriptions Temp functions 677, 679, 681, 683, 685, 687 ⟩ Used in section 675. ⟨ Declare Identifiers Temp functions 740, 742, 744, 746, 748, 750 ⟩ Used in section 738. ⟨ Declare Languages Temp functions 761, 763, 765, 767, 769, 771 ⟩ Used in section 759. ⟨ Declare Metadata Source functions 320, 322, 324, 327, 336, 341, 348 ⟩ Used in section 315. ⟨ Declare Publishers Temp functions 782, 784, 786, 788, 790, 792 ⟩ Used in section 780. ⟨ Declare Records Temp functions 530, 532, 534, 536, 538, 540 ⟩ Used in section 528. ⟨ Declare Records functions 509, 511, 513, 515, 517, 519 ⟩ Used in section 507. ⟨ Declare Rights Temp functions 803, 805, 807, 809, 811, 813 ⟩ Used in section 801. ⟨ Declare Selector functions 387, 395, 397, 417, 440, 456, 485 ⟩ Used in section 384. ⟨ Declare Subjects Temp functions 719, 721, 723, 725, 727, 729 ⟩ Used in section 717. ⟨ Declare Subjects functions 698, 700, 702, 704, 706, 708 ⟩ Used in section 696. ⟨ Declare Temp IDs 1 functions 866, 868, 870, 872, 874, 876 ⟩ Used in section 864. ⟨ Declare Temp IDs functions 845, 847, 849, 851, 853, 855 ⟩ Used in section 843. ⟨ Declare Titles Temp functions 656, 658, 660, 662, 664, 666 ⟩ Used in section 654. ⟨ Declare Titles functions 635, 637, 639, 641, 643, 645 ⟩ Used in section 633. ⟨ Declare Types Temp functions 824, 826, 828, 830, 832, 834 ⟩ Used in section 822. ⟨ Declare class CATestDoc 79 ⟩ Used in section 95. ⟨ Declare class CATestView 100 ⟩ Used in section 129. ⟨ Declare class CMainFrame 32 ⟩ Used in section 49. ⟨ Declare class Contributors Temp 612 ⟩ Used in section 627. ⟨ Declare class Contributors 591 ⟩ Used in section 606. ⟨ Declare class Creators Temp 570 ⟩ Used in section 585. ⟨ Declare class Creators 549 ⟩ Used in section 564. ⟨ Declare class Descriptions Temp 675 ⟩ Used in section 690. ⟨ Declare class Identifiers Temp 738 ⟩ Used in section 753. ⟨ Declare class Languages Temp 759 ⟩ Used in section 774. ⟨ Declare class Metadata Source 315 ⟩ Used in section 378. ⟨ Declare class Publishers Temp 780 ⟩ Used in section 795. ⟨ Declare class Records Temp 528 ⟩ Used in section 543. ⟨ Declare class Records 507 ⟩ Used in section 522. ⟨ Declare class Rights Temp 801 ⟩ Used in section 816. ⟨ Declare class Selector 384 ⟩ Used in section 502. ⟨ Declare class Subjects Temp 717 ⟩ Used in section 732. ⟨ Declare class Subjects 696 ⟩ Used in section 711. ⟨ Declare class Temp IDs 1 864 ⟩ Used in section 879. ⟨ Declare class Temp IDs 843 ⟩ Used in section 858. ⟨ Declare class Titles Temp 654 ⟩ Used in section 669. ⟨ Declare class Titles 633 ⟩ Used in section 648. ⟨ Declare class Types Temp 822 ⟩ Used in section 837.

⟨ Declare protected CATestDoc functions 81 ⟩ Used in section 79.

⟨ Declare protected CATestView functions 102, 117, 119, 121 ⟩ Used in section 100.

⟨ Declare protected CAboutDlg functions 69 ⟩ Used in section 65.

⟨ Declare protected CMainFrame functions 35, 45 ⟩ Used in section 32. ⟨ Declare protected Dialog 1 functions 139 ⟩ Used in section 133.

⟨ Declare protected Dialog 2 functions 227 ⟩ Used in section 212.

⟨ Declare public CAboutDlg functions 67 ⟩ Used in section 65.

⟨ Declare public CMainFrame functions 37, 39, 41, 43 ⟩ Used in section 32. ⟨ Declare public Dialog 1 functions 135, 137, 141, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174,

176, 178, 180, 188, 190, 193 ⟩ Used in section 133. ⟨ Declare public Dialog 2 functions 216, 218, 220, 230, 232, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, 265, 267,

269, 274, 276, 278, 280, 282, 284, 286, 288 ⟩ Used in section 212.

⟨ Declare static constants in class Metadata Source 316 ⟩ Used in section 315.

⟨ Declare static indicators array 33 ⟩ Used in section 48. ⟨ Define global functions 298, 299, 300, 301, 302, 303, 304, 306, 308 ⟩ Used in section 310. ⟨ Define CATestApp functions 60, 62, 64 ⟩ Used in section 73. ⟨ Define CATestDoc functions 82, 84, 86, 88, 90, 92 ⟩ Used in section 94. ⟨ Define CATestView functions 103, 105, 107, 109, 111, 113, 115, 118, 120, 122, 124, 126 ⟩ Used in section 128. ⟨ Define CMainFrame functions 36, 38, 40, 42, 44, 46 ⟩ Used in section 48. ⟨ Define Contributors Temp functions 615, 617, 619, 621, 623, 625 ⟩ Used in section 628. ⟨ Define Contributors functions 594, 596, 598, 600, 602, 604 ⟩ Used in section 607. ⟨ Define Creators Temp functions 573, 575, 577, 579, 581, 583 ⟩ Used in section 586. ⟨ Define Creators functions 552, 554, 556, 558, 560, 562 ⟩ Used in section 565. ⟨ Define Descriptions Temp functions 678, 680, 682, 684, 686, 688 ⟩ Used in section 691. ⟨ Define Dialog 1 functions 136, 138, 140, 142, 143, 144, 145, 146, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169,

171, 173, 175, 177, 179, 181, 182, 183, 184, 185, 186, 187, 189, 191, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204 ⟩ Used in section 206.

⟨ Define Dialog 2 functions 217, 219, 221, 222, 223, 224, 225, 226, 228, 231, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 271, 272, 273, 275, 277, 279, 281, 283, 285, 287, 289 ⟩ Used in section 292.

⟨ Define Identifiers Temp functions 741, 743, 745, 747, 749, 751 ⟩ Used in section 754. ⟨ Define Languages Temp functions 762, 764, 766, 768, 770, 772 ⟩ Used in section 775. ⟨ Define Metadata Source ::parse record 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363,

364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375 ⟩ Cited in section 11. Used in section 377. ⟨ Define Metadata Source functions 321, 323, 325, 328, 329, 330, 331, 332, 333, 334, 335, 337, 338, 339, 340, 342, 343,

344, 345, 346, 347 ⟩ Used in section 377. ⟨ Define Publishers Temp functions 783, 785, 787, 789, 791, 793 ⟩ Used in section 796. ⟨ Define Records Temp functions 531, 533, 535, 537, 539, 541 ⟩ Used in section 544. ⟨ Define Records functions 510, 512, 514, 516, 518, 520 ⟩ Used in section 523. ⟨ Define Rights Temp functions 804, 806, 808, 810, 812, 814 ⟩ Used in section 817. ⟨ Define Selector functions 388, 389, 390, 391, 392, 393, 394, 396, 398, 399, 400, 401, 402, 404, 405, 406, 407, 408, 409,

410, 411, 412, 413, 414, 415, 416, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499 ⟩ Used in section 501.

⟨ Define Subjects Temp functions 720, 722, 724, 726, 728, 730 ⟩ Used in section 733. ⟨ Define Subjects functions 699, 701, 703, 705, 707, 709 ⟩ Used in section 712. ⟨ Define Temp IDs 1 functions 867, 869, 871, 873, 875, 877 ⟩ Used in section 880. ⟨ Define Temp IDs functions 846, 848, 850, 852, 854, 856 ⟩ Used in section 859. ⟨ Define Titles Temp functions 657, 659, 661, 663, 665, 667 ⟩ Used in section 670. ⟨ Define Titles functions 636, 638, 640, 642, 644, 646 ⟩ Used in section 649. ⟨ Define Types Temp functions 825, 827, 829, 831, 833, 835 ⟩ Used in section 838. ⟨ Define protected CAboutDlg functions 70 ⟩ Used in section 73. ⟨ Define public CAboutDlg functions 68 ⟩ Used in section 73. ⟨ Dummy sections 15, 881 ⟩ Used in section 884.

⟨ Forward declarations 383 ⟩ Used in section 502.

⟨ GNU Free Documentation License 883 ⟩ Cited in section 2. Used in section 884.

⟨ GNU General Public License 882 ⟩ Cited in section 2. Used in section 884. ⟨ Global variable declarations 55, 213 ⟩ Used in sections 73 and 292. ⟨ Global variables 24 ⟩ Used in section 27. ⟨ Include files 20, 21, 23, 29, 51, 76, 97, 131, 209, 295, 313, 380, 506, 527, 548, 569, 590, 611, 632, 653, 674, 695, 716, 737,

758, 779, 800, 821, 842, 863 ⟩ Used in sections 27, 48, 73, 94, 128, 206, 292, 310, 377, 501, 523, 544, 565, 586, 607, 628, 649, 670, 691, 712, 733, 754, 775, 796, 817, 838, 859, and 880.

⟨ Initialize static constants in class Metadata Source 317 ⟩ Used in section 377. ⟨ Initialize static constants in class Selector 385 ⟩ Used in section 501.

⟨ Preprocessor macro calls 17, 30, 52, 77, 98, 132, 210, 314, 381, 504, 525, 546, 567, 588, 609, 630, 651, 672, 693, 714, 735, 756, 777, 798, 819, 840, 861 ⟩ Used in sections 27, 49, 74, 95, 129, 207, 293, 378, 502, 522, 543, 564, 585, 606, 627, 648, 669, 690, 711, 732, 753, 774, 795, 816, 837, 858, and 879.

⟨ Preprocessor macro definitions 18, 31, 53, 78, 99, 211, 382 ⟩ Used in sections 27, 48, 73, 128, 292, and 501. ⟨ Special character formatting 11 ⟩ Cited in section 373. Used in section 881. ⟨ atest.web 50 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ atestdoc.web 75 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ atstview.web 96 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ cntrbtmp.web 608 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ cntrbtrs.web 587 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ creators.web 545 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ crtrstmp.web 566 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ dialog1a.web 130 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ dialog2a.web 208 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ dscrptmp.web 671 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ glblfncs.web 294 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ identtmp.web 734 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ langtmp.web 755 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ mainfrm.web 28 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ mtdtsrc.web 312 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ pblshtmp.web 776 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ rcrdstmp.web 524 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ records.web 503 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ resource.h contents 14 ⟩ Cited in section 15. Used in section 15. ⟨ resource.web 12 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ rghtstmp.web 797 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ sbjcttmp.web 713 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ selector.web 379 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ spchrtbl.web 10 ⟩ Cited in sections 8 and 9. Used in section 881. ⟨ stdafx.web 16 ⟩ Cited in sections 6 and 9. Used in section 881. ⟨ subjects.web 692 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ tempids.web 839 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ tempids1.web 860 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ titles.web 629 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ ttlstmp.web 650 ⟩ Cited in sections 7 and 9. Used in section 881. ⟨ typestmp.web 818 ⟩ Cited in sections 7 and 9. Used in section 881.

⟨ 74 ⟩ ⟨ 95 ⟩

⟨ 129 ⟩ ⟨ 627 ⟩ ⟨ 606 ⟩ ⟨ 564 ⟩ ⟨ 585 ⟩ ⟨ 207 ⟩ ⟨ 293 ⟩ ⟨ 690 ⟩ ⟨ 311 ⟩ ⟨ 753 ⟩ ⟨ 774 ⟩

⟨ 49 ⟩

⟨ 378 ⟩ ⟨ 795 ⟩ ⟨ 543 ⟩ ⟨ 522 ⟩ ⟨ 816 ⟩ ⟨ 732 ⟩ ⟨ 502 ⟩

⟨ 27 ⟩

⟨ 711 ⟩ ⟨ 858 ⟩ ⟨ 879 ⟩ ⟨ 648 ⟩ ⟨ 669 ⟩ ⟨ 837 ⟩ ⟨ CATestApp message map 57 ⟩ Used in section 73. ⟨ CAboutDlg message map 71 ⟩ Used in section 73. ⟨ Dialog 1 message map 192 ⟩ Used in section 206. ⟨ Dialog 2 message map 290 ⟩ Used in section 292. ⟨ class CATestApp declaration 54 ⟩ Used in section 74. ⟨ class CAboutDlg declaration 65 ⟩ Used in section 74. ⟨ class Dialog 1 declaration 133 ⟩ Used in section 207. ⟨ class Dialog 2 declaration 212 ⟩ Used in section 293. ⟨ extern global variable declarations 56, 214 ⟩ Used in sections 74 and 293. ⟨ using declarations for namespaces 505, 526, 547, 568, 589, 610, 631, 652, 673, 694, 715, 736, 757, 778, 799, 820, 841,

862 ⟩ Used in sections 522, 543, 564, 585, 606, 627, 648, 669, 690, 711, 732, 753, 774, 795, 816, 837, 858, and 879.

IWF Metadata Harvester I ATest: The Program Version 1.0 by Laurence D. Finston

October 2006

Section Page

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 Copyright and licenses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1 Formatting commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1 File Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1

Source Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1 Logical and Hierarchical Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2 ODBC Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3

Other files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3 Alphabetical Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3

Special character formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 5 Preprocessor macro definitions for resources (resource.web) . . . . . . . . . . . . . . . . . . . . . . . . 12 8 Putting resource.web together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 9 stdafx (stdafx.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 12 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 12 Preprocessor macro definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 12 Include files in stdafx.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 12

Global variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 14 Putting stdafx.web together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 14 CMainFrame (mainfrm.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 15 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 15 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 15 Preprocessor macro definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 15 Declare class CMainFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 15 Declare staticindicators array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 15 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 15

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 16 Destructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 16 Pre-Create Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 16 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 16 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 17 On Create . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 17

Putting CMainFrame together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 17

ii  TABLE OF CONTENTS  IWF Metadata Harvester I

CATestApp and CABoutDlg (atest.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 19 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 19 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 19 Preprocessor macro definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 19 class CATestApp declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 19 Global variable declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 19 extern global variable declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 20 CATestApp message map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 20 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 20

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 20 Initialize instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 20 OnAppAbout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 21

class CAboutDlg declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 22

Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 22 Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 22 Do Data Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 22

CAboutDlg message map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 23 Putting CATestApp and CABoutDlg together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 23 CATestDoc (atestdoc.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 24 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 24 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 24 Preprocessor macro definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 24 Declare class CATestDoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 24 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 24

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 24 Destructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 25 On New Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 25 Serialize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 25 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 26 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 26

Putting CATestDoc together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 26 CATestView (atstview.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 27 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 27 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 27 Preprocessor macro definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 27 Declare class CATestView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 27 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 27

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 27 Destructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 28 Get Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 28 On Draw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 28 Pre-Create Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 29 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 29 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 29 On Prepare Printing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 30 On Begin Printing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 30 On End Printing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 30 On Left Button Down . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 30 On Right Button Down . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 31

Putting CATestView together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 31 Dialog 1 (dialog1a.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 32 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 32

IWF Metadata Harvester I TABLE OF CONTENTS iii

Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 32 class Dialog 1 declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 32 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 33

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 33 Destructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 33 Do Data Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 33 Initialize Dialog 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 34 Event handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 35

OnBnClickedOk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 35 OnBnClickedToday . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 35 OnBnClickedYesterday . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 35 OnBnClickedThisWeek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 36 OnBnClickedLastWeek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 36 OnBnClickedThisMonth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 37 OnBnClickedLastMonth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 37 OnBnClickedLast6Months . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 37 OnBnClickedThisYear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 38 OnBnClickedLastYear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 38 OnBnClickedLast2Years . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 39 OnBnClickedLast5Years . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 39 OnBnClickedLast10Years . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 40 OnBnClickedLast20Years . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 40 OnBnClickedAllRecords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 41 OnBnClickedCancel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 41 OnBnClickedDownload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 41 OnBnClickedTimms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 45 OnBnClickedDbt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 45

Dialog 1 message map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 46

Download records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 46 Putting Dialog 1 together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 53

Dialog 2 (dialog2a.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 54 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 54 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 54 Preprocessor macro definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 54 class Dialog 2 declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 54 Global variable declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 55 extern global variable declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 55 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 55

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 55 Destructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 55 Initialize Dialog 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 56 Do Data Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 57 Event handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 57

OnBnClickedOk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 57 OnBnClickedSearch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 58 OnBnClickedBegOrWholeWord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 62 OnBnClickedWholeWordOnly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 62 OnBnClickedWholeOrPartialWord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 62 OnBnClickedCaseIgnore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 62 OnBnClickedExactMatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 63 OnBnClickedAllDates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 63 OnBnClickedSinceLastYear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 63

iv  TABLE OF CONTENTS  IWF Metadata Harvester I

OnBnClickedThisYear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 63 OnBnClickedLast6Months . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 64 OnBnClickedLastMonth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 64 OnBnClickedThisMonth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 64 OnBnClickedThisWeek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 64 OnBnClickedListRecords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 65 OnBnClickedDescending . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 66 OnBnClickedUseDcDate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 67 OnBnClickedUseHeaderDatestamp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 67 OnBnClickedListTitles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 67 OnBnClickedCreators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 68 OnBnClickedCancel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 69 OnBnClickedContributors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 70 OnBnClickedSubjects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 70

Dialog 2 message map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 71 Putting Dialog 2 together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 72 Global functions (glblfncs.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 72 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 72 Global functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 72

Get HTTP file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 72 Initialize copyright strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 75 Initialize special char encodings map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 76

Putting global functions together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 79 Metadata Source (mtdtsrc.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 80 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 80 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 80 class Metadata Source declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 80

static constants in class Metadata Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 80 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 81

Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 81 Default constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 81 const unsigned short argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 81

Destructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 81 Updating the database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 82

Update database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 82 Sub-update database DBT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 87 Sub-update database TIMMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 92

Parse record . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 96

Handle special characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 104

Putting class Metadata Source together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 104 Selector (selector.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 106 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 106 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 106 Preprocessor macro definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 106 Forward declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 106 Declare class Selector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384 106 Initialize static constants in class Selector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385 108 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 109

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 109 Destructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 112 Select from database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 112 List records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 119

IWF Metadata Harvester I TABLE OF CONTENTS v

Fill table streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 131 Write HTML from streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 137 List table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 153

Putting Selector together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 164

Records (records.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 166 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 166 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505 166 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 166 Records class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507 166 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508 166

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 166 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511 167 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 167 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 167 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 168 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 168

Putting Records together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 168

Records Temp (rcrdstmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 169 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 169 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 169 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 169 Records Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 169 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529 169

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 169 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532 170 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 170 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536 170 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538 171 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 171

Putting Records Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542 171

Creators (creators.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 172 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 172 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 172 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 172 Creators class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 172 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 172

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551 172 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 173 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 173 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557 173 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559 174 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561 174

Putting Creators together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 174

Creators Temp (crtrstmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566 175 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 175 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568 175 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 175 Creators Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 175 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571 175

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572 175 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574 176

vi  TABLE OF CONTENTS  IWF Metadata Harvester I

Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 176 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578 176 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580 177 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 177

Putting Creators Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 177

Contributors (cntrbtrs.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 178 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588 178 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 178 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590 178 Contributors class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591 178 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592 178

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 178 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 179 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 179 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 179 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601 180 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603 180

Putting Contributors together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 180

Contributors Temp (cntrbtmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608 181 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 181 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 181 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611 181 Contributors Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 181 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 181

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614 181 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616 182 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618 182 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620 182 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622 183 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624 183

Putting Contributors Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626 183

Titles (titles.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629 184 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630 184 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 184 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632 184 Titles class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633 184 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634 184

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635 184 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 185 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639 185 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641 185 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643 186 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645 186

Putting Titles together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647 186

Titles Temp (ttlstmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650 187 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651 187 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652 187 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653 187 Titles Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654 187 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655 187

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656 187

IWF Metadata Harvester I TABLE OF CONTENTS vii

Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658 188 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660 188 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662 188 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664 189 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666 189

Putting Titles Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668 189

Descriptions Temp (dscrptmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671 190 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672 190 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673 190 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674 190 Descriptions Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675 190 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676 190

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677 190 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679 191 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681 191 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 191 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685 192 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687 192

Putting Descriptions Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689 192

Subjects (subjects.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692 193 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693 193 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694 193 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695 193 Subjects class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696 193 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 193

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698 193 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700 194 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702 194 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704 194 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706 195 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708 195

Putting Subjects together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710 195

Subjects Temp (sbjcttmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713 196 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714 196 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715 196 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716 196 Subjects Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717 196 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718 196

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719 196 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721 197 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723 197 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725 197 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727 198 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729 198

Putting Subjects Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731 198

Identifiers Temp (identtmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734 199 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735 199 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736 199 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737 199 Identifiers Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738 199 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739 199

viii  TABLE OF CONTENTS  IWF Metadata Harvester I

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740 199 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742 200 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744 200 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746 200 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748 201 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750 201

Putting Identifiers Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752 201

Languages Temp (langtmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 202 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756 202 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757 202 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758 202 Languages Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759 202 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760 202

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761 202 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763 203 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765 203 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 203 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769 204 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771 204

Putting Languages Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773 204

Publishers Temp (pblshtmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 776 205 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777 205 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778 205 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779 205 Publishers Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 780 205 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781 205

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782 205 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784 206 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786 206 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788 206 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 790 207 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792 207

Putting Publishers Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794 207

Rights Temp (rghtstmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797 208 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798 208 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 799 208 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 800 208 Rights Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801 208 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 802 208

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803 208 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805 209 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807 209 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809 209 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811 210 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813 210

Putting Rights Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815 210

Types Temp (typestmp.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818 211 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819 211 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820 211 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 821 211 Types Temp class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822 211

IWF Metadata Harvester I TABLE OF CONTENTS ix

Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823 211 Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 824 211 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826 212 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828 212 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830 212 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 832 213 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 834 213

Putting Types Temp together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 836 213 Temp IDs (tempids.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839 214 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 840 214 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841 214 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 842 214 Temp IDs class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843 214 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 844 214

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845 214 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847 215 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849 215 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851 215 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853 216 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855 216

Putting Temp IDs together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857 216 Temp IDs 1 (tempids1.web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860 217 Preprocessor macro calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 861 217 using declarations for namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862 217 Include files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 863 217 Temp IDs 1 class declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864 217 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865 217

Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866 217 Get default connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 868 218 Standard-SQL for Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 870 218 Do Field Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872 218 Assert Valid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 874 219 Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876 219

Putting Temp IDs 1 together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878 219 GNU General Public License . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 882 220 GNU Free Documentation License . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 225 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885 230