#!/usr/bin/perl 

#    The MySQL General Purpose Stored Routines Library
#    Copyright (C) 2005 Giuseppe Maxia, Stardata s.r.l.
#    Contacts: http://www.stardata.it/contatti_en.html
#
#    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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

package main;
use strict;
use warnings;
use DBI;
use lib ".";
use Test::mysql_sr_lib; # qw(test_connection get_result do_query);
use Test::More;
use Data::Dumper;
use English qw( -no_match_vars );
our $VERSION = 0.01;

# -----------------------------------------------------------
# this script is now DEPRECATED
# You should rather use the mysql script, for reason of
# portability
#
# If you'd rather use this script, comment the following
# two statements.
# -----------------------------------------------------------

print "*** This script is DEPRECATED. See the source for comments\n";
exit;

my $HOST = shift || 'localhost';
my $DB   = shift || 'glob';
my $CONF = shift || "$ENV{HOME}/.my.cnf";

my $dbh = test_connection($HOST,$DB,$CONF, 91) or die;

my $array_name = 'testmore';

ok(  get_result( qq{select arrays_available()}),
    'available');

ok( defined get_result( qq{select array_drop(?)},  $array_name),
    'drop');

ok(  get_result( qq{select array_create(?,?)}, $array_name, 0 ),
    'creation function');

ok(  do_query('@array_create', qq{call array_create(?,?)}, $array_name, 0 ),
    'creation procedure');

ok( get_result( qq{select \@array_create}),
    'creation procedure');

ok( 0 == get_result(qq{select array_size(?)}, $array_name), 
    'empty array');

ok( get_result(qq{select array_push(?,?)}, $array_name, 'one'),
    'array push');

ok( 1 == get_result(qq{select array_size(?)}, $array_name),
    'array size');

ok( get_result(qq{select array_set(?,?,?)}, $array_name, 1, 'two'),
    'array set');

ok( 2 == get_result(qq{select array_size(?)}, $array_name),
    'array size');

ok( get_result(qq{select array_set(?,?,?)}, $array_name, 1, 'two again'),
    'array set same index');

ok( 2 == get_result(qq{select array_size(?)}, $array_name),
    'array size');

ok( 'two again' eq  get_result(qq{select array_pop(?)}, $array_name),
    'array pop');

ok( 'one' eq get_result(qq{select array_pop(?)}, $array_name),
    'array pop');

ok( 0 == get_result(qq{select array_size(?)}, $array_name),
    'array size');

ok( 1 == get_result(qq{select array_drop(?)}, $array_name),
    'array drop');

ok( 0 == get_result(qq{select array_exists(?)}, $array_name),
    'array exists');

ok( 1 == get_result(qq{select array_set_value_by_index(?,?,?)}, $array_name, 0, 'one'),
    'array set value by index');

ok( 2 == get_result(qq{select array_set_value_by_index(?,?,?)}, $array_name, 1, 'two'),
    'array set value by index');

ok( 3 == get_result(qq{select array_set_value_by_key(?,?,?)}, $array_name, 'one', 'three'),
    'array set value by key');

ok( 4 == get_result(qq{select array_set_value_by_key(?,?,?)}, $array_name, 'two', 'four'),
    'array set value by key');

ok( 4 == get_result(qq{select array_set_value_by_key(?,?,?)}, $array_name, 'two', 'five'),
    'array set value by key (same key)');

ok( 1 == get_result(qq{select array_drop(?)}, $array_name),
    'array drop');

ok( 1 ==  do_query('@array_unshift',qq{call array_unshift(?,?)}, $array_name, 'one'),
    'array unshift');

ok( 2 == do_query('@array_unshift',qq{call array_unshift(?,?)}, $array_name, 'two'),
    'array unshift');  # now 'two' is in first position

ok( 'two' eq get_result(qq{select array_shift(?)}, $array_name),
    'array shift'); 

ok( 'one' eq get_result(qq{select array_shift(?)}, $array_name),
    'array shift');

ok( 0 == get_result(qq{select array_size(?)}, $array_name),
    'array size');

ok( 1 ==  do_query('@array_push',qq{call array_push(?,?)}, $array_name, 'one'),
    'array push');

ok( 2 == do_query('@array_push',qq{call array_push(?,?)}, $array_name, 'two'),
    'array push');  

ok( 'two' eq get_result(qq{select array_pop(?)}, $array_name),
    'array pop'); 

ok( 'one' eq get_result(qq{select array_pop(?)}, $array_name),
    'array pop');

ok( 0 == get_result(qq{select array_size(?)}, $array_name),
    'array size');

ok( 1 == do_query('@array_drop',qq{call array_drop(?)}, $array_name),
    'array drop');  

ok( 0 < do_query('@array_create',qq{call array_create(?,?)}, $array_name, 400),
    'array create');  

ok( 400 == get_result(qq{select array_size(?)}, $array_name),
    'array size');

ok( 1 == get_result(qq{select array_clear(?)}, $array_name),
    'array clear');

ok( 0 == get_result(qq{select array_size(?)}, $array_name),
    'array size');

my $list = join(q{,}, ('a' .. 'z') );

ok( $array_name eq get_result(qq{select array_from_list(?,?)}, $list, $array_name),
    'array from list');

ok( 26 == get_result(qq{select array_size(?)}, $array_name),
    'array size');

$list = join(q{::}, ('a' .. 'z') );

ok( $array_name eq  get_result(qq{select array_from_list_complete(?,?,'::')}, $list, $array_name),
    'array from list');

ok( 26 == get_result(qq{select array_size(?)}, $array_name),
    'array size');

ok( 'z' eq get_result(qq{select array_pop(?)}, $array_name),
    'array pop'); 

ok( 'a' eq get_result(qq{select array_shift(?)}, $array_name),
    'array shift'); 

$list = join(q{::}, map { "$_=>$_$_" } ('a' .. 'h') );

ok( $array_name eq  get_result(qq{select array_from_pair_list_complete(?,?,'::','=>')}, 
        $list, $array_name),
    'array from pair list');

ok( 'hh' eq get_result(qq{select array_get(?,?)}, $array_name,'h'),
    'array get'); 

ok( 'aa' eq get_result(qq{select array_get(?,?)}, $array_name,'a'),
    'array get'); 

ok( $list eq get_result(qq{select array_to_pair_list_complete(?,'::','=>')}, $array_name),
    'array to pair list complete');

$list =~ s/::/,/xg;

ok( $list eq get_result( qq{select array_to_pair_list(?)}, $array_name),
    'array to pair list');

ok( 7 == get_result( qq{select array_max_index(?)}, $array_name),  
    'array max index');

my $new_array_name = 'testagain';

ok(defined do_query( undef, qq{ 
    call  for_each_counter(0, 
                array_max_index("$array_name" ),1, 
                                'call array_set("$new_array_name", "\$N", 
                                    array_get("$array_name", "\$N") )' ) }),  
    'array copy');

ok( 1 ==  get_result(qq{select array_size(?) = array_size(?) },$array_name, $new_array_name ),
    'array size');

my $array_name1 = 'testx';
my $array_name2 = 'testy';
my $array_sorted = 'tests';
my $array_merged = 'testm';

ok( get_result(qq{select array_from_pair_list('a=>x011,c=>x033,b=>x002',?) }, $array_name1) ,
    'array1 from pair list');

ok( $array_name2 eq get_result(qq{select array_copy(?,?) }, $array_name1, $array_name2) ,
    'array copy');

ok( 1 ==  get_result(qq{select array_size(?) = array_size(?) }, $array_name1, $array_name2 ),
    'array size after copy');

ok( 1 ==  get_result(qq{select array_get(?,0) = array_get(?,0) }, $array_name1, $array_name2 ),
    'array contents first');

ok( 1 ==  get_result(qq{select array_get(?,array_max_index(?)) = array_get(?,array_max_index(?)) },
     $array_name1, $array_name1, $array_name2, $array_name2 ),
    'array contents last');

ok( get_result(qq{select array_from_pair_list('aa=>y011,c=>y033,bb=>y002',?) }, $array_name2) ,
    'array2 from pair list');

ok( $array_sorted eq get_result(qq{select array_sort(?,?) }, $array_name1, $array_sorted) ,
    'array sorted by value');

ok( 'x002' eq  get_result(qq{select array_get(?,0)  }, $array_sorted ),
    'sorted array contents first');
ok( 'x011' eq  get_result(qq{select array_get(?,1)  }, $array_sorted ),
    'sorted array contents first');

ok( $array_sorted eq get_result(qq{select array_sort_complete(?,?,'K','asc') }, 
    $array_name1, $array_sorted) ,
    'array sorted by key');

ok( 'x011' eq  get_result(qq{select array_get(?,0)  }, $array_sorted ),
    'sorted array (by key) contents first');
ok( 'x002' eq  get_result(qq{select array_get(?,1)  }, $array_sorted ),
    'sorted array (by key) contents second');

ok( $array_sorted eq get_result(qq{select array_sort_complete(?,?,'K','desc') }, 
    $array_name1, $array_sorted) ,
    'array sorted by key (desc)');

ok( 'x033' eq  get_result(qq{select array_get(?,0)  }, $array_sorted ),
    'sorted array (by key desc) contents first');
ok( 'x002' eq  get_result(qq{select array_get(?,1)  }, $array_sorted ),
    'sorted array (by key desc) contents second');

ok( $array_sorted eq get_result(qq{select array_sort_complete(?,?,'V','desc') }, 
    $array_name1, $array_sorted) ,
    'array sorted by value (desc)');

ok( 'x033' eq  get_result(qq{select array_get(?,0)  }, $array_sorted ),
    'sorted array (by value desc) contents first');
ok( 'x011' eq  get_result(qq{select array_get(?,1)  }, $array_sorted ),
    'sorted array (by value desc) contents second');

ok( $array_merged eq get_result(qq{select array_merge_complete(?,?,?,'use_first') },
    $array_name1, $array_name2, $array_merged) ,
    'array merge (use first)');

ok( 5 == get_result(qq{select array_size(?)}, $array_merged),
    'array size');

ok( 'x033' eq  get_result(qq{select array_get(?,'c')  }, $array_merged ),
    'merged array (key conflict uses first)');

ok( $array_merged eq get_result(qq{select array_merge_complete(?,?,?,'use_second') },
    $array_name1, $array_name2, $array_merged) ,
    'array merge (use second)');

ok( 5 == get_result(qq{select array_size(?)}, $array_merged),
    'array size');

ok( 'y033' eq  get_result(qq{select array_get(?,'c')  }, $array_merged ),
    'merged array (key conflict uses second)');

ok( $array_name1 eq get_result(qq{select array_append(?,?) },
    $array_name1, $array_name2) ,
    'array append ');

ok( 5 == get_result(qq{select array_size(?)}, $array_name1),
    'array size');

ok( 'y033' eq  get_result(qq{select array_get(?,'c')  }, $array_name1 ),
    'appended array (key conflict uses second)');

ok( get_result(qq{select array_from_pair_list('a=>x011,c=>x033,b=>x002',?) }, $array_name1) ,
    'array1 from pair list');

ok( $array_merged eq get_result(qq{select array_grep(?,?,'0[1-9][1-9]') },
    $array_name1, $array_merged) ,
    'array grep');

ok( 2 == get_result(qq{select array_size(?)}, $array_merged),
    'array size (grep)');

ok( 'x033' eq  get_result(qq{select array_get(?,'c')  }, $array_merged ),
    'array grep value 1');

ok( 'x011' eq  get_result(qq{select array_get(?,'a')  }, $array_merged ),
    'array grep value 2');

ok( $array_merged eq get_result(qq{select array_grep_complete(?,?,'[^ab]','0[1-9][1-9]') },
    $array_name1, $array_merged) ,
    'array grep complete 1');

ok( 1 == get_result(qq{select array_size(?)}, $array_merged),
    'array size (grep complete 1)');

ok( 'x033' eq  get_result(qq{select array_get(?,'c')  }, $array_merged ),
    'array grep complete 1 value 1');

ok( $array_merged eq get_result(qq{select array_grep_complete(?,?,'[^a]','') },
    $array_name1, $array_merged) ,
    'array grep complete 2');

ok( 2 == get_result(qq{select array_size(?)}, $array_merged),
    'array size (grep complete 2)');

ok( 'x033' eq  get_result(qq{select array_get(?,'c')  }, $array_merged ),
    'array grep complete 2 value 1');

ok( 'x002' eq  get_result(qq{select array_get(?,'b')  }, $array_merged ),
    'array grep complete 2 value 1');


