📄 databaseaccess.mht
字号:
<FONT color=3D#ffa500>unless</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdad00>@ARGV</FONT> =3D=3D <FONT color=3D#cdcd00>2</FONT><FONT =
color=3D#00ffff>)</FONT> <FONT color=3D#00ffff>{</FONT>
<FONT color=3D#ffa500>die</FONT> <FONT color=3D#00cd00>"usage: =
db2gdbm infile outfile\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#ffa500>my</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#9ac0cd>$infile</FONT>, <FONT =
color=3D#9ac0cd>$outfile</FONT><FONT color=3D#00ffff>)</FONT> =3D <FONT =
color=3D#cdad00>@ARGV</FONT><FONT color=3D#00ffff>;</FONT><FONT =
color=3D#43cd80> </FONT>
<FONT color=3D#ffa500>my</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdcd00>%db_in</FONT>, <FONT color=3D#cdcd00>%db_out</FONT><FONT =
color=3D#00ffff>);</FONT><FONT color=3D#43cd80> =
</FONT>
<FONT color=3D#bebebe># open the files
</FONT><FONT color=3D#ff7f50>tie</FONT><FONT =
color=3D#00ffff>(</FONT><FONT color=3D#cdcd00>%db_in</FONT>, <FONT =
color=3D#00cd00>'DB_File'</FONT>, $infile<FONT color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Can't tie $infile: $!"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#ff7f50>tie</FONT><FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdcd00>%db_out</FONT>, <FONT =
color=3D#00cd00>'GDBM_File'</FONT>, $outfile, GDBM_WRCREAT, <FONT =
color=3D#cdcd00>0666</FONT><FONT color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Can't tie $outfile: $!"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe># copy (don't use </FONT><FONT =
color=3D#cdcd00>%db_out</FONT><FONT color=3D#bebebe> =3D </FONT><FONT =
color=3D#cdcd00>%db_in</FONT><FONT color=3D#bebebe> because it's slow on =
big databases)
</FONT><FONT color=3D#ffa500>while</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#ffa500>my</FONT><FONT =
color=3D#00ffff>(</FONT>$k, $v<FONT color=3D#00ffff>)</FONT> =3D <FONT =
color=3D#ff7f50>each</FONT> <FONT color=3D#cdcd00>%db_in</FONT><FONT =
color=3D#00ffff>)</FONT> <FONT color=3D#00ffff>{</FONT>
<FONT color=3D#cdcd00>$db_out</FONT><FONT =
color=3D#00ffff>{</FONT>$k<FONT color=3D#00ffff>}</FONT> =3D $v<FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#bebebe># these unties happen automatically at program =
exit
</FONT><FONT color=3D#ff7f50>untie</FONT> <FONT =
color=3D#cdcd00>%db_in</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ff7f50>untie</FONT> <FONT =
color=3D#cdcd00>%db_out</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
#% db2gdbm /tmp/users.db /tmp/users.gdbm
#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN766>Merging DBM Files</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
<TBODY>
<TR>
<TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#cdcd00>%OUTPUT</FONT> =3D <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#cdcd00>%INPUT1</FONT>, <FONT =
color=3D#cdcd00>%INPUT2</FONT><FONT color=3D#00ffff>);</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#cdcd00>%OUTPUT</FONT> =3D <FONT =
color=3D#00ffff>();</FONT>
<FONT color=3D#ffa500>foreach</FONT> <FONT color=3D#9ac0cd>$href</FONT> =
<FONT color=3D#00ffff>(</FONT> \<FONT color=3D#cdcd00>%INPUT1</FONT>, =
\<FONT color=3D#cdcd00>%INPUT2</FONT> <FONT color=3D#00ffff>)</FONT> =
<FONT color=3D#00ffff>{</FONT>
<FONT color=3D#ffa500>while</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#ffa500>my</FONT><FONT =
color=3D#00ffff>(</FONT>$key, $value<FONT color=3D#00ffff>)</FONT> =3D =
<FONT color=3D#ff7f50>each</FONT><FONT =
color=3D#00ffff>(</FONT>%$href<FONT color=3D#00ffff>))</FONT> <FONT =
color=3D#00ffff>{</FONT>
<FONT color=3D#ffa500>if</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#ff7f50>exists</FONT> <FONT =
color=3D#cdcd00>$OUTPUT</FONT><FONT color=3D#00ffff>{</FONT>$key<FONT =
color=3D#00ffff>})</FONT> <FONT color=3D#00ffff>{</FONT>
<FONT color=3D#bebebe># decide which value to use and set =
</FONT><FONT color=3D#cdcd00>$OUTPUT</FONT><FONT color=3D#bebebe>{$key} =
if necessary
</FONT> <FONT color=3D#00ffff>}</FONT> <FONT =
color=3D#ffa500>else</FONT> <FONT color=3D#00ffff>{</FONT>
<FONT color=3D#cdcd00>$OUTPUT</FONT><FONT =
color=3D#00ffff>{</FONT>$key<FONT color=3D#00ffff>}</FONT> =3D =
$value<FONT color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN769>Locking DBM Files</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
<TBODY>
<TR>
<TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
# <FONT size=3D-1><A =
href=3D"http://pleac.sourceforge.net/include/perl/ch14/dblockdemo">downlo=
ad the following standalone program</A></FONT>
#!/usr/bin/perl
# dblockdemo - demo locking dbm databases
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>DB_File</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>strict</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>sub</FONT> <FONT color=3D#b2dfee>LOCK_SH</FONT> =
<FONT color=3D#00ffff>{</FONT> <FONT color=3D#cdcd00>1</FONT> <FONT =
color=3D#00ffff>}</FONT> <FONT color=3D#bebebe># In =
case you don't have
</FONT><FONT color=3D#ffa500>sub</FONT> <FONT =
color=3D#b2dfee>LOCK_EX</FONT> <FONT color=3D#00ffff>{</FONT> <FONT =
color=3D#cdcd00>2</FONT> <FONT color=3D#00ffff>}</FONT> =
<FONT color=3D#bebebe># the standard Fcntl module. You
</FONT><FONT color=3D#ffa500>sub</FONT> <FONT =
color=3D#b2dfee>LOCK_NB</FONT> <FONT color=3D#00ffff>{</FONT> <FONT =
color=3D#cdcd00>4</FONT> <FONT color=3D#00ffff>}</FONT> =
<FONT color=3D#bebebe># should, but who can tell
</FONT><FONT color=3D#ffa500>sub</FONT> <FONT =
color=3D#b2dfee>LOCK_UN</FONT> <FONT color=3D#00ffff>{</FONT> <FONT =
color=3D#cdcd00>8</FONT> <FONT color=3D#00ffff>}</FONT> =
<FONT color=3D#bebebe># how those chips fall?
</FONT>
<FONT color=3D#ffa500>my</FONT><FONT color=3D#00ffff>(</FONT><FONT =
color=3D#9ac0cd>$oldval</FONT>, <FONT color=3D#9ac0cd>$fd</FONT>, <FONT =
color=3D#9ac0cd>$db</FONT>, <FONT color=3D#cdcd00>%db</FONT>, <FONT =
color=3D#9ac0cd>$value</FONT>, <FONT color=3D#9ac0cd>$key</FONT><FONT =
color=3D#00ffff>);</FONT>
$key =3D <FONT color=3D#ff7f50>shift</FONT> || <FONT =
color=3D#00cd00>'default'</FONT><FONT color=3D#00ffff>;</FONT>
$value =3D <FONT color=3D#ff7f50>shift</FONT> || <FONT =
color=3D#00cd00>'magic'</FONT><FONT color=3D#00ffff>;</FONT>
$value .=3D <FONT color=3D#00cd00>" $$"</FONT><FONT =
color=3D#00ffff>;</FONT>
$db =3D <FONT color=3D#ff7f50>tie</FONT><FONT =
color=3D#00ffff>(</FONT><FONT color=3D#cdcd00>%db</FONT>, <FONT =
color=3D#00cd00>'DB_File'</FONT>, <FONT =
color=3D#00cd00>'/tmp/foo.db'</FONT>, O_CREAT|O_RDWR, <FONT =
color=3D#cdcd00>0666</FONT><FONT color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"dbcreat /tmp/foo.db $!"</FONT><FONT =
color=3D#00ffff>;</FONT>
$fd =3D $db->fd<FONT color=3D#00ffff>;</FONT> =
<FONT color=3D#bebebe># need this for locking
</FONT><FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: db =
fd is $fd\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#98fb98>open</FONT><FONT color=3D#00ffff>(</FONT>DB_FH, =
<FONT color=3D#00cd00>"+<&=3D$fd"</FONT><FONT =
color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"dup $!"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>unless</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#98fb98>flock</FONT> <FONT color=3D#00ffff>(</FONT>DB_FH, =
LOCK_SH | LOCK_NB<FONT color=3D#00ffff>))</FONT> <FONT =
color=3D#00ffff>{</FONT>
<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: =
CONTENTION; can't read during write update!
Waiting for read lock ($!) ...."</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>unless</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#98fb98>flock</FONT> <FONT =
color=3D#00ffff>(</FONT>DB_FH, LOCK_SH<FONT color=3D#00ffff>))</FONT> =
<FONT color=3D#00ffff>{</FONT> <FONT color=3D#ffa500>die</FONT> <FONT =
color=3D#00cd00>"flock: $!"</FONT> <FONT color=3D#00ffff>}</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: Read lock =
granted\n"</FONT><FONT color=3D#00ffff>;</FONT>
$oldval =3D <FONT color=3D#cdcd00>$db</FONT><FONT =
color=3D#00ffff>{</FONT>$key<FONT color=3D#00ffff>};</FONT>
<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: Old value =
was $oldval\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#98fb98>flock</FONT><FONT color=3D#00ffff>(</FONT>DB_FH, =
LOCK_UN<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#ffa500>unless</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#98fb98>flock</FONT> <FONT color=3D#00ffff>(</FONT>DB_FH, =
LOCK_EX | LOCK_NB<FONT color=3D#00ffff>))</FONT> <FONT =
color=3D#00ffff>{</FONT>
<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: =
CONTENTION; must have exclusive lock!
Waiting for write lock ($!) ...."</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>unless</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#98fb98>flock</FONT> <FONT =
color=3D#00ffff>(</FONT>DB_FH, LOCK_EX<FONT color=3D#00ffff>))</FONT> =
<FONT color=3D#00ffff>{</FONT> <FONT color=3D#ffa500>die</FONT> <FONT =
color=3D#00cd00>"flock: $!"</FONT> <FONT color=3D#00ffff>}</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: Write lock =
granted\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#cdcd00>$db</FONT><FONT color=3D#00ffff>{</FONT>$key<FONT =
color=3D#00ffff>}</FONT> =3D $value<FONT color=3D#00ffff>;</FONT>
$db->sync<FONT color=3D#00ffff>;</FONT> <FONT color=3D#bebebe># to =
flush
</FONT><FONT color=3D#98fb98>sleep</FONT> <FONT =
color=3D#cdcd00>10</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#98fb98>flock</FONT><FONT color=3D#00ffff>(</FONT>DB_FH, =
LOCK_UN<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#ff7f50>undef</FONT> $db<FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ff7f50>untie</FONT> <FONT color=3D#cdcd00>%db</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#98fb98>close</FONT><FONT =
color=3D#00ffff>(</FONT>DB_FH<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: Updated db =
to $key=3D$value\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN772>Sorting Large DBM Files</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
<TBODY>
<TR>
<TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>DB_File</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe># specify the Perl sub to do key comparison using =
the
# exported $DB_BTREE hash reference
</FONT>$DB_BTREE-><FONT color=3D#00ffff>{</FONT><FONT =
color=3D#00cd00>'compare'</FONT><FONT color=3D#00ffff>}</FONT> =3D <FONT =
color=3D#ffa500>sub</FONT> <FONT color=3D#00ffff>{</FONT>
<FONT color=3D#ffa500>my</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#9ac0cd>$key1</FONT>, <FONT color=3D#9ac0cd>$key2</FONT><FONT =
color=3D#00ffff>)</FONT> =3D <FONT color=3D#cdad00>@_</FONT> <FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>return</FONT> <FONT =
color=3D#00cd00>"\L$key1"</FONT> <FONT color=3D#98fb98>cmp</FONT> <FONT =
color=3D#00cd00>"\L$key2"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>};</FONT>
<FONT color=3D#ff7f50>tie</FONT><FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdcd00>%hash</FONT>, <FONT color=3D#00cd00>"DB_File"</FONT>, =
$filename, O_RDWR|O_CREAT, <FONT color=3D#cdcd00>0666</FONT>, =
$DB_BTREE<FONT color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"can't tie $filename: $!"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
# <FONT size=3D-1><A =
href=3D"http://pleac.sourceforge.net/include/perl/ch14/sortdemo">download=
the following standalone program</A></FONT>
#!/usr/bin/perl
# sortdemo - show auto dbm sorting
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>strict</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>DB_File</FONT><FONT color=3D#00ffff>;</FONT>
$DB_BTREE-><FONT color=3D#00ffff>{</FONT><FONT =
color=3D#00cd00>'compare'</FONT><FONT color=3D#00ffff>}</FONT> =3D <FONT =
color=3D#ffa500>sub</FONT> <FONT color=3D#00ffff>{</FONT>
<FONT color=3D#ffa500>my</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#9ac0cd>$key1</FONT>, <FONT color=3D#9ac0cd>$key2</FONT><FONT =
color=3D#00ffff>)</FONT> =3D <FONT color=3D#cdad00>@_</FONT> <FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#00cd00>"\L$key1"</FONT> <FONT =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -