Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | ##---------------------------------------------------------------------------## |
2 | ## File: | |
3 | ## $Id: mhdb.pl,v 2.22 2002/07/27 05:13:13 ehood Exp $ | |
4 | ## Author: | |
5 | ## Earl Hood mhonarc@mhonarc.org | |
6 | ## Description: | |
7 | ## MHonArc library defining routines for outputing database. | |
8 | ##---------------------------------------------------------------------------## | |
9 | ## MHonArc -- Internet mail-to-HTML converter | |
10 | ## Copyright (C) 1995-2002 Earl Hood, mhonarc@mhonarc.org | |
11 | ## | |
12 | ## This program is free software; you can redistribute it and/or modify | |
13 | ## it under the terms of the GNU General Public License as published by | |
14 | ## the Free Software Foundation; either version 2 of the License, or | |
15 | ## (at your option) any later version. | |
16 | ## | |
17 | ## This program is distributed in the hope that it will be useful, | |
18 | ## but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 | ## GNU General Public License for more details. | |
21 | ## | |
22 | ## You should have received a copy of the GNU General Public License | |
23 | ## along with this program; if not, write to the Free Software | |
24 | ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
25 | ## 02111-1307, USA | |
26 | ##---------------------------------------------------------------------------## | |
27 | ||
28 | ##--------------------------------------------------------------------------- | |
29 | ## output_db() spits out the state of mhonarc to a file. This | |
30 | ## (database) file contains information to update mail threading | |
31 | ## when incremental adding is done. The actual database file | |
32 | ## is a Perl program defining all the internal data structures. | |
33 | ## All mhonarc does is 'require' it when updating. This is | |
34 | ## faster than having to extract the data from message files | |
35 | ## -- which would require opening every file to perform | |
36 | ## updates. | |
37 | ## | |
38 | sub output_db { | |
39 | my($pathname) = shift; | |
40 | my $tmpfile = $pathname . "$$"; | |
41 | ||
42 | ## Invoke pre-save callback | |
43 | if (defined($CBDbPreSave) && defined(&$CBDbPreSave)) { | |
44 | return unless &$CBDbPreSave($pathname, $tmpfile); | |
45 | } | |
46 | ||
47 | local(*DB); | |
48 | if (!open(DB, ">$tmpfile")) { | |
49 | warn qq/ERROR: Unable to create "$tmpfile": $!\n/; | |
50 | return 0; | |
51 | } | |
52 | binmode(DB); # Unix text format okay for Perl source on Windog | |
53 | ||
54 | print DB "## MHonArcDB (Automatically generated by MHonArc)\n"; | |
55 | print_var(\*DB,'DbVERSION', \$VERSION); | |
56 | ||
57 | ## Meta-data | |
58 | print_var(\*DB,'ContentType', \%ContentType); | |
59 | print_var(\*DB,'Date', \%Date); | |
60 | print_var(\*DB,'Derived', \%Derived); | |
61 | print_var(\*DB,'FollowOld', \%Follow); | |
62 | print_var(\*DB,'From', \%From); | |
63 | print_var(\*DB,'IndexNum', \%IndexNum); | |
64 | print_var(\*DB,'MsgId', \%MsgId); | |
65 | print_var(\*DB,'Refs', \%Refs); | |
66 | print_var(\*DB,'Subject', \%Subject); | |
67 | print_var(\*DB,'TListOrder', \@TListOrder); | |
68 | print_var(\*DB,'NumOfMsgs', \$NumOfMsgs); | |
69 | print_var(\*DB,'NumOfPages', \$NumOfPages); | |
70 | print_var(\*DB,'SaveRsrcs', \$SaveRsrcs); | |
71 | ||
72 | if ($SaveRsrcs) { | |
73 | ||
74 | ## Resources | |
75 | print_var(\*DB,'CustomRcVars',\%CustomRcVars); | |
76 | print_var(\*DB,'FieldODefs', \%FieldODefs); | |
77 | print_var(\*DB,'HFieldsExc', \%HFieldsExc); | |
78 | print_var(\*DB,'HeadFields', \%HeadFields); | |
79 | print_var(\*DB,'HeadHeads', \%HeadHeads); | |
80 | print_var(\*DB,'Icons', \%Icons); | |
81 | print_var(\*DB,'UDerivedFile',\%UDerivedFile); | |
82 | print_var(\*DB,'ZoneUD', \%ZoneUD); | |
83 | ||
84 | unless ($IsDefault{'CHARSETCONVERTERS'}) { | |
85 | print_var(\*DB,'readmail::MIMECharSetConverters', | |
86 | \%readmail::MIMECharSetConverters); | |
87 | print_var(\*DB,'readmail::MIMECharSetConvertersSrc', | |
88 | \%readmail::MIMECharSetConvertersSrc); | |
89 | } | |
90 | unless ($IsDefault{'MIMEDECODERS'}) { | |
91 | print_var(\*DB,'readmail::MIMEDecoders', | |
92 | \%readmail::MIMEDecoders); | |
93 | print_var(\*DB,'readmail::MIMEDecodersSrc', | |
94 | \%readmail::MIMEDecodersSrc); | |
95 | } | |
96 | unless ($IsDefault{'MIMEFILTERS'}) { | |
97 | print_var(\*DB,'readmail::MIMEFilters', | |
98 | \%readmail::MIMEFilters); | |
99 | print_var(\*DB,'readmail::MIMEFiltersSrc', | |
100 | \%readmail::MIMEFiltersSrc); | |
101 | } | |
102 | print_var(\*DB,'readmail::MIMEFiltersArgs', | |
103 | \%readmail::MIMEFiltersArgs) | |
104 | unless $IsDefault{'MIMEARGS'}; | |
105 | if (%readmail::MIMEExcs) { | |
106 | print_var(\*DB,'readmail::MIMEExcs', | |
107 | \%readmail::MIMEExcs) | |
108 | unless $IsDefault{'MIMEEXCS'}; | |
109 | } | |
110 | unless ($IsDefault{'MIMEALTPREFS'}) { | |
111 | print_var(\*DB,'MIMEAltPrefs', | |
112 | \@MIMEAltPrefs); | |
113 | } | |
114 | ||
115 | print_var(\*DB,'DateFields', \@DateFields) unless $IsDefault{'DATEFIELDS'}; | |
116 | print_var(\*DB,'FieldOrder', \@FieldOrder); | |
117 | print_var(\*DB,'FromFields', \@FromFields) unless $IsDefault{'FROMFIELDS'}; | |
118 | print_var(\*DB,'Months', \@Months) if scalar(@Months); | |
119 | print_var(\*DB,'months', \@months) if scalar(@months); | |
120 | print_var(\*DB,'OtherIdxs', \@OtherIdxs) if scalar(@OtherIdxs); | |
121 | print_var(\*DB,'PerlINC', \@PerlINC) if scalar(@PerlINC); | |
122 | print_var(\*DB,'Weekdays', \@Weekdays) if scalar(@Weekdays); | |
123 | print_var(\*DB,'weekdays', \@weekdays) if scalar(@weekdays); | |
124 | ||
125 | ## I should use a hash for this stuff instead of individual variables. | |
126 | ## A legacy of Perl 4 days and a program getting larger than expected. | |
127 | ||
128 | print_var(\*DB,'AddressModify', \$AddressModify) | |
129 | unless $IsDefault{'AddressModify'}; | |
130 | print_var(\*DB,'CheckNoArchive', \$CheckNoArchive); | |
131 | print_var(\*DB,'DOCURL', \$DOCURL); | |
132 | print_var(\*DB,'NODOC', \$NODOC); | |
133 | print_var(\*DB,'DecodeHeads', \$DecodeHeads); | |
134 | print_var(\*DB,'DoFolRefs', \$DoFolRefs); | |
135 | print_var(\*DB,'ExpireDate', \$ExpireDate); | |
136 | print_var(\*DB,'ExpireTime', \$ExpireTime); | |
137 | print_var(\*DB,'FROM', \$FROM); | |
138 | print_var(\*DB,'GMTDateFmt', \$GMTDateFmt); | |
139 | print_var(\*DB,'GzipExe', \$GzipExe); | |
140 | print_var(\*DB,'GzipFiles', \$GzipFiles); | |
141 | print_var(\*DB,'GzipLinks', \$GzipLinks); | |
142 | print_var(\*DB,'HtmlExt', \$HtmlExt); | |
143 | print_var(\*DB,'IDXSIZE', \$IDXSIZE); | |
144 | print_var(\*DB,'KeepOnRmm', \$KeepOnRmm); | |
145 | print_var(\*DB,'LocalDateFmt', \$LocalDateFmt); | |
146 | print_var(\*DB,'MAILTOURL', \$MAILTOURL) unless $IsDefault{'MAILTOURL'}; | |
147 | print_var(\*DB,'MAIN', \$MAIN); | |
148 | print_var(\*DB,'MAXSIZE', \$MAXSIZE); | |
149 | print_var(\*DB,'MHPATTERN', \$MHPATTERN); | |
150 | print_var(\*DB,'MODTIME', \$MODTIME); | |
151 | print_var(\*DB,'MSGFOOT', \$MSGFOOT); | |
152 | print_var(\*DB,'MsgGMTDateFmt', \$MsgGMTDateFmt); | |
153 | print_var(\*DB,'MSGHEAD', \$MSGHEAD); | |
154 | print_var(\*DB,'MsgExcFilter', \$MsgExcFilter); | |
155 | print_var(\*DB,'MsgLocalDateFmt',\$MsgLocalDateFmt); | |
156 | print_var(\*DB,'MsgPrefix', \$MsgPrefix); | |
157 | print_var(\*DB,'MULTIIDX', \$MULTIIDX); | |
158 | print_var(\*DB,'NOMAILTO', \$NOMAILTO); | |
159 | print_var(\*DB,'NONEWS', \$NONEWS); | |
160 | print_var(\*DB,'NOURL', \$NOURL); | |
161 | print_var(\*DB,'NoMsgPgs', \$NoMsgPgs); | |
162 | print_var(\*DB,'NoSubjectThreads', \$NoSubjectThreads); | |
163 | print_var(\*DB,'NoSubjectTxt', \$NoSubjectTxt); | |
164 | print_var(\*DB,'NoteDir', \$NoteDir); | |
165 | print_var(\*DB,'POSIXstrftime', \$POSIXstrftime); | |
166 | print_var(\*DB,'THREAD', \$THREAD); | |
167 | print_var(\*DB,'SubArtRxp', \$SubArtRxp); | |
168 | print_var(\*DB,'SubReplyRxp', \$SubReplyRxp); | |
169 | print_var(\*DB,'SubStripCode', \$SubStripCode); | |
170 | print_var(\*DB,'UseLocalTime', \$UseLocalTime); | |
171 | print_var(\*DB,'UsingLASTPG', \$UsingLASTPG); | |
172 | print_var(\*DB,'VarExp', \$VarExp); | |
173 | ||
174 | print_var(\*DB,'MSGPGSSMARKUP', \$MSGPGSSMARKUP); | |
175 | print_var(\*DB,'IDXPGSSMARKUP', \$IDXPGSSMARKUP); | |
176 | print_var(\*DB,'TIDXPGSSMARKUP', \$TIDXPGSSMARKUP); | |
177 | print_var(\*DB,'SSMARKUP', \$SSMARKUP); | |
178 | print_var(\*DB,'SpamMode', \$SpamMode); | |
179 | ||
180 | if (!$IsDefault{'TEXTCLIPFUNC'}) { | |
181 | print_var(\*DB,'TextClipFunc', \$TextClipFunc); | |
182 | print_var(\*DB,'TextClipSrc', \$TextClipSrc); | |
183 | }; | |
184 | ||
185 | # Main index resources | |
186 | print_var(\*DB,'AUTHSORT', \$AUTHSORT); | |
187 | print_var(\*DB,'NOSORT', \$NOSORT); | |
188 | print_var(\*DB,'REVSORT', \$REVSORT); | |
189 | print_var(\*DB,'SUBSORT', \$SUBSORT); | |
190 | ||
191 | print_var(\*DB,'AUTHBEG', \$AUTHBEG) unless $IsDefault{'AUTHBEG'}; | |
192 | print_var(\*DB,'AUTHEND', \$AUTHEND) unless $IsDefault{'AUTHEND'}; | |
193 | print_var(\*DB,'DAYBEG', \$DAYBEG) unless $IsDefault{'DAYBEG'}; | |
194 | print_var(\*DB,'DAYEND', \$DAYEND) unless $IsDefault{'DAYEND'}; | |
195 | print_var(\*DB,'IDXLABEL', \$IDXLABEL) unless $IsDefault{'IDXLABEL'}; | |
196 | print_var(\*DB,'IDXNAME', \$IDXNAME); | |
197 | print_var(\*DB,'IDXPGBEG', \$IDXPGBEG) unless $IsDefault{'IDXPGBEG'}; | |
198 | print_var(\*DB,'IDXPGEND', \$IDXPGEND) unless $IsDefault{'IDXPGEND'}; | |
199 | print_var(\*DB,'IDXPREFIX', \$IDXPREFIX); | |
200 | print_var(\*DB,'LIBEG', \$LIBEG) unless $IsDefault{'LIBEG'}; | |
201 | print_var(\*DB,'LIEND', \$LIEND) unless $IsDefault{'LIEND'}; | |
202 | print_var(\*DB,'LITMPL', \$LITMPL) unless $IsDefault{'LITMPL'}; | |
203 | print_var(\*DB,'FIRSTPGLINK', \$FIRSTPGLINK) unless $IsDefault{'FIRSTPGLINK'}; | |
204 | print_var(\*DB,'LASTPGLINK', \$LASTPGLINK) unless $IsDefault{'LASTPGLINK'}; | |
205 | print_var(\*DB,'NEXTPGLINK', \$NEXTPGLINK) unless $IsDefault{'NEXTPGLINK'}; | |
206 | print_var(\*DB,'NEXTPGLINKIA', \$NEXTPGLINKIA) | |
207 | unless $IsDefault{'NEXTPGLINKIA'}; | |
208 | print_var(\*DB,'PREVPGLINK', \$PREVPGLINK) unless $IsDefault{'PREVPGLINK'}; | |
209 | print_var(\*DB,'PREVPGLINKIA', \$PREVPGLINKIA) | |
210 | unless $IsDefault{'PREVPGLINKIA'}; | |
211 | print_var(\*DB,'SUBJECTBEG', \$SUBJECTBEG) unless $IsDefault{'SUBJECTBEG'}; | |
212 | print_var(\*DB,'SUBJECTEND', \$SUBJECTEND) unless $IsDefault{'SUBJECTEND'}; | |
213 | print_var(\*DB,'TITLE', \$TITLE); | |
214 | ||
215 | # Thread index resources | |
216 | print_var(\*DB,'TNOSORT', \$TNOSORT); | |
217 | print_var(\*DB,'TREVERSE', \$TREVERSE); | |
218 | print_var(\*DB,'TSUBSORT', \$TSUBSORT); | |
219 | ||
220 | print_var(\*DB,'TCONTBEG', \$TCONTBEG) unless $IsDefault{'TCONTBEG'}; | |
221 | print_var(\*DB,'TCONTEND', \$TCONTEND) unless $IsDefault{'TCONTEND'}; | |
222 | print_var(\*DB,'TFOOT', \$TFOOT) unless $IsDefault{'TFOOT'}; | |
223 | print_var(\*DB,'THEAD', \$THEAD) unless $IsDefault{'THEAD'}; | |
224 | print_var(\*DB,'TIDXLABEL', \$TIDXLABEL) unless $IsDefault{'TIDXLABEL'}; | |
225 | print_var(\*DB,'TIDXNAME', \$TIDXNAME); | |
226 | print_var(\*DB,'TIDXPGBEG', \$TIDXPGBEG) unless $IsDefault{'TIDXPGBEG'}; | |
227 | print_var(\*DB,'TIDXPGEND', \$TIDXPGEND) unless $IsDefault{'TIDXPGEND'}; | |
228 | print_var(\*DB,'TIDXPREFIX', \$TIDXPREFIX); | |
229 | print_var(\*DB,'TINDENTBEG', \$TINDENTBEG) unless $IsDefault{'TINDENTBEG'}; | |
230 | print_var(\*DB,'TINDENTEND', \$TINDENTEND) unless $IsDefault{'TINDENTEND'}; | |
231 | print_var(\*DB,'TLEVELS', \$TLEVELS); | |
232 | print_var(\*DB,'TLIEND', \$TLIEND) unless $IsDefault{'TLIEND'}; | |
233 | print_var(\*DB,'TLINONE', \$TLINONE) unless $IsDefault{'TLINONE'}; | |
234 | print_var(\*DB,'TLINONEEND', \$TLINONEEND) unless $IsDefault{'TLINONEEND'}; | |
235 | print_var(\*DB,'TLITXT', \$TLITXT) unless $IsDefault{'TLITXT'}; | |
236 | print_var(\*DB,'TFIRSTPGLINK', \$TFIRSTPGLINK) | |
237 | unless $IsDefault{'TFIRSTPGLINK'}; | |
238 | print_var(\*DB,'TLASTPGLINK', \$TLASTPGLINK) | |
239 | unless $IsDefault{'TLASTPGLINK'}; | |
240 | print_var(\*DB,'TNEXTPGLINK', \$TNEXTPGLINK) unless $IsDefault{'TNEXTPGLINK'}; | |
241 | print_var(\*DB,'TNEXTPGLINKIA',\$TNEXTPGLINKIA) | |
242 | unless $IsDefault{'TNEXTPGLINKIA'}; | |
243 | print_var(\*DB,'TPREVPGLINK', \$TPREVPGLINK) unless $IsDefault{'TPREVPGLINK'}; | |
244 | print_var(\*DB,'TPREVPGLINKIA',\$TPREVPGLINKIA) | |
245 | unless $IsDefault{'TPREVPGLINKIA'}; | |
246 | print_var(\*DB,'TSINGLETXT', \$TSINGLETXT) unless $IsDefault{'TSINGLETXT'}; | |
247 | print_var(\*DB,'TSUBJECTBEG', \$TSUBJECTBEG) unless $IsDefault{'TSUBJECTBEG'}; | |
248 | print_var(\*DB,'TSUBJECTEND', \$TSUBJECTEND) unless $IsDefault{'TSUBJECTEND'}; | |
249 | print_var(\*DB,'TSUBLISTBEG', \$TSUBLISTBEG) unless $IsDefault{'TSUBLISTBEG'}; | |
250 | print_var(\*DB,'TSUBLISTEND', \$TSUBLISTEND) unless $IsDefault{'TSUBLISTEND'}; | |
251 | print_var(\*DB,'TTITLE', \$TTITLE); | |
252 | print_var(\*DB,'TTOPBEG', \$TTOPBEG) unless $IsDefault{'TTOPBEG'}; | |
253 | print_var(\*DB,'TTOPEND', \$TTOPEND) unless $IsDefault{'TTOPEND'}; | |
254 | ||
255 | print_var(\*DB,'TSLICESINGLETXT', \$TSLICESINGLETXT) | |
256 | unless $IsDefault{'TSLICESINGLETXT'}; | |
257 | print_var(\*DB,'TSLICETOPBEG', \$TSLICETOPBEG) | |
258 | unless $IsDefault{'TSLICETOPBEG'}; | |
259 | print_var(\*DB,'TSLICETOPEND', \$TSLICETOPEND) | |
260 | unless $IsDefault{'TSLICETOPEND'}; | |
261 | print_var(\*DB,'TSLICESUBLISTBEG', \$TSLICESUBLISTBEG) | |
262 | unless $IsDefault{'TSLICESUBLISTBEG'}; | |
263 | print_var(\*DB,'TSLICESUBLISTEND', \$TSLICESUBLISTEND) | |
264 | unless $IsDefault{'TSLICESUBLISTEND'}; | |
265 | print_var(\*DB,'TSLICELEVELS', \$TSLICELEVELS) | |
266 | unless $IsDefault{'TSLICELEVELS'}; | |
267 | print_var(\*DB,'TSLICELITXT', \$TSLICELITXT) | |
268 | unless $IsDefault{'TSLICELITXT'}; | |
269 | print_var(\*DB,'TSLICELIEND', \$TSLICELIEND) | |
270 | unless $IsDefault{'TSLICELIEND'}; | |
271 | print_var(\*DB,'TSLICELINONE', \$TSLICELINONE) | |
272 | unless $IsDefault{'TSLICELINONE'}; | |
273 | print_var(\*DB,'TSLICELINONEEND', \$TSLICELINONEEND) | |
274 | unless $IsDefault{'TSLICELINONEEND'}; | |
275 | print_var(\*DB,'TSLICESUBJECTBEG', \$TSLICESUBJECTBEG) | |
276 | unless $IsDefault{'TSLICESUBJECTBEG'}; | |
277 | print_var(\*DB,'TSLICESUBJECTEND', \$TSLICESUBJECTEND) | |
278 | unless $IsDefault{'TSLICESUBJECTEND'}; | |
279 | print_var(\*DB,'TSLICEINDENTBEG', \$TSLICEINDENTBEG) | |
280 | unless $IsDefault{'TSLICEINDENTBEG'}; | |
281 | print_var(\*DB,'TSLICEINDENTEND', \$TSLICEINDENTEND) | |
282 | unless $IsDefault{'TSLICEINDENTEND'}; | |
283 | print_var(\*DB,'TSLICECONTBEG', \$TSLICECONTBEG) | |
284 | unless $IsDefault{'TSLICECONTBEG'}; | |
285 | print_var(\*DB,'TSLICECONTEND', \$TSLICECONTEND) | |
286 | unless $IsDefault{'TSLICECONTEND'}; | |
287 | print_var(\*DB,'TSLICESINGLETXTCUR', \$TSLICESINGLETXTCUR) | |
288 | unless $IsDefault{'TSLICESINGLETXTCUR'}; | |
289 | print_var(\*DB,'TSLICETOPBEGCUR', \$TSLICETOPBEGCUR) | |
290 | unless $IsDefault{'TSLICETOPBEGCUR'}; | |
291 | print_var(\*DB,'TSLICETOPENDCUR', \$TSLICETOPENDCUR) | |
292 | unless $IsDefault{'TSLICETOPENDCUR'}; | |
293 | print_var(\*DB,'TSLICELITXTCUR', \$TSLICELITXTCUR) | |
294 | unless $IsDefault{'TSLICELITXTCUR'}; | |
295 | print_var(\*DB,'TSLICELIENDCUR', \$TSLICELIENDCUR) | |
296 | unless $IsDefault{'TSLICELIENDCUR'}; | |
297 | ||
298 | ## Other resources | |
299 | print_var(\*DB,'BOTLINKS', \$BOTLINKS) unless $IsDefault{'BOTLINKS'}; | |
300 | print_var(\*DB,'FIELDSBEG', \$FIELDSBEG) unless $IsDefault{'FIELDSBEG'}; | |
301 | print_var(\*DB,'FIELDSEND', \$FIELDSEND) unless $IsDefault{'FIELDSEND'}; | |
302 | print_var(\*DB,'FLDBEG', \$FLDBEG) unless $IsDefault{'FLDBEG'}; | |
303 | print_var(\*DB,'FLDEND', \$FLDEND) unless $IsDefault{'FLDEND'}; | |
304 | print_var(\*DB,'FOLUPBEGIN', \$FOLUPBEGIN) unless $IsDefault{'FOLUPBEGIN'}; | |
305 | print_var(\*DB,'FOLUPEND', \$FOLUPEND) unless $IsDefault{'FOLUPEND'}; | |
306 | print_var(\*DB,'FOLUPLITXT', \$FOLUPLITXT) unless $IsDefault{'FOLUPLITXT'}; | |
307 | print_var(\*DB,'HEADBODYSEP', \$HEADBODYSEP) unless $IsDefault{'HEADBODYSEP'}; | |
308 | print_var(\*DB,'LABELBEG', \$LABELBEG) unless $IsDefault{'LABELBEG'}; | |
309 | print_var(\*DB,'LABELEND', \$LABELEND) unless $IsDefault{'LABELEND'}; | |
310 | print_var(\*DB,'MSGBODYEND', \$MSGBODYEND) unless $IsDefault{'MSGBODYEND'}; | |
311 | print_var(\*DB,'MSGIDLINK', \$MSGIDLINK) unless $IsDefault{'MSGIDLINK'}; | |
312 | print_var(\*DB,'MSGPGBEG', \$MSGPGBEG) unless $IsDefault{'MSGPGBEG'}; | |
313 | print_var(\*DB,'MSGPGEND', \$MSGPGEND) unless $IsDefault{'MSGPGEND'}; | |
314 | print_var(\*DB,'NEXTBUTTON', \$NEXTBUTTON) unless $IsDefault{'NEXTBUTTON'}; | |
315 | print_var(\*DB,'NEXTBUTTONIA', \$NEXTBUTTONIA) | |
316 | unless $IsDefault{'NEXTBUTTONIA'}; | |
317 | print_var(\*DB,'NEXTLINK', \$NEXTLINK) unless $IsDefault{'NEXTLINK'}; | |
318 | print_var(\*DB,'NEXTLINKIA', \$NEXTLINKIA) unless $IsDefault{'NEXTLINKIA'}; | |
319 | print_var(\*DB,'NOTE', \$NOTE) unless $IsDefault{'NOTE'}; | |
320 | print_var(\*DB,'NOTEIA', \$NOTEIA) unless $IsDefault{'NOTEIA'}; | |
321 | print_var(\*DB,'NOTEICON', \$NOTEICON) unless $IsDefault{'NOTEICON'}; | |
322 | print_var(\*DB,'NOTEICONIA', \$NOTEICONIA) unless $IsDefault{'NOTEICONIA'}; | |
323 | print_var(\*DB,'PREVBUTTON', \$PREVBUTTON) unless $IsDefault{'PREVBUTTON'}; | |
324 | print_var(\*DB,'PREVBUTTONIA', \$PREVBUTTONIA) | |
325 | unless $IsDefault{'PREVBUTTONIA'}; | |
326 | print_var(\*DB,'PREVLINK', \$PREVLINK) unless $IsDefault{'PREVLINK'}; | |
327 | print_var(\*DB,'PREVLINKIA', \$PREVLINKIA) unless $IsDefault{'PREVLINKIA'}; | |
328 | print_var(\*DB,'REFSBEGIN', \$REFSBEGIN) unless $IsDefault{'REFSBEGIN'}; | |
329 | print_var(\*DB,'REFSEND', \$REFSEND) unless $IsDefault{'REFSEND'}; | |
330 | print_var(\*DB,'REFSLITXT', \$REFSLITXT) unless $IsDefault{'REFSLITXT'}; | |
331 | print_var(\*DB,'SUBJECTHEADER',\$SUBJECTHEADER) | |
332 | unless $IsDefault{'SUBJECTHEADER'}; | |
333 | print_var(\*DB,'TNEXTBUTTON', \$TNEXTBUTTON) unless $IsDefault{'TNEXTBUTTON'}; | |
334 | print_var(\*DB,'TNEXTBUTTONIA',\$TNEXTBUTTONIA) | |
335 | unless $IsDefault{'TNEXTBUTTONIA'}; | |
336 | print_var(\*DB,'TNEXTINBUTTON', \$TNEXTINBUTTON) | |
337 | unless $IsDefault{'TNEXTINBUTTON'}; | |
338 | print_var(\*DB,'TNEXTINBUTTONIA', \$TNEXTINBUTTONIA) | |
339 | unless $IsDefault{'TNEXTINBUTTONIA'}; | |
340 | print_var(\*DB,'TNEXTINLINK', \$TNEXTINLINK) | |
341 | unless $IsDefault{'TNEXTINLINK'}; | |
342 | print_var(\*DB,'TNEXTINLINKIA', \$TNEXTINLINKIA) | |
343 | unless $IsDefault{'TNEXTINLINKIA'}; | |
344 | print_var(\*DB,'TNEXTLINK', \$TNEXTLINK) unless $IsDefault{'TNEXTLINK'}; | |
345 | print_var(\*DB,'TNEXTLINKIA', \$TNEXTLINKIA) unless $IsDefault{'TNEXTLINKIA'}; | |
346 | print_var(\*DB,'TOPLINKS', \$TOPLINKS) unless $IsDefault{'TOPLINKS'}; | |
347 | print_var(\*DB,'TPREVBUTTON', \$TPREVBUTTON) unless $IsDefault{'TPREVBUTTON'}; | |
348 | print_var(\*DB,'TPREVBUTTONIA',\$TPREVBUTTONIA) | |
349 | unless $IsDefault{'TPREVBUTTONIA'}; | |
350 | print_var(\*DB,'TPREVINBUTTON', \$TPREVINBUTTON) | |
351 | unless $IsDefault{'TPREVINBUTTON'}; | |
352 | print_var(\*DB,'TPREVINBUTTONIA', \$TPREVINBUTTONIA) | |
353 | unless $IsDefault{'TPREVINBUTTONIA'}; | |
354 | print_var(\*DB,'TPREVINLINK', \$TPREVINLINK) | |
355 | unless $IsDefault{'TPREVINLINK'}; | |
356 | print_var(\*DB,'TPREVINLINKIA', \$TPREVINLINKIA) | |
357 | unless $IsDefault{'TPREVINLINKIA'}; | |
358 | print_var(\*DB,'TPREVLINK', \$TPREVLINK) unless $IsDefault{'TPREVLINK'}; | |
359 | print_var(\*DB,'TPREVLINKIA', \$TPREVLINKIA) unless $IsDefault{'TPREVLINKIA'}; | |
360 | print_var(\*DB,'TSLICEBEG', \$TSLICEBEG) unless $IsDefault{'TSLICEBEG'}; | |
361 | print_var(\*DB,'TSLICEEND', \$TSLICEEND) unless $IsDefault{'TSLICEEND'}; | |
362 | print_var(\*DB,'TSliceNBefore',\$TSliceNBefore); | |
363 | print_var(\*DB,'TSliceNAfter', \$TSliceNAfter); | |
364 | print_var(\*DB,'TSliceInclusive', \$TSliceInclusive); | |
365 | print_var(\*DB,'TNEXTTOPBUTTON', \$TNEXTTOPBUTTON) | |
366 | unless $IsDefault{'TNEXTTOPBUTTON'}; | |
367 | print_var(\*DB,'TNEXTTOPBUTTONIA', \$TNEXTTOPBUTTONIA) | |
368 | unless $IsDefault{'TNEXTTOPBUTTONIA'}; | |
369 | print_var(\*DB,'TNEXTTOPLINK', \$TNEXTTOPLINK) | |
370 | unless $IsDefault{'TNEXTTOPLINK'}; | |
371 | print_var(\*DB,'TNEXTTOPLINKIA', \$TNEXTTOPLINKIA) | |
372 | unless $IsDefault{'TNEXTTOPLINKIA'}; | |
373 | print_var(\*DB,'TPREVTOPBUTTON', \$TPREVTOPBUTTON) | |
374 | unless $IsDefault{'TPREVTOPBUTTON'}; | |
375 | print_var(\*DB,'TPREVTOPBUTTONIA', \$TPREVTOPBUTTONIA) | |
376 | unless $IsDefault{'TPREVTOPBUTTONIA'}; | |
377 | print_var(\*DB,'TPREVTOPLINK', \$TPREVTOPLINK) | |
378 | unless $IsDefault{'TPREVTOPLINK'}; | |
379 | print_var(\*DB,'TPREVTOPLINKIA', \$TPREVTOPLINKIA) | |
380 | unless $IsDefault{'TPREVTOPLINKIA'}; | |
381 | print_var(\*DB,'UMASK', \$UMASK); | |
382 | ||
383 | } | |
384 | ||
385 | ## Invoke save callback | |
386 | if (defined($CBDbSave) && defined(&$CBDbSave)) { | |
387 | &$CBDbSave(\*DB); | |
388 | } | |
389 | ||
390 | ## Make sure file ends with a true value | |
391 | print DB "1;\n"; | |
392 | ||
393 | close(DB); | |
394 | ||
395 | if (!rename($tmpfile, $pathname)) { | |
396 | warn qq/ERROR: Unable to rename "$tmpfile" to "$pathname": $!\n/; | |
397 | return 0; | |
398 | } | |
399 | 1; | |
400 | } | |
401 | ||
402 | ##--------------------------------------------------------------------------- | |
403 | ||
404 | sub escape_str { | |
405 | my($str) = $_[0]; | |
406 | $str =~ s/(['\\])/\\$1/g; | |
407 | $str; | |
408 | } | |
409 | ||
410 | ##--------------------------------------------------------------------------- | |
411 | ||
412 | sub print_var { | |
413 | my($fh, $name, $ref, $d) = @_; | |
414 | ||
415 | if (ref($ref) eq 'SCALAR') { | |
416 | print $fh qq/\$$name='/, escape_str($$ref), qq/'/; | |
417 | print $fh qq/ unless defined(\$$name)/ if $d; | |
418 | print $fh qq/;\n/; | |
419 | return; | |
420 | } | |
421 | ||
422 | if (ref($ref) eq 'HASH') { | |
423 | my($key, $value, $sep); | |
424 | if (defined($name)) { | |
425 | print $fh "%$name=(\n"; | |
426 | $sep = "\n"; | |
427 | } else { | |
428 | print $fh '{'; | |
429 | $sep = ""; | |
430 | } | |
431 | while (($key, $value) = each(%$ref)) { | |
432 | print $fh qq/'/, escape_str($key), qq/',/; | |
433 | if (ref($value)) { | |
434 | print_var($fh, undef, $value, 0); | |
435 | print $fh ",\n"; | |
436 | next; | |
437 | } | |
438 | if (defined($value)) { | |
439 | print $fh qq/'/, escape_str($value), qq/',/, $sep; | |
440 | } else { | |
441 | print $fh 'undef,', $sep; | |
442 | } | |
443 | } | |
444 | if (defined($name)) { | |
445 | print $fh ");\n"; | |
446 | } else { | |
447 | print $fh '}'; | |
448 | } | |
449 | return; | |
450 | } | |
451 | ||
452 | if (ref($ref) eq 'ARRAY') { | |
453 | local $_; | |
454 | my $sep; | |
455 | if (defined($name)) { | |
456 | print $fh "\@$name=(\n"; | |
457 | $sep = "\n"; | |
458 | } else { | |
459 | print $fh '['; | |
460 | $sep = ""; | |
461 | } | |
462 | foreach (@$ref) { | |
463 | if (ref($_)) { | |
464 | print_var($fh, undef, $_, 0); | |
465 | print $fh ",\n"; | |
466 | next; | |
467 | } | |
468 | if (defined($_)) { | |
469 | print $fh qq/'/, escape_str($_), qq/',/, $sep; | |
470 | } else { | |
471 | print $fh 'undef,', $sep; | |
472 | } | |
473 | } | |
474 | if (defined($name)) { | |
475 | print $fh ");\n"; | |
476 | } else { | |
477 | print $fh ']'; | |
478 | } | |
479 | return; | |
480 | } | |
481 | ||
482 | print $fh qq/\$$name='/, escape_str($ref), qq/'/; | |
483 | print $fh qq/ unless defined(\$$name)/ if $d; | |
484 | print $fh qq/;\n/; | |
485 | } | |
486 | ||
487 | ##---------------------------------------------------------------------------## | |
488 | 1; |