The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Register::Generic;
use DBI;
require Exporter;

sub new {
	my $type=shift;
	my %params=@_;
	my $self={};
	my $name="${type}::new";

	$self->{'Type'}=$type;
	my $regpath = Register::checkReq ($name, "regpath", $params{'regpath'});
	my $regname = Register::checkReq ($name, "regname", $params{'regname'});
	($self->{'REGISTER_NAME'}=$regname)=~s/(\W)//g;
	$self->{'DBH'}=DBI->connect("DBI:CSV:f_dir=".$regpath,"","");
	if (!(-d $regpath)) { 
		printf "ERROR:\n";
		printf "LOCATION: \<".$self->{'Type'}."\>\n";
		printf "CAUSE: directory \<".$regpath."\> not found !!!\n";
		exit(1);
	};
	if (!(-f $regpath."/".$self->{'REGISTER_NAME'})) {
		my($sql)=qq {
			CREATE TABLE 
				$self->{'REGISTER_NAME'} 
				(
				R_SECTION 	CHAR(255),
				R_KEY		CHAR(255),
				R_VALUE		CHAR(255)
				) 
		};
		$self->{DBH}->do($sql);
	};

	bless $self;
}

sub getsettings {
	my $self=shift;
	my ($SEC,$KEY)=@_;
	my ($row)={};

	$row->{'R_VALUE'}="";
	my ($sql) = qq { 
		  SELECT 
			*	
		  FROM 
			$self->{'REGISTER_NAME'}
		  WHERE
				R_SECTION=?
			AND
				R_KEY=?
		};
	my($sth)=$self->{DBH}->prepare($sql);
	$sth->execute($SEC,$KEY);
	$row=$sth->fetchrow_hashref;
	if ($row->{'R_VALUE'} ne "") {
		return $row->{'R_VALUE'};
	} else {
		return "";
	};
}

sub getsections {
	my $self=shift;
	my ($oldsec)="";
	my (@retval)=();
	my ($row)={};

	my ($sql) = qq {
		SELECT
			R_SECTION
		FROM
			$self->{'REGISTER_NAME'}
		ORDER BY 
			R_SECTION
	};
	my($sth)=$self->{DBH}->prepare($sql);
	$sth->execute();
	while ($row=$sth->fetchrow_hashref) { 
		if ($oldsec ne $row->{R_SECTION}) {	
			push @retval,$row->{R_SECTION};
			$oldsec=$row->{R_SECTION};
		};
	};
	$sth->finish;
	return @retval;
};

sub savesettings {
	my $self=shift;
	my ($SEC,$KEY,$VAL)=@_;
	my ($row)={};
	
	my($sql) = qq { 
		  SELECT 
			*	
		  FROM 
			$self->{'REGISTER_NAME'}
		  WHERE
				R_SECTION=?
			AND
				R_KEY=?
		};
	my($sth)=$self->{DBH}->prepare($sql);
	$sth->execute($SEC,$KEY);
	$row=$sth->fetchrow_hashref;
	if ($row->{'R_SECTION'} ne "") {
		$self->updatekey($SEC,$KEY,$VAL);
	} else {
		$self->addkey($SEC,$KEY,$VAL);
	};
	$sth->finish();
				
}

sub deletesection {
	my $self=shift;
	my($SEC)=@_;

	$sql=qq {
		DELETE FROM
			$self->{'REGISTER_NAME'}
		WHERE
				R_SECTION=?
	};
	$self->{DBH}->do($sql,undef,$SEC);
}

sub deletesettings {
	my $self=shift;
	my($SEC,$KEY)=@_;

	my($sql)=qq {
		DELETE FROM
			$self->{'REGISTER_NAME'}
		WHERE
				R_SECTION=?
			AND
				R_KEY=?
	};
	$self->{DBH}->do($sql,undef,$SEC,$KEY);
}

sub updatekey {
	my $self=shift;
	my ($SEC,$KEY,$VAL)=@_;

	my($sql)=qq {
		UPDATE 
			$self->{'REGISTER_NAME'}
		SET
			R_VALUE=?
		WHERE
				R_SECTION=?
			AND
				R_KEY=?
	};
	$self->{DBH}->do($sql,undef,$VAL,$SEC,$KEY);
}

sub addkey {
	my $self=shift;
	my ($SEC,$KEY,$VAL)=@_;

	my($sql)=qq {
		INSERT INTO 
			$self->{'REGISTER_NAME'}
			(
			R_SECTION,
			R_KEY,
			R_VALUE
			)
		VALUES ( ?,?,? )
	};

	$self->{DBH}->do($sql,undef,$SEC,$KEY,$VAL);
}

1;

=head1 NAME

Register::Generic - Implementation of the windows ini like structure 

=head1 SYNOPSIS

	use Register;
	
	$genreg=new Register::Generic (
			'regpath' => "/home/myprog",
			'regname' => "INITFILE"
		);

	$genreg->savesettings("SECTION","KEY","VALUE");
	$value=$genreg->getsettings("SECTION","KEY");
	$sections=$genreg->getsections;
	$genreg->deletesettings(,"SECTION","KEY");
	$genreg->deletesection("SECTION");

=head1 DESCRIPTION

The Register::Generic module permit to create an ini file like 
Windows for save generic information about your program.
With the use of CSV dbd , the file created is readable by DBI without
problem.
Here CSV table specifics:

	FIELD_NAME		FIELD_TYPE
	----------------------------------	
	R_SECTION		CHAR
	R_KEY			CHAR
	R_VALUE			CHAR

=head1 FUNCTIONS



=head2 Function <new>

The <new> statament create the Register::Generic object and return the
reference to him.

	$genreg=new Register::System (
			'regpath' => "/home/myprog",
			'regname' => "INIFILE"
		);

Parameter :

	regpath		specify the path where new statament search for
			file.

	regname		specify the name of the file to use.

Finaly if regpath don't exist the program return an error message at compile
time, if the register don't exist it is maked.

=head2 Function <savesettings>

The savesettings function , save the value argument in the key of the 
section of the program.

	$genreg->savesettings("SECTION","KEY","VALUE");

If the key don't exist it make (it make also section without specify befor), else if 
key already exist and value is different from previous it update value.

=head2 Function <getsettings>

The getsettings function retrieve the value of the specified key.

	$value=$genreg->getsettings("SECTION","KEY");

=head2 Function <getsections>

The getsections function retrieve the section in the ini file and 
return an array.

	@sections=$genreg->getsections;

=head2 Function <deletesettings>

The deletesettings function delete the entry key specified.

	$genreg->deletesettings("SECTION","KEY");

=head2 Function <deletesection>

The deletesection function delete the entry section specified.

	$genreg->deletesection("SECTION");

=head1 AUTHOR

        Vecchio Fabrizio <jacote@tiscalinet.in>

=head1 SEE ALSO

L<Register>,L<DBD::CSV>,L<DBI>

=cut