The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Tie::Array::QueueExpire - Introduction
      Tie::Array::QueueExpire - Tie an ARRAY over a TokyCabinet Btree DB ( see http://tokyocabinet.sourceforge.net )
      Revision: 1.01

SYNOPSIS
      use Tie::Array::QueueExpire;
      my $t = tie( my @myarray, "Tie::Array::QueueExpire", '/tmp/db_test.bdb' );
      push @myarray, int rand 1000;
  
      # normal ARRAY function
      my $data = shift @myarray;
      my $data = pop @myarray;
      print "this elem exists\n"  if (exists( $myarray[6]));
      print "size = ". scalar( @myarray )."\n";
  
      # using the PUSH with an extra parameter to put the new element in futur
      # also return the key of the inserted value
      for ( 1 .. 10 )
      {
        say  "t=".time.'  '.  int (($t->PUSH( $_ . ' ' . time, 10 ))/1000);
        sleep 1;
      }
      sleep 10;  
      # Get the expired elements ( 7 seconds before now )
      my $ex = $t->EXPIRE( 7 );
 
      # Get the expired elements
      my @EXP = @{$t->EXPIRE($exp)};
      # Get and delete the expired elements ( 20 seconds before now )
      $ex =  $t->EXPIRE(20,1);
      my @EXP = @{$t->EXPIRE($exp,1)};
  
      # fetch element
      # in scalar context return the value 
      # in array context return in first element the key and in second, the value
      my $a =$t->FETCH(6);
      my @b = $t->FETCH(6);
      # the normal array fetch is always in scalar mode
      my @c=$myarray[6];
      say Dumper( $a );
      say Dumper( \@b );
      say Dumper( \@c );

DESCRIPTION
      Tie an ARRAY over a TokyCabinet Btree DB and allow to get or deleted expired data;
  
      This module require Time::HiRes, TokyoCabinet (database and perl module.)
      The insertion is ms unique ( 0.001 seconds )
  
      The normal ARRAY function present are
  
      push
      pop
      shift
      exits
      scalar
      clear
      unshift  (but put data 1 second before the first entry)

      The following function is not completely iplemented.
  
      splice
  
      The following function are not implemented.
  
      extend
      store
      STORESIZE

      The following function are specific of this module.
  
      LAST
      FIRST
      EXPIRE
      OPTIMIZE
      PUSH
      FETCH

Basic ARRAY functions
    * *

  tie
            Tie an array over a TokyoCabinet DB
            my $t = tie( my @myarray, "Tie::Array::QueueExpire", '/tmp/db_test.bdb' );
            The fist parameter if the TokyoCabinet file used (or created)
            Four optional parameter are allowed
            In place two, a flag to serialize the data in the DB
            In place three, an octal MASK allow to set the permission of the DB created
                    The default permission is 0600 (-rw-------) 
            In place four a parameter to delete the DB file if present and corrupted
                    The default value is 0 (don't delete the file)
            In place five a parameter to exit on error when opening the DB file
                    The default value is 0 (don't exit, only report error)

  FETCH
            Retrieve a specific key from the array
            my $data = $myarray[6];
            or
            my $data = $t->FETCH(6);
            or 
            my @data = $t->FETCH(6);
            where 
              $data[0] = insertion key
            and 
              $data[1] = value

  FETCHSIZE
            Get the size of the array
            my $data = scalar(@myarray);

  PUSH
            Add an element at the end of the array
            push @myarray , 45646;
            or 
            $t->PUSH( 45646 );
            it is also possible to add an elemnt with a offset expiration 
            $t->PUSH( 45646 , 10 );
            add element in the array to be expired in 10 seconds
            if the offset is negative, add the expiration in past

  EXISTS
            Test if en element in the array exist
            print "element exists\n" if (exits $myarray[5]);
            return the insertion key

  POP
            Extract the latest element from the array (the youngest)
            my $data = pop @myarray;
            or
            my $data = $t->POP();
            or 
            my @data = $t->POP();
            where 
              $data[0] = insertion key
            and 
              $data[1] = value

  SHIFT
            Extract the first element from the array  (the oldest)
            my $data = shift @myarray;
            or
            my $data = $t->SHIFT();
            or 
            my @data = $t->SHIFT();
           where 
              $data[0] = insertion key
            and 
              $data[1] = value

  UNSHIFT
            Add an element in the front of the array
            unshift @myarray , 45646;
            UNSHIFT data 1 mili-second before the first item

  CLEAR
            Delete all element in the array
            $t->CLEAR;

  DESTROY
            Normal destructor call when untied the array
            Normaly never called by user

Specific functions from this module
    * *

  SPLICE
            SPLICE don't allow a list replacement 
            because the insert order is made by time.
            my @tmp   = splice @myarray, 5 ,3;

  LAST
            Get the latest element in the array (oldest)
            my $data = $t->LAST;
            or
            my @data = $t->LAST;
            where 
              $data[0] = insertion key
            and 
              $data[1] = value

  FIRST
            Get the first element in the array (youngest)
            my $data =$t->FIRST;
            or
            my @data = $t->FIRST;
            where 
              $data[0] = insertion key
            and 
              $data[1] = value

  EXPIRE
            Get the elements expired in the array.
            my @ALL = $t->EXPIRE( 1207840028) ;
            return a refernce to an array with all the expired value.
        
            If a second parameter is provided and not null, the data are also deleted from the array.
            my @ALL = $t->EXPIRE( 1207840028 , 1 ) ;
            return a refernce to an array with all the expired value.

  OPTIMIZE
            Function to compact the DB (after a lot of delete )
            $t->OPTIMIZE;

Functions not Implemented
    * *

  EXTEND
            Not implemented because not signifiant for a expiration queue

  STORE
            Not implemented because not signifiant for a expiration queue

  STORESIZE
            Not implemented because not signifiant for a expiration queue

AUTHOR
            Fabrice Dulaunoy <fabrice_at_dulaunoy_dot_com>

SEE ALSO
            - Data::Queue::Persistent from Mischa Spiegelmock, <mspiegelmock_at_gmail_dot_com>
            - TokyoCabinet from Mikio Hirabayashi <mikio_at_users_dot_sourceforge_dot_net>

TODO
            - make test
            - implementation of EXTEND to allow clear of array with @myarray = ();
            - implementation of STORESIZE to allow clear of array with $#myarray = -1;

LICENSE
            Under the GNU GPL2

            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 (at your option) 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
            MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
            See the 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., 59 Temple Place, 
            Suite 330, Boston, MA 02111-1307 USA

            Tie::Array::QueueExpire  Copyright (C) 2004 2005 2006 2007 2008 2009 2010 DULAUNOY Fabrice  
            Tie::Array::QueueExpire comes with ABSOLUTELY NO WARRANTY; 
            for details See: L<http://www.gnu.org/licenses/gpl.html> 
            This is free software, and you are welcome to redistribute 
            it under certain conditions;