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

📄 dbi.pm

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 PM
📖 第 1 页 / 共 5 页
字号:
	can		=> { O=>0x0100 }, # special case, see dispatch	debug 	 	=> { U =>[1,2,'[$debug_level]'],	O=>0x0004 }, # old name for trace	dump_handle 	=> { U =>[1,3,'[$message [, $level]]'],	O=>0x0004 },	err		=> $keeperr,	errstr		=> $keeperr,	state		=> $keeperr,	func	   	=> { O=>0x0006	},	parse_trace_flag   => { U =>[2,2,'$name'],	O=>0x0404, T=>8 },	parse_trace_flags  => { U =>[2,2,'$flags'],	O=>0x0404, T=>8 },	private_data	=> { U =>[1,1],			O=>0x0004 },	set_err		=> { U =>[3,6,'$err, $errmsg [, $state, $method, $rv]'], O=>0x0010 },	trace		=> { U =>[1,3,'[$trace_level, [$filename]]'],	O=>0x0004 },	trace_msg	=> { U =>[2,3,'$message_text [, $min_level ]' ],	O=>0x0004, T=>8 },	swap_inner_handle => { U =>[2,3,'$h [, $allow_reparent ]'] },        private_attribute_info => { },    },    dr => {		# Database Driver Interface	'connect'  =>	{ U =>[1,5,'[$db [,$user [,$passwd [,\%attr]]]]'], H=>3, O=>0x8000 },	'connect_cached'=>{U=>[1,5,'[$db [,$user [,$passwd [,\%attr]]]]'], H=>3, O=>0x8000 },	'disconnect_all'=>{ U =>[1,1], O=>0x0800 },	data_sources => { U =>[1,2,'[\%attr]' ], O=>0x0800 },	default_user => { U =>[3,4,'$user, $pass [, \%attr]' ] },    },    db => {		# Database Session Class Interface	data_sources	=> { U =>[1,2,'[\%attr]' ], O=>0x0200 },	take_imp_data	=> { U =>[1,1], O=>0x10000 },	clone   	=> { U =>[1,2,'[\%attr]'] },	connected   	=> { U =>[1,0], O => 0x0004 },	begin_work   	=> { U =>[1,2,'[ \%attr ]'], O=>0x0400 },	commit     	=> { U =>[1,1], O=>0x0480|0x0800 },	rollback   	=> { U =>[1,1], O=>0x0480|0x0800 },	'do'       	=> { U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x3200 },	last_insert_id	=> { U =>[5,6,'$catalog, $schema, $table_name, $field_name [, \%attr ]'], O=>0x2800 },	preparse    	=> {  }, # XXX	prepare    	=> { U =>[2,3,'$statement [, \%attr]'],                    O=>0xA200 },	prepare_cached	=> { U =>[2,4,'$statement [, \%attr [, $if_active ] ]'],   O=>0xA200 },	selectrow_array	=> { U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x2000 },	selectrow_arrayref=>{U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x2000 },	selectrow_hashref=>{ U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x2000 },	selectall_arrayref=>{U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x2000 },	selectall_hashref=>{ U =>[3,0,'$statement, $keyfield [, \%attr [, @bind_params ] ]'], O=>0x2000 },	selectcol_arrayref=>{U =>[2,0,'$statement [, \%attr [, @bind_params ] ]'], O=>0x2000 },	ping       	=> { U =>[1,1], O=>0x0404 },	disconnect 	=> { U =>[1,1], O=>0x0400|0x0800|0x10000 },	quote      	=> { U =>[2,3, '$string [, $data_type ]' ], O=>0x0430 },	quote_identifier=> { U =>[2,6, '$name [, ...] [, \%attr ]' ],    O=>0x0430 },	rows       	=> $keeperr,	tables          => { U =>[1,6,'$catalog, $schema, $table, $type [, \%attr ]' ], O=>0x2200 },	table_info      => { U =>[1,6,'$catalog, $schema, $table, $type [, \%attr ]' ],	O=>0x2200|0x8800 },	column_info     => { U =>[5,6,'$catalog, $schema, $table, $column [, \%attr ]'],O=>0x2200|0x8800 },	primary_key_info=> { U =>[4,5,'$catalog, $schema, $table [, \%attr ]' ],	O=>0x2200|0x8800 },	primary_key     => { U =>[4,5,'$catalog, $schema, $table [, \%attr ]' ],	O=>0x2200 },	foreign_key_info=> { U =>[7,8,'$pk_catalog, $pk_schema, $pk_table, $fk_catalog, $fk_schema, $fk_table [, \%attr ]' ], O=>0x2200|0x8800 },	statistics_info => { U =>[6,7,'$catalog, $schema, $table, $unique_only, $quick, [, \%attr ]' ], O=>0x2200|0x8800 },	type_info_all	=> { U =>[1,1], O=>0x2200|0x0800 },	type_info	=> { U =>[1,2,'$data_type'], O=>0x2200 },	get_info	=> { U =>[2,2,'$info_type'], O=>0x2200|0x0800 },    },    st => {		# Statement Class Interface	bind_col	=> { U =>[3,4,'$column, \\$var [, \%attr]'] },	bind_columns	=> { U =>[2,0,'\\$var1 [, \\$var2, ...]'] },	bind_param	=> { U =>[3,4,'$parameter, $var [, \%attr]'] },	bind_param_inout=> { U =>[4,5,'$parameter, \\$var, $maxlen, [, \%attr]'] },	execute		=> { U =>[1,0,'[@args]'], O=>0x1040 },	bind_param_array  => { U =>[3,4,'$parameter, $var [, \%attr]'] },	bind_param_inout_array => { U =>[4,5,'$parameter, \\@var, $maxlen, [, \%attr]'] },	execute_array     => { U =>[2,0,'\\%attribs [, @args]'],         O=>0x1040|0x4000 },	execute_for_fetch => { U =>[2,3,'$fetch_sub [, $tuple_status]'], O=>0x1040|0x4000 },	fetch    	  => undef, # alias for fetchrow_arrayref	fetchrow_arrayref => undef,	fetchrow_hashref  => undef,	fetchrow_array    => undef,	fetchrow   	  => undef, # old alias for fetchrow_array	fetchall_arrayref => { U =>[1,3, '[ $slice [, $max_rows]]'] },	fetchall_hashref  => { U =>[2,2,'$key_field'] },	blob_read  =>	{ U =>[4,5,'$field, $offset, $len [, \\$buf [, $bufoffset]]'] },	blob_copy_to_file => { U =>[3,3,'$field, $filename_or_handleref'] },	dump_results => { U =>[1,5,'$maxfieldlen, $linesep, $fieldsep, $filehandle'] },	more_results => { U =>[1,1] },	finish     => 	{ U =>[1,1] },	cancel     => 	{ U =>[1,1], O=>0x0800 },	rows       =>	$keeperr,	_get_fbav	=> undef,	_set_fbav	=> { T=>6 },    },);while ( my ($class, $meths) = each %DBI::DBI_methods ) {    my $ima_trace = 0+($ENV{DBI_IMA_TRACE}||0);    while ( my ($method, $info) = each %$meths ) {	my $fullmeth = "DBI::${class}::$method";	if ($DBI::dbi_debug >= 15) { # quick hack to list DBI methods	    # and optionally filter by IMA flags	    my $O = $info->{O}||0;	    printf "0x%04x %-20s\n", $O, $fullmeth	        unless $ima_trace && !($O & $ima_trace);	}	DBI->_install_method($fullmeth, 'DBI.pm', $info);    }}{    package DBI::common;    @DBI::dr::ISA = ('DBI::common');    @DBI::db::ISA = ('DBI::common');    @DBI::st::ISA = ('DBI::common');}# End of init codeEND {    return unless defined &DBI::trace_msg; # return unless bootstrap'd ok    local ($!,$?);    DBI->trace_msg(sprintf("    -- DBI::END (\$\@: %s, \$!: %s)\n", $@||'', $!||''), 2);    # Let drivers know why we are calling disconnect_all:    $DBI::PERL_ENDING = $DBI::PERL_ENDING = 1;	# avoid typo warning    DBI->disconnect_all() if %DBI::installed_drh;}sub CLONE {    my $olddbis = $DBI::_dbistate;    _clone_dbis() unless $DBI::PurePerl; # clone the DBIS structure    DBI->trace_msg(sprintf "CLONE DBI for new thread %s\n",	$DBI::PurePerl ? "" : sprintf("(dbis %x -> %x)",$olddbis, $DBI::_dbistate));    while ( my ($driver, $drh) = each %DBI::installed_drh) {	no strict 'refs';	next if defined &{"DBD::${driver}::CLONE"};	warn("$driver has no driver CLONE() function so is unsafe threaded\n");    }    %DBI::installed_drh = ();	# clear loaded drivers so they have a chance to reinitialize}sub parse_dsn {    my ($class, $dsn) = @_;    $dsn =~ s/^(dbi):(\w*?)(?:\((.*?)\))?://i or return;    my ($scheme, $driver, $attr, $attr_hash) = (lc($1), $2, $3);    $driver ||= $ENV{DBI_DRIVER} || '';    $attr_hash = { split /\s*=>?\s*|\s*,\s*/, $attr, -1 } if $attr;    return ($scheme, $driver, $attr, $attr_hash, $dsn);}# --- The DBI->connect Front Door methodssub connect_cached {    # For library code using connect_cached() with mod_perl    # we redirect those calls to Apache::DBI::connect() as well    my ($class, $dsn, $user, $pass, $attr) = @_;    my $dbi_connect_method = ($DBI::connect_via eq "Apache::DBI::connect")	    ? 'Apache::DBI::connect' : 'connect_cached';    $attr = {        $attr ? %$attr : (), # clone, don't modify callers data        dbi_connect_method => $dbi_connect_method,    };    return $class->connect($dsn, $user, $pass, $attr);}sub connect {    my $class = shift;    my ($dsn, $user, $pass, $attr, $old_driver) = my @orig_args = @_;    my $driver;    if ($attr and !ref($attr)) { # switch $old_driver<->$attr if called in old style	Carp::carp("DBI->connect using 'old-style' syntax is deprecated and will be an error in future versions");        ($old_driver, $attr) = ($attr, $old_driver);    }    my $connect_meth = $attr->{dbi_connect_method};    $connect_meth ||= $DBI::connect_via;	# fallback to default    $dsn ||= $ENV{DBI_DSN} || $ENV{DBI_DBNAME} || '' unless $old_driver;    if ($DBI::dbi_debug) {	local $^W = 0;	pop @_ if $connect_meth ne 'connect';	my @args = @_; $args[2] = '****'; # hide password	DBI->trace_msg("    -> $class->$connect_meth(".join(", ",@args).")\n");    }    Carp::croak('Usage: $class->connect([$dsn [,$user [,$passwd [,\%attr]]]])')	if (ref $old_driver or ($attr and not ref $attr) or ref $pass);    # extract dbi:driver prefix from $dsn into $1    $dsn =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i			or '' =~ /()/; # ensure $1 etc are empty if match fails    my $driver_attrib_spec = $2 || '';    # Set $driver. Old style driver, if specified, overrides new dsn style.    $driver = $old_driver || $1 || $ENV{DBI_DRIVER}	or Carp::croak("Can't connect to data source '$dsn' "            ."because I can't work out what driver to use "            ."(it doesn't seem to contain a 'dbi:driver:' prefix "            ."and the DBI_DRIVER env var is not set)");    my $proxy;    if ($ENV{DBI_AUTOPROXY} && $driver ne 'Proxy' && $driver ne 'Sponge' && $driver ne 'Switch') {	my $dbi_autoproxy = $ENV{DBI_AUTOPROXY};	$proxy = 'Proxy';	if ($dbi_autoproxy =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i) {	    $proxy = $1;	    $driver_attrib_spec = join ",",                ($driver_attrib_spec) ? $driver_attrib_spec : (),                ($2                 ) ? $2                  : ();	}	$dsn = "$dbi_autoproxy;dsn=dbi:$driver:$dsn";	$driver = $proxy;	DBI->trace_msg("       DBI_AUTOPROXY: dbi:$driver($driver_attrib_spec):$dsn\n");    }    # avoid recursion if proxy calls DBI->connect itself    local $ENV{DBI_AUTOPROXY};    my %attributes;	# take a copy we can delete from    if ($old_driver) {	%attributes = %$attr if $attr;    }    else {		# new-style connect so new default semantics	%attributes = (	    PrintError => 1,	    AutoCommit => 1,	    ref $attr           ? %$attr : (),	    # attributes in DSN take precedence over \%attr connect parameter	    $driver_attrib_spec ? (split /\s*=>?\s*|\s*,\s*/, $driver_attrib_spec, -1) : (),	);    }    $attr = \%attributes; # now set $attr to refer to our local copy    my $drh = $DBI::installed_drh{$driver} || $class->install_driver($driver)	or die "panic: $class->install_driver($driver) failed";    # attributes in DSN take precedence over \%attr connect parameter    $user = $attr->{Username} if defined $attr->{Username};    $pass = $attr->{Password} if defined $attr->{Password};    delete $attr->{Password}; # always delete Password as closure stores it securely    if ( !(defined $user && defined $pass) ) {        ($user, $pass) = $drh->default_user($user, $pass, $attr);    }    $attr->{Username} = $user; # force the Username to be the actual one used    my $connect_closure = sub {	my ($old_dbh, $override_attr) = @_;        #use Data::Dumper;        #warn "connect_closure: ".Data::Dumper::Dumper([$attr,\%attributes, $override_attr]);	my $dbh;	unless ($dbh = $drh->$connect_meth($dsn, $user, $pass, $attr)) {	    $user = '' if !defined $user;	    $dsn = '' if !defined $dsn;	    # $drh->errstr isn't safe here because $dbh->DESTROY may not have	    # been called yet and so the dbh errstr would not have been copied	    # up to the drh errstr. Certainly true for connect_cached!	    my $errstr = $DBI::errstr;            # Getting '(no error string)' here is a symptom of a ref loop	    $errstr = '(no error string)' if !defined $errstr;	    my $msg = "$class connect('$dsn','$user',...) failed: $errstr";	    DBI->trace_msg("       $msg\n");	    # XXX HandleWarn	    unless ($attr->{HandleError} && $attr->{HandleError}->($msg, $drh, $dbh)) {		Carp::croak($msg) if $attr->{RaiseError};		Carp::carp ($msg) if $attr->{PrintError};	    }	    $! = 0; # for the daft people who do DBI->connect(...) || die "$!";	    return $dbh; # normally undef, but HandleError could change it	}        # merge any attribute overrides but don't change $attr itself (for closure)        my $apply = { ($override_attr) ? (%$attr, %$override_attr ) : %$attr };        # handle basic RootClass subclassing:        my $rebless_class = $apply->{RootClass} || ($class ne 'DBI' ? $class : '');        if ($rebless_class) {            no strict 'refs';            if ($apply->{RootClass}) { # explicit attribute (ie not static methd call class)                delete $apply->{RootClass};                DBI::_load_class($rebless_class, 0);            }            unless (@{"$rebless_class\::db::ISA"} && @{"$rebless_class\::st::ISA"}) {                Carp::carp("DBI subclasses '$rebless_class\::db' and ::st are not setup, RootClass ignored");                $rebless_class = undef;                $class = 'DBI';            }            else {                $dbh->{RootClass} = $rebless_class; # $dbh->STORE called via plain DBI::db                DBI::_set_isa([$rebless_class], 'DBI');     # sets up both '::db' and '::st'                DBI::_rebless($dbh, $rebless_class);        # appends '::db'            }        }	if (%$apply) {            if ($apply->{DbTypeSubclass}) {                my $DbTypeSubclass = delete $apply->{DbTypeSubclass};                DBI::_rebless_dbtype_subclass($dbh, $rebless_class||$class, $DbTypeSubclass);            }	    my $a;	    foreach $a (qw(Profile RaiseError PrintError AutoCommit)) { # do these first		next unless  exists $apply->{$a};		$dbh->{$a} = delete $apply->{$a};	    }	    while ( my ($a, $v) = each %$apply) {		eval { $dbh->{$a} = $v } or $@ && warn $@;	    }	}        # confirm to driver (ie if subclassed) that we've connected sucessfully        # and finished the attribute setup. pass in the original arguments	$dbh->connected(@orig_args); #if ref $dbh ne 'DBI::db' or $proxy;	DBI->trace_msg("    <- connect= $dbh\n") if $DBI::dbi_debug;	return $dbh;    };    my $dbh = &$connect_closure(undef, undef);    $dbh->{dbi_connect_closure} = $connect_closure if $dbh;    return $dbh;}sub disconnect_all {    keys %DBI::installed_drh; # reset iterator    while ( my ($name, $drh) = each %DBI::installed_drh ) {	$drh->disconnect_all() if ref $drh;    }}sub disconnect {		# a regular beginners bug    Carp::croak("DBI->disconnect is not a DBI method (read the DBI manual)");}sub install_driver {		# croaks on failure    my $class = shift;    my($driver, $attr) = @_;    my $drh;    $driver ||= $ENV{DBI_DRIVER} || '';    # allow driver to be specified as a 'dbi:driver:' string    $driver = $1 if $driver =~ s/^DBI:(.*?)://i;    Carp::croak("usage: $class->install_driver(\$driver [, \%attr])")		unless ($driver and @_<=3);    # already installed    return $drh if $drh = $DBI::installed_drh{$driver};    $class->trace_msg("    -> $class->install_driver($driver"			.") for $^O perl=$] pid=$$ ruid=$< euid=$>\n")	if $DBI::dbi_debug;    # --- load the code    my $driver_class = "DBD::$driver";    eval qq{package			# hide from PAUSE		DBI::_firesafe;		# just in case	    require $driver_class;	# load the driver    };    if ($@) {	my $err = $@;	my $advice = "";	if ($err =~ /Can't find loadable object/) {	    $advice = "Perhaps DBD::$driver was statically linked into a new perl binary."		 ."\nIn which case you need to use that new perl binary."		 ."\nOr perhaps only the .pm file was installed but not the shared object file."	}	elsif ($err =~ /Can't locate.*?DBD\/$driver\.pm in \@INC/) {	    my @drv = $class->available_drivers(1);	    $advice = "Perhaps the DBD::$driver perl module hasn't been fully installed,\n"		     ."or perhaps the capitalisation of '$driver' isn't right.\n"		     ."Available drivers: ".join(", ", @drv).".";	}	elsif ($err =~ /Can't load .*? for module DBD::/) {	    $advice = "Perhaps a required shared library or dll isn't installed where expected";	}	elsif ($err =~ /Can't locate .*? in \@INC/) {	    $advice = "Perhaps a module that DBD::$driver requires hasn't been fully installed";

⌨️ 快捷键说明

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