DBedit

 view release on metacpan or  search on metacpan

lib/DBstorage/RDB.pm  view on Meta::CPAN

	$delete_all || last loop;
    }
    while(<INPUT_TABLE>) {
	print OUTPUT_TABLE;
    }
    close(OUTPUT_TABLE);

    $self->close();
    $self->commit($filename, "/tmp/delete1.$$");
    $lock->release();

}


sub append {
    my $self = shift;
    my $table = shift;
    my $hashref = shift;

    my %inarray = %{$hashref};

    my (%type, @fields, $output);

    foreach (keys %inarray) {
#	remove forward and trailing space
	$inarray{$_} =~ s/^\s+(.*)/$1/g;
	$inarray{$_} =~ s/(.*)\s+$/$1/g;
	$inarray{$_} =~ s/\s+/ /g;
    }

    my $lock = DBfilelock->new("${table}.lck");

    if (!-e $table || -z $table) {
	open("FILE", ">$table") || croak "Cannot open";
	$_ = join("\t", grep(!/^RDB/, sort (keys %inarray)));
	print FILE  "$_\n";
	s/[^\t]/\-/g;
	print FILE  "$_\n";
	close FILE;
    } 

    %type = $self->attrib($table);
    @fields = @{$type{"fields"}};
    if ($type{"type"} eq "list") {
	open (FILE, ">/tmp/file.$$");
	open (INPUT_FILE, $table);
	while (<INPUT_FILE>) {
	    print FILE $_;
	    $output = $_;
	}
	close(INPUT_FILE);
	if ($output !~ /^\s*$/) {	
	    print FILE "\n";
	}
	foreach (@fields) {
	    print FILE "$_\t$inarray{$_}\n";
	}
	close (FILE);
    } elsif($type{"type"} eq "table") {
	`cp $table /tmp/file.$$`;
	chmod 0664, "/tmp/file.$$";
	open (FILE ,">>/tmp/file.$$");
	print FILE join("\t", @inarray{@fields}) . "\n";
	close (FILE);
    } else {
	$lock->release();
	croak;
    }
    $self->commit($table, "/tmp/file.$$");	
    $lock->release();
    %{$hashref} = %inarray;
}

sub replace {
    my $self = shift;
    my $filename = shift;
    my $keyref = shift;
    my $replace_ref = shift;
    my $replace_all = shift;

    my %keys = %{$keyref};
    my %replace_values = %{$replace_ref};


    my (@keys) = keys %keys;
    my (@replace_keys) = keys %replace_values;
    my (%type, @fields, %f, $invalue, $input_line, %cookie);
    local ($_);
    my ($nrecords);

    my ($lock) = DBfilelock->new("$filename.lck");

    $self->open($filename, "INPUT_TABLE");
    if ($self->type() eq "table") {
	open (OUTPUT_TABLE, ">/tmp/replace1.$$");
    } elsif ($self->type() eq "list") {
	open (OUTPUT_TABLE, "| $self->{'tabletolist'} > /tmp/replace1.$$");
    } else {
	print "Unknown table type $type{'type'}!!!!";
	exit;
    }
    print OUTPUT_TABLE $self->table_header($self->{'FIELDS'});
    @fields = @{$self->{'FIELDS'}};
  loop:

# Break an abstraction barrier for speed
    while ($input_line = <INPUT_TABLE>) {
	chop $input_line;
	if ($input_line ne "") {
	    @f{@fields} = split("\t", $input_line);
	    $nrecords++;
	} else {
	    next loop;
	}

	foreach (@keys) {
	    if ($keys{$_} ne $f{$_}) {
		print OUTPUT_TABLE $input_line, "\n";
		next loop;
	    }
	}

lib/DBstorage/RDB.pm  view on Meta::CPAN

	print OUTPUT_TABLE join("\t", @f{@fields}), "\n";
	$replace_all || last loop;
    }
    while(<INPUT_TABLE>) {
	if ($_ ne "\n") {
	    print OUTPUT_TABLE;
	    $nrecords++;
	}
    }
    $cookie{'nrecords'} = $nrecords;

    close(OUTPUT_TABLE);
    $self->close();
    $self->commit($filename, "/tmp/replace1.$$");
    $lock->release();
}

sub commit {
    my $self = shift;
    my $filename = shift;
    my $newfilename = shift;
    my($has_rcs, $checkin, $checkout);
    my(@list) = split(/\//, $filename);
    my($file) = pop @list;
    my($dir) = join("/", @list);
    my($rcsfile) = "$dir/RCS/$file,v";

    if (-z $newfilename) {
	print "$newfilename is a zero length file.  Aborting....";
	croak;
    }

    $has_rcs = ((-e "$filename,v") || (-e $rcsfile));

    if (!-e $filename) {
	`mv $newfilename $filename`;
    }

    if (!-w $filename && $has_rcs) {
	$checkout = $self->checkout($filename, "-l");
	$checkin =  $self->checkin($filename, 
			 "-u", "Checked in by $ENV{'REMOTE_USER'}");
	`$checkout
cp $filename $filename.bak
mv $newfilename $filename
$checkin &`;
    }  elsif (-w $filename && $has_rcs) {
	$checkin = $self->checkin($filename, 
			 "-l", "Checked in by $ENV{'REMOTE_USER'}");
	`cp $filename $filename.bak
mv $newfilename $filename
$checkin &`;
    } elsif (-w $filename && !$has_rcs) {
	`cp $filename $filename.bak
mv $newfilename $filename`;
    } else {
	print "Error cannot write to file $filename";
	croak;
    }
    if (-e "${filename}.bak") {
	chmod 0666, "${filename}.bak";
    }
}

sub checkout {
    my ($self, $filename, $options) = @_;
    return "$self->{'CO'} $options $filename 2> /dev/null";
}

sub checkin {
    my ($self, $filename, $options, $message) = @_;
    return "echo '$message' | $self->{'CI'} $options $filename 2> /dev/null";
}

sub create {
    my ($self, $filename, $fieldref) = @_;
    local (*FILE);
    if (!-e $filename) {
	open(FILE, ">$filename");
	print FILE $self->table_header($fieldref);
	close(FILE);
    }
}

sub table_header {
    my($self, $fieldref) = @_;
    if (!defined($fieldref)) {
       $fieldref = $self->{'FIELDS'};
    }
    my($header) = join("\t", @{$fieldref});
    my($return_value) = $header;
    $return_value .= "\n";
    $header =~ s/\S/\-/g;
    $return_value .= $header;
    $return_value .= "\n";
    return $return_value;
}


sub open {
    my $self = shift;
    my $filename = shift;
    my $filehandle = shift;
    my $line;

    if (!defined($filehandle)) {
	$filehandle = gensym;
    }

    ($filehandle ne "STDIN") &&
	(open($filehandle, $filename) || return 0);
    $line = readline(*$filehandle);
    if ($line =~ /^\s*$/) {
	close($filehandle);
	($filehandle ne "STDIN") &&
	    (open($filehandle, "$self->{'listtotable'} < $filename |") ||
	     return 0);
	$line = <$filehandle>;
	chop;
	$self->{'TYPE'}->{"type"} = "list";
    } else {



( run in 0.484 second using v1.01-cache-2.11-cpan-39bf76dae61 )