Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
Genezzo::Block::RDBlk_User)Contributed Perl DocumenGenezzo::Block::RDBlk_NN(3)

NAME - Row Directory Block Not Null (array) tied
       hash class.

       This class converts the Genezzo::Block::RDBlkA operations from a
       conventional array to a "Not Null" array.  Genezzo::Block::RDBArray
       uses this class as the basis of a tied array.

       Note: Like its parent RDBlock, this class is almost, but	not quite, a

	use Genezzo::Block::RDBlk_NN;
	use Genezzo::Block::Std;

	local $Genezzo::Block::Std::DEFBLOCKSIZE = 500;

	my $buff = "\0"	x 500; # construct an empty byte buffer

	my %tied_hash =	();

	my $tie_val =
	   tie %tied_hash, 'Genezzo::Block::RDBlk_NN', (refbufstr => \$buff);

	# pushhash style
	# (note	that the "PUSH"	pseudo key is not supported)...
	my $newkey = $tie_val->HPush("this is a	test");

	# or array style, your choice
	my $pushcount =	$tie_val->PUSH(qw(push lots of data));

	$tied_hash{$newkey} = "update this entry";

	# a hash that supports array style FETCHSIZE
	my $getcount = $tie_val->FETCHSIZE(); #	Note: not HCount

	# splice it
	my $err_str;

	my @a1 = $tie_val->HeSplice(\$err_str, 5, 3, qw(more stuff to splice));

       While RDBlkA adds array-like splice capabilities	to RDBlock, violating
       the standard hash abstraction, RDBlk_NN violates	the array abstraction,
       creating	an array subclass called a "Not	Null" array, a sort of
       priority	queue.

   "Not	Null" arrays
       Not Null	arrays are designed to store non-null entries.	Entries	in the
       array which correspond to deleted values	or metadata (see
       Genezzo::Block::RDBlock)	may sometimes get returned as null entries, so
       various array manipulation algorithms should be adjusted	to reflect
       this quirk.  RDBlkA performs a good approximation of a well-behaved
       array, but the requirement to map a strictly ascending series of	array
       offsets onto the	normal data in RDBlock,	which may be interspersed with
       deleted values and metadata, performs at	O(n), versus O(1) for the "Not
       Null" version.

	   Delete can have two outcomes: a deleted entry can disappear
	   (standard outcome), or it can leave a null entry as a "hole".

       RDBlk_NN	support	all standard hash operations, with the exception that
       you cannot create or insert a user key -- you must push new entries and
       use the generated key or	basic iteration	to retrieve your data.

       In addition to the RDBlock standard public methods, RDBlk_NN adds
       HSplice and HeSplice.

       HSplice this, offset, length, LIST
	   Perform the equivalent of "splice" on the array.

	   offset is optional and defaults to zero, negative values count back
	   from	the end	of the array.

	   length is optional and defaults to rest of the array.

	   LIST	may be empty.

	   Returns a list of the original length elements at offset.

       HeSplice	this, error_ref, offset, length, LIST
	   error_ref is	a string ref.  Normally	set to undef, set to error
	   string on failure.


       build simple test cases
       build complex test cases
       test thoroughly
       packdeleted: make this work.  It's broken!
       integration with	bt2 - need to packdelete in bsplit, do null checks in
       leaf blocks (branch blocks should be ok)
       need a validation function to ensure that block maintains invariant:
       small number of leading metadata	rows starting at row zero, followed by
       data rows (deletes ok).	Easier to support non-split rows initially,
       but should be able to support head rows (need mods to splice functions
       to preserve rowstats for	this case).
       need to modify metadata methods so all metadata created in first	n
       could simply have delete	really delete the rows,	so no changes
       necessary for rdblock clients (i.e., no "null rows" generated).

       Jeffrey I. Cohen,


       Copyright (c) 2004 Jeffrey I Cohen.  All	rights reserved.

	   This	program	is free	software; you can redistribute it and/or modify
	   it under the	terms of the GNU General Public	License	as published by
	   the Free Software Foundation; either	version	2 of the License, or
	   any later version.

	   This	program	is distributed in the hope that	it will	be useful,
	   but WITHOUT ANY WARRANTY; without even the implied warranty of
	   GNU General Public License for more details.

	   You should have received a copy of the GNU General Public License
	   along with this program; if not, write to the Free Software
	   Foundation, Inc., 51	Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

       Address bug reports and comments	to:

       For more	information, please visit the Genezzo homepage at

perl v5.32.0			  2005-07-19	   Genezzo::Block::RDBlk_NN(3)


Want to link to this manual page? Use this URL:

home | help