OOPS
view release on metacpan or search on metacpan
lib/OOPS/OOPS1003.pm view on Meta::CPAN
ARRAY => '@',
SCALAR => '$',
REF => '$',
GLOB => '*',
CODE => '&',
H => '%',
A => '@',
S => '$',
);
my %perltype2otype = (
HASH => 'H',
ARRAY => 'A',
SCALAR => 'S',
REF => 'S',
);
our $debug_free_tied = 0;
our $debug_tiedvars = 0; # produces no output -- just verification
our $debug_oops_instances = 0; # track allocation / destructions of OOPS::OOPS1003 objects
our $debug_load_object = 0; # basic loading of objects
our $debug_load_values = 0; # loading of all keys & values
our $debug_load_context = 0; # stack trace for each load
our $debug_load_group = 0; # touches: load groups
our $debug_arraylen = 0; # touches: arraylen hash
our $debug_untie = 0;
our $debug_writes = 0;
our $debug_write_object = 0; # write to the object table
our $debug_blessing = 0; # bless operations
our $debug_memory = 0; # touches: memory
our $debug_memory2 = 0; # the memory set/clear routines
our $debug_cache = 0; # touches: cache
our $debug_oldobject = 0; # touches: oldobject
our $debug_refcount = 0; # touches: refchange or refcount
our $debug_touched = 0; # touches: touched
our $debug_commit = 0; # save objects
our $debug_demand_iterator = 0;
our $debug_forcesave = 0;
our $debug_isvirtual = 0;
our $debug_27555 = 0; # touches: 27555 fixup code
our $debug_save_attributes = 0; # near: queries to save pval
our $debug_save_attr_arraylen = 0; # arraylen for attribute save
our $debug_save_attr_context = 0; # stack trace for each attribute save
our $debug_refarray = 0; # array elements as references
our $debug_refalias = 0; # references to other values inside objects
our $debug_refobject = 0; # references to other objects
our $debug_reftarget = 0; # regarding reference target tracking
our $debug_write_ref = 0;
our $debug_write_array = 0; # has ARRAY changed?
our $debug_normalarray = 0; # tied callbacks: non-virtual hash
our $debug_normalhash = 0;
our $debug_write_hash = 0;
our $debug_virtual_delete = 0;
our $debug_virtual_save = 0;
our $debug_virtual_hash = 0; # tied callbacks: virtual hash
our $debug_virtual_ovals = 0; # original values of virtual has
our $debug_hashscalar = 0; # scalar(%tied_hash)
our $debug_object_id = 0; # details of id allocation
our $debug_getobid_context = 0; # stack trace for new objects
our $debug_dbidelay = 0; # add small delay before chaning transaction mode
our $debug_tdelay = 150000; # loop size for busy wait
our $debug_dbi = 0; # DBI debug level: 0 or 1 or 2
# debug set for ref.t
$debug_27555 = $debug_write_ref = $debug_load_object = $debug_load_values = $debug_memory = $debug_commit = $debug_refalias = $debug_write_ref = 1 if 0;
my $global_destruction = 0;
our %tiedvars;
tie my %qtype, 'OOPS::OOPS1003::debug', sub { return reftype($_[0]) };
tie my %qref, 'OOPS::OOPS1003::debug', sub { return ref($_[0]) };
tie my %qaddr, 'OOPS::OOPS1003::debug', sub { return refaddr($_[0]) };
tie my %qnone, 'OOPS::OOPS1003::debug', sub { $_[0] };
tie my %qmakeref, 'OOPS::OOPS1003::debug', sub { \$_[0] };
tie my %qval, 'OOPS::OOPS1003::debug', sub { return defined $_[0] ? (ref($_[0]) ? "$_[0] \@ $qaddr{$_[0]}" : "'$_[0]'") : 'undef' };
tie my %qplusminus, 'OOPS::OOPS1003::debug', sub { $_[0] >= 0 ? "+$_[0]" : $_[0] };
tie my %caller, 'OOPS::OOPS1003::debug', sub { my $lvls = $_[0]+1; my ($p,$f,$l) = caller($lvls); my $s = (caller($lvls+1))[3]; $s =~ s/OOPS::OOPS1003:://; $l = $f eq __FILE__ ? $l : "$f:$l"; return "$s/$l" };
tie my %qmemval, 'OOPS::OOPS1003::debug', sub { my $v = shift; return "*$v" unless ref $v; return "*$v->[0]/$qval{$v->[1]}" };
tie my %qsym, 'OOPS::OOPS1003::debug', sub { return $typesymbol{reftype(shift)} };
sub OOPS::OOPS1003::debug::TIEHASH { my $p = shift; return bless shift, $p }
sub OOPS::OOPS1003::debug::FETCH { my $f = shift; return &$f(shift) }
sub new
{
my ($pkg, %args) = @_;
my $oops = {
otype => {}, # object id -> H(ash)/A(rray)/S(scalar or ref)
loadgroup => {}, # object id -> object loadgroup #
loadgrouplock => {}, # object id -> object id
groupset => {}, # group id -> object id -> 1
cache => {}, # object id -> actual object
memory => {}, # ref memory location -> object id
memory2key => {}, # ref mem location -> [ object id, object key ]
new_memory => {}, # ref memory location -> object id
new_memory2key => {}, # ref mem location -> [ object id, object key ]
memrefs => {}, # ref mem location -> ref
memcount => {}, # ref mem location -> count of active references
deleted => {}, # object id -> has been deleted
unwatched => {}, # object id -> must check at save
virtual => {}, # object id -> is it virtual? yes=V, no=' '
arraylen => {}, # object id -> integer; array length
reftarg => {}, # object id -> boolean: '0' || 'T';
aliasdest => {}, # object id -> hash of objectids that reference id
oldvalue => {}, # object id & pkey -> original pval
oldobject => {}, # object id & pkey -> original object id reference
oldbig => {}, # object id & pkey -> checksum
objtouched => {}, # objedt id -> bit - object may need saving
demandwritten => {}, # object id -> tie control object
demandwrite => {}, # object id -> write this one via tied.
refcount => {}, # object id -> reference count
refchange => {}, # object id -> change in reference count (during commit())
forcesave => {}, # object id -> bit - for object row to be re-written XXX redesign
do_forcesave => 0, # always update object row when attributes change
savedone => {}, # during commit() - object written?
refstowrite => [], # during commit() - list of reference objects to save
loaded => 0, # number of objects "in memory"
tountie => {}, # scalars wishing to be untied
( run in 1.034 second using v1.01-cache-2.11-cpan-437f7b0c052 )