⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 curia.pm

📁 harvest是一个下载html网页得机器人
💻 PM
📖 第 1 页 / 共 2 页
字号:
#=================================================================================================# Perl API of Curia, the extended API of QDBM#                                                       Copyright (C) 2000-2003 Mikio Hirabayashi# This file is part of QDBM, Quick Database Manager.# QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU# Lesser General Public License as published by the Free Software Foundation; either version# 2.1 of the License or any later version.  QDBM is distributed in the hope that it will be# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more# details.# You should have received a copy of the GNU Lesser General Public License along with QDBM; if# not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA# 02111-1307 USA.#=================================================================================================package Curia;use strict;use warnings;require Tie::Hash;require Exporter;require DynaLoader;our @ISA = qw(Tie::Hash Exporter DynaLoader);our $VERSION = '1.0';bootstrap Curia $VERSION;use constant TRUE => 1;                  # boolean trueuse constant FALSE => 0;                 # boolean falseuse constant OREADER => 1 << 0;          # open as a readeruse constant OWRITER => 1 << 1;          # open as a writeruse constant OCREAT => 1 << 2;           # a writer creatinguse constant OTRUNC => 1 << 3;           # a writer truncatinguse constant ONOLCK => 1 << 4;           # open without lockinguse constant DOVER => 0;                 # overwrite an existing valueuse constant DKEEP => 1;                 # keep an existing valueuse constant DCAT => 2;                  # concatenate valuesmy(%handles) = ();                       # table of database namesour($errmsg) = "no error";               # message of the last error#=================================================================================================# public objects#=================================================================================================### use Curia;# Module `Curia' should be included in application codes.# An instance of the class `Curia' is used as a database handle.#### $Curia::errmsg;# Global Variable: The message of the last happened error.#### $curia = new Curia($name, $omode, $bnum, $dnum);# Constructor: Get the database handle.# `$name' specifies the name of a database directory.# `$omode' specifies the connection mode: `Curia::OWRITER' as a writer, `Curia::OREADER' as a# reader.  If the mode is `Curia::OWRITER', the following may be added by bitwise or:# `Curia::OCREAT', which means it creates a new database if not exist, `Curia::OTRUNC', which# means it creates a new database regardless if one exists.  Both of `Curia::OREADER' and# `Curia::OWRITER' can be added to by bitwise or: `Curia::ONOLCK', which means it opens a# database directory without file locking.  If it is undef, `Curia::OREADER' is specified.# `$bnum' specifies the number of elements of the bucket array.  If it is undef or not more# than 0, the default value is specified.  The size of a bucket array is determined on creating,# and can not be changed except for by optimization of the database.  Suggested size of a# bucket array is about from 0.5 to 4 times of the number of all records to store.# `$dnum' specifies the number of division of the database. If it is undef or not more than 0,# the default value is specified.  The number of division can not be changed from the initial# value.  The max number of division is 512.# The return value is the database handle or undef if it is not successful.# While connecting as a writer, an exclusive lock is invoked to the database directory.# While connecting as a reader, a shared lock is invoked to the database directory.  The thread# blocks until the lock is achieved.  If `Curia::ONOLCK' is used, the application is responsible# for exclusion control.#sub new {    my($class) = shift;    my($name) = shift;    my($omode) = shift;    my($bnum) = shift;    my($dnum) = shift;    (defined($name) && length($name) > 0 && scalar(@_) == 0) || return undef();    (!$handles{$name}) || return undef();    (defined($omode)) || ($omode = OREADER);    (defined($bnum)) || ($bnum = -1);    (defined($dnum)) || ($dnum = -1);    my($curia) = plcropen($name, $omode, $bnum, $dnum);    $errmsg = plcrerrmsg();    ($curia > 0) || return undef();    $handles{$name} = $curia;    my $self = [$name, TRUE, undef(), undef(), undef(), undef()];    bless($self, $class);    return $self;}### $bool = $curia->close();# Method: Close the database handle.# If successful, the return value is true, else, it is false.# Because the region of a closed handle is released, it becomes impossible to use the handle.# Updating a database is assured to be written when the handle is closed.  If a writer opens# a database but does not close it appropriately, the database will be broken.#sub close {    my($self) = shift;    ($$self[1]) || return FALSE;    (scalar(@_) == 0) || return FALSE;    $$self[1] = FALSE;    my($curia) = $handles{$$self[0]};    my($rv) = plcrclose($curia);    $errmsg = plcrerrmsg();    delete($handles{$$self[0]});    return $rv;}### $bool = $curia->put($key, $val, $dmode);# Method: Store a record.# `$key' specifies a key.  If it is undef, this method has no effect.# `$val' specifies a value.  If it is undef, this method has no effect.# `$dmode' specifies behavior when the key overlaps, by the following values: `Curia::DOVER',# which means the specified value overwrites the existing one, `Curia::DKEEP', which means the# existing value is kept, `Curia::DCAT', which means the specified value is concatenated at# the end of the existing value.  If it is undef, `Curia::DOVER' is specified.# If successful, the return value is true, else, it is false.#sub put {    my($self) = shift;    ($$self[1]) || return FALSE;    my($key) = shift;    my($val) = shift;    my($dmode) = shift;    (scalar(@_) == 0) || return FALSE;    (defined($key) && defined($val)) || return FALSE;    (defined($dmode)) || ($dmode = DOVER);    my($curia) = $handles{$$self[0]};    if($$self[2]){        local($_) = $key;        $$self[2]();        $key = $_;    }    if($$self[3]){        local($_) = $val;        $$self[3]();        $val = $_;    }    my($rv) = plcrput($curia, $key, length($key), $val, length($val), $dmode);    $errmsg = plcrerrmsg();    return $rv;}### $bool = $curia->out($key);# Method: Delete a record.# `$key' specifies a key.  If it is undef, this method has no effect.# If successful, the return value is true, else, it is false.  False is returned when no# record corresponds to the specified key.#sub out {    my($self) = shift;    ($$self[1]) || return FALSE;    my($key) = shift;    (scalar(@_) == 0) || return FALSE;    (defined($key)) || return FALSE;    my($curia) = $handles{$$self[0]};    if($$self[2]){        local($_) = $key;        $$self[2]();        $key = $_;    }    my($rv) = plcrout($curia, $key, length($key));    $errmsg = plcrerrmsg();    return $rv;}### $str = $curia->get($key, $start, $max);# Method: Retrieve a record.# `$key' specifies a key.  If it is undef, this method has no effect.# `$start' specifies the offset address of the beginning of the region of the value to be read.# If it is negative or undef, the offset is specified as 0.# `$max' specifies the max size to be read.  If it is negative or undef, the size to read is# unlimited.# If successful, the return value is a scalar of the value of the corresponding record, else, it# is undef.  undef is returned when no record corresponds to the specified key or the size of# the value of the corresponding record is less than `$start'.#sub get {    my($self) = shift;    ($$self[1]) || return undef();    my($key) = shift;    my($start) = shift;    my($max) = shift;    (scalar(@_) == 0) || return undef();    (defined($key)) || return undef();    (defined($start) && $start >= 0) || ($start = 0);    (defined($max) && $start >= 0) || ($max = -1);    my($curia) = $handles{$$self[0]};    if($$self[2]){        local($_) = $key;        $$self[2]();        $key = $_;    }    my($rv) = plcrget($curia, $key, length($key), $start, $max);    $errmsg = plcrerrmsg();    if($rv && $$self[5]){        local($_) = $rv;        $$self[5]();        $rv = $_;    }    return $rv;}### $num = $curia->vsiz($key);# Method: Get the size of the value of a record.# `$key' specifies a key.  If it is undef, this method has no effect.# If successful, the return value is the size of the value of the corresponding record, else,# it is -1.# Because this method does not read the entity of a record, it is faster than `get'.#sub vsiz {    my($self) = shift;    ($$self[1]) || return -1;    my($key) = shift;    (scalar(@_) == 0) || return -1;    (defined($key)) || return -1;    my($curia) = $handles{$$self[0]};    if($$self[2]){        local($_) = $key;        $$self[2]();        $key = $_;    }    my($rv) = plcrvsiz($curia, $key, length($key));    $errmsg = plcrerrmsg();    return $rv;}### $bool = $curia->iterinit();# Method: Initialize the iterator of the database handle.# If successful, the return value is true, else, it is false.# The iterator is used in order to access the key of every record stored in a database.#sub iterinit {    my($self) = shift;    ($$self[1]) || return FALSE;    (scalar(@_) == 0) || return FALSE;    my($curia) = $handles{$$self[0]};    my($rv) = plcriterinit($curia);    $errmsg = plcrerrmsg();    return $rv;}### $str = $curia->iternext();# Method: Get the next key of the iterator.# If successful, the return value is a scalar of the value of the next key, else, it is undef.# undef is returned when no record is to be get out of the iterator.# It is possible to access every record by iteration of calling this method.  However, it is# not assured if updating the database is occurred while the iteration.  Besides, the order of# this traversal access method is arbitrary, so it is not assured that the order of storing# matches the one of the traversal access.#sub iternext {    my($self) = shift;    ($$self[1]) || return undef();    (scalar(@_) == 0) || return undef();    my($curia) = $handles{$$self[0]};    my($rv) = plcriternext($curia);    $errmsg = plcrerrmsg();    if($rv && $$self[4]){        local($_) = $rv;        $$self[4]();        $rv = $_;    }    return $rv;}### $bool = $curia->setalign($align);# Method: Set alignment of the database handle.# `$align' specifies the basic size of alignment.  If it is undef, alignment is cleared.# If successful, the return value is true, else, it is false.# If alignment is set to a database, the efficiency of overwriting values are improved.# The size of alignment is suggested to be average size of the values of the records to be# stored.  If alignment is positive, padding whose size is multiple number of the alignment# is placed.  If alignment is negative, as `vsiz' is the size of a value, the size of padding# is calculated with `(vsiz / pow(2, abs(align) - 1))'.  Because alignment setting is not# saved in a database, you should specify alignment every opening a database.#sub setalign {    my($self) = shift;    ($$self[1]) || return FALSE;    my($align) = shift;    (defined($align)) || ($align = 0);    (scalar(@_) == 0) || return FALSE;    my($curia) = $handles{$$self[0]};    my($rv) = plcrsetalign($curia, $align);    $errmsg = plcrerrmsg();    return $rv;}### $bool = $curia->sync();# Method: Synchronize updating contents with the files and the devices.# If successful, the return value is true, else, it is false.# This method is useful when another process uses the connected database directory.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -