mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 04:26:45 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			221 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| package util ;
 | |
| 
 | |
| package main ;
 | |
| 
 | |
| use strict ;
 | |
| use BerkeleyDB ;
 | |
| use File::Path qw(rmtree);
 | |
| use vars qw(%DB_errors $FA) ;
 | |
| 
 | |
| $| = 1;
 | |
| 
 | |
| %DB_errors = (
 | |
|     'DB_INCOMPLETE'	=> "DB_INCOMPLETE: Sync was unable to complete",
 | |
|     'DB_KEYEMPTY'	=> "DB_KEYEMPTY: Non-existent key/data pair",
 | |
|     'DB_KEYEXIST'	=> "DB_KEYEXIST: Key/data pair already exists",
 | |
|     'DB_LOCK_DEADLOCK'  => "DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock",
 | |
|     'DB_LOCK_NOTGRANTED' => "DB_LOCK_NOTGRANTED: Lock not granted",
 | |
|     'DB_NOTFOUND'	=> "DB_NOTFOUND: No matching key/data pair found",
 | |
|     'DB_OLD_VERSION'	=> "DB_OLDVERSION: Database requires a version upgrade",
 | |
|     'DB_RUNRECOVERY'	=> "DB_RUNRECOVERY: Fatal error, run database recovery",
 | |
| ) ;
 | |
| 
 | |
| # full tied array support started in Perl 5.004_57
 | |
| # just double check.
 | |
| $FA = 0 ;
 | |
| {
 | |
|     sub try::TIEARRAY { bless [], "try" }
 | |
|     sub try::FETCHSIZE { $FA = 1 }
 | |
|     my @a ; 
 | |
|     tie @a, 'try' ;
 | |
|     my $a = @a ;
 | |
| }
 | |
| 
 | |
| {
 | |
|     package LexFile ;
 | |
| 
 | |
|     use vars qw( $basename @files ) ;
 | |
|     $basename = "db0000" ;
 | |
| 
 | |
|     sub new
 | |
|     {
 | |
| 	my $self = shift ;
 | |
|         #my @files = () ;
 | |
|         foreach (@_)
 | |
|         {
 | |
|             $_ = $basename ;
 | |
|             unlink $basename ;
 | |
|             push @files, $basename ;
 | |
|             ++ $basename ;
 | |
|         }
 | |
|  	bless [ @files ], $self ;
 | |
|     }
 | |
| 
 | |
|     sub DESTROY
 | |
|     {
 | |
| 	my $self = shift ;
 | |
| 	#unlink @{ $self } ;
 | |
|     }
 | |
| 
 | |
|     END
 | |
|     {
 | |
|         foreach (@files) { unlink $_ }
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| {
 | |
|     package LexDir ;
 | |
| 
 | |
|     use File::Path qw(rmtree);
 | |
| 
 | |
|     use vars qw( $basename %dirs ) ;
 | |
| 
 | |
|     sub new
 | |
|     {
 | |
|         my $self = shift ;
 | |
|         my $dir = shift ;
 | |
|     
 | |
|         rmtree $dir if -e $dir ;
 | |
|     
 | |
|         mkdir $dir, 0777 or return undef ;
 | |
| 
 | |
|         return bless [ $dir ], $self ;
 | |
|     }
 | |
|     
 | |
|     sub DESTROY 
 | |
|     {
 | |
|         my $self = shift ;
 | |
|         my $dir = $self->[0];
 | |
|         #rmtree $dir;
 | |
|         $dirs{$dir} ++ ;
 | |
|     }
 | |
| 
 | |
|     END
 | |
|     {
 | |
|         foreach (keys %dirs) {
 | |
|             rmtree $_ if -d $_ ;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| {
 | |
|     package Redirect ;
 | |
|     use Symbol ;
 | |
| 
 | |
|     sub new
 | |
|     {
 | |
|         my $class = shift ;
 | |
|         my $filename = shift ;
 | |
| 	my $fh = gensym ;
 | |
| 	open ($fh, ">$filename") || die "Cannot open $filename: $!" ;
 | |
| 	my $real_stdout = select($fh) ;
 | |
| 	return bless [$fh, $real_stdout ] ;
 | |
| 
 | |
|     }
 | |
|     sub DESTROY
 | |
|     {
 | |
|         my $self = shift ;
 | |
| 	close $self->[0] ;
 | |
| 	select($self->[1]) ;
 | |
|     }
 | |
| }
 | |
| 
 | |
| sub docat
 | |
| {
 | |
|     my $file = shift;
 | |
|     local $/ = undef;
 | |
|     open(CAT,$file) || die "Cannot open $file:$!";
 | |
|     my $result = <CAT>;
 | |
|     close(CAT);
 | |
|     return $result;
 | |
| }
 | |
| 
 | |
| sub docat_del
 | |
| { 
 | |
|     my $file = shift;
 | |
|     local $/ = undef;
 | |
|     open(CAT,$file) || die "Cannot open $file: $!";
 | |
|     my $result = <CAT> || "" ;
 | |
|     close(CAT);
 | |
|     unlink $file ;
 | |
|     return $result;
 | |
| }   
 | |
| 
 | |
| sub writeFile
 | |
| {
 | |
|     my $name = shift ;
 | |
|     open(FH, ">$name") or return 0 ;
 | |
|     print FH @_ ;
 | |
|     close FH ;
 | |
|     return 1 ;
 | |
| }
 | |
| 
 | |
| sub touch
 | |
| {
 | |
|     my $file = shift ;
 | |
|     open(CAT,">$file") || die "Cannot open $file:$!";
 | |
|     close(CAT);
 | |
| }
 | |
| 
 | |
| sub joiner
 | |
| {
 | |
|     my $db = shift ;
 | |
|     my $sep = shift ;
 | |
|     my ($k, $v) = (0, "") ;
 | |
|     my @data = () ;
 | |
| 
 | |
|     my $cursor = $db->db_cursor()  or return () ;
 | |
|     for ( my $status = $cursor->c_get($k, $v, DB_FIRST) ;
 | |
|           $status == 0 ;
 | |
|           $status = $cursor->c_get($k, $v, DB_NEXT)) {
 | |
| 	push @data, $v ;
 | |
|     }
 | |
| 
 | |
|     (scalar(@data), join($sep, @data)) ;
 | |
| }
 | |
| 
 | |
| sub countRecords
 | |
| {
 | |
|    my $db = shift ;
 | |
|    my ($k, $v) = (0,0) ;
 | |
|    my ($count) = 0 ;
 | |
|    my ($cursor) = $db->db_cursor() ;
 | |
|    #for ($status = $cursor->c_get($k, $v, DB_FIRST) ;
 | |
| #	$status == 0 ;
 | |
| #	$status = $cursor->c_get($k, $v, DB_NEXT) )
 | |
|    while ($cursor->c_get($k, $v, DB_NEXT) == 0)
 | |
|      { ++ $count }
 | |
| 
 | |
|    return $count ;
 | |
| }
 | |
| 
 | |
| sub addData
 | |
| {
 | |
|     my $db = shift ;
 | |
|     my @data = @_ ;
 | |
|     die "addData odd data\n" if @data % 2 != 0 ;
 | |
|     my ($k, $v) ;
 | |
|     my $ret = 0 ;
 | |
|     while (@data) {
 | |
|         $k = shift @data ;
 | |
|         $v = shift @data ;
 | |
|         $ret += $db->db_put($k, $v) ;
 | |
|     }
 | |
| 
 | |
|     return ($ret == 0) ;
 | |
| }
 | |
| 
 | |
| sub ok
 | |
| {
 | |
|     my $no = shift ;
 | |
|     my $result = shift ;
 | |
|  
 | |
|     print "not " unless $result ;
 | |
|     print "ok $no\n" ;
 | |
| }
 | |
| 
 | |
| 
 | |
| 1;
 | 
