OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Thomas Lotterer
Root: /v/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-registry Date: 07-Mar-2006 14:09:22
Branch: HEAD Handle: 2006030713092200
Modified files:
openpkg-registry registry-db.pl
Log:
ftp statistics require changes and additions to the database schema
and we need to support initial installations and migrations
Summary:
Revision Changes Path
1.19 +95 -22 openpkg-registry/registry-db.pl
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-registry/registry-db.pl
============================================================================
$ cvs diff -u -r1.18 -r1.19 registry-db.pl
--- openpkg-registry/registry-db.pl 23 Feb 2006 13:22:15 -0000 1.18
+++ openpkg-registry/registry-db.pl 7 Mar 2006 13:09:22 -0000 1.19
@@ -37,13 +37,13 @@
# program name, version and date
my $progname="registry-db.pl";
-my $progvers="0.2.7";
+my $progvers="0.3.0";
my $progdate="23-Feb-2006";
# derive data version from program version
my $datavers={};
$datavers->{value} = $progvers;
-if ($datavers->{value} =~ m/^([0-9]+)\.([0-9]+)\.([0-9]+)$/) {
+if ($datavers->{value} =~ m/^[^0-9]*([0-9]+)\.([0-9]+)\.([0-9]+)/) {
$datavers->{major}=$1;
$datavers->{minor}=$2;
$datavers->{patch}=$3;
@@ -58,13 +58,12 @@
# configuration
my $cfg = {};
-$cfg->{db}->{host}="127.0.0.1";
-$cfg->{db}->{template1}->{username}="postgresql";
-$cfg->{db}->{template1}->{password}="postgresql";
-$cfg->{db}->{registry}->{username}="registry";
-$cfg->{db}->{registry}->{password}="registry";
-$cfg->{db}->{registry}->{tablespace}="registry";
$cfg->{db}->{registry}->{host}="127.0.0.1";
+$cfg->{db}->{registry}->{superuser}->{username}="postgresql";
+$cfg->{db}->{registry}->{superuser}->{password}="postgresql";
+$cfg->{db}->{registry}->{workhorse}->{username}="registry";
+$cfg->{db}->{registry}->{workhorse}->{password}="registry";
+$cfg->{db}->{registry}->{tablespace}="registry";
$cfg->{db}->{session}->{dbfile}="$PREFIX/var/openpkg-registry/ui/session.db";
# database handle and scratch variables
@@ -83,11 +82,35 @@
$dbi = undef;
print "==== processing Database $db ====\n";
- if ($db eq "template1" or $db eq "registry") {
+ if ($db eq "template1") {
+ $dbi = DBI->connect (
+
"DBI:Pg:dbname=template1".";host=".$cfg->{db}->{registry}->{host},
+ $cfg->{db}->{registry}->{superuser}->{username},
+ $cfg->{db}->{registry}->{superuser}->{password},
+ {
+ PrintError => 0,
+ RaiseError => 0,
+ AutoCommit => 1
+ }
+ );
+ }
+ elsif ($db eq "registry/superuser") {
$dbi = DBI->connect (
"DBI:Pg:dbname=".$cfg->{db}->{registry}->{tablespace}.";host=".$cfg->{db}->{registry}->{host},
- $cfg->{db}->{$db}->{username},
- $cfg->{db}->{$db}->{password},
+ $cfg->{db}->{registry}->{superuser}->{username},
+ $cfg->{db}->{registry}->{superuser}->{password},
+ {
+ PrintError => 0,
+ RaiseError => 0,
+ AutoCommit => 1
+ }
+ );
+ }
+ elsif ($db eq "registry/workhorse") {
+ $dbi = DBI->connect (
+
"DBI:Pg:dbname=".$cfg->{db}->{registry}->{tablespace}.";host=".$cfg->{db}->{registry}->{host},
+ $cfg->{db}->{registry}->{workhorse}->{username},
+ $cfg->{db}->{registry}->{workhorse}->{password},
{
PrintError => 0,
RaiseError => 0,
@@ -118,21 +141,35 @@
$sql="CREATE USER registry ENCRYPTED PASSWORD 'registry' NOCREATEDB
NOCREATEUSER;";
$rv = $dbh->do($sql);
-print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n";
+print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n" if($dbh->errstr !~
/(user|role) .* already exists/);
$sql="CREATE TABLESPACE registry OWNER registry LOCATION
'$PREFIX/var/openpkg-registry/db';";
$rv = $dbh->do($sql);
-print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n";
+print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n" if($dbh->errstr !~
/tablespace .* already exists/);
$sql="CREATE DATABASE registry OWNER registry TABLESPACE registry;";
$rv = $dbh->do($sql);
-print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n";
+print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n" if($dbh->errstr !~
/database .* already exists/);
+
+$dbh->disconnect(); undef $dbh;
+
+# enaple Pg/SQL
+#
+$dbh = &dbopen("registry/superuser");
+die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
+
+$sql="";
+$sql.="CREATE FUNCTION plpgsql_call_handler () RETURNS LANGUAGE_HANDLER AS
'\$libdir/plpgsql' LANGUAGE C;\n";
+$sql.="COMMENT ON FUNCTION plpgsql_call_handler () IS 'PL/pgSQL Call
Handler';\n";
+$sql.="CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER
plpgsql_call_handler;\n";
+$rv = $dbh->do($sql);
+print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n" if($dbh->errstr !~
/function .* already exists/);
$dbh->disconnect(); undef $dbh;
# registry
#
-$dbh = &dbopen("registry");
+$dbh = &dbopen("registry/workhorse");
die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
while(&upgraderegistry()) {};
$dbh->disconnect(); undef $dbh;
@@ -205,11 +242,11 @@
return 1;
}
- # 0.[01].x upgrade to 0.2.0 is a nop
+ # 0.[012].x upgrade to 0.3.0 is a nop
#
elsif ( $dbv->{version}->{major} == 0
- and $dbv->{version}->{minor} < 2 ) {
- $sql = sprintf("UPDATE config SET value = '0.2.0';");
+ and $dbv->{version}->{minor} < 3 ) {
+ $sql = sprintf("UPDATE config SET value = '0.3.0';");
$rv = $dbh->do($sql);
print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if
($dbh->errstr =~ m|ERROR|);
return 1;
@@ -301,7 +338,9 @@
print "initializing database\n";
$dbh->{AutoCommit} = 0;
$dbh->begin_work;
- $sql = &schemaregistry();
+ $sql = "";
+ $sql .= &schemaregistry();
+ $sql .= &funcregistry();
$sql .= "INSERT INTO reg_config VALUES ( 'version', '".$progvers."'
);";
$sql .= &sample() if ($progvers =~ m/^0\.0\./);
$rv = $dbh->do($sql);
@@ -337,6 +376,21 @@
return 1;
}
+ # 0.2.x upgrade to 0.3.0
+ #
+ elsif ( $dbv->{version}->{major} == 0
+ and $dbv->{version}->{minor} == 2 ) {
+ $sql="";
+ $sql .= sprintf("ALTER TABLE reg_statistic ALTER COLUMN time_first
SET DEFAULT CURRENT_TIMESTAMP;\n");
+ $sql .= sprintf("ALTER TABLE reg_statistic ALTER COLUMN time_last
SET DEFAULT CURRENT_TIMESTAMP;\n");
+ $sql .= sprintf("ALTER TABLE reg_statistic ALTER COLUMN count SET
DEFAULT 1;\n");
+ $sql .= &funcregistry();
+ $sql .= sprintf("UPDATE reg_config SET value = '0.3.0';\n");
+ $rv = $dbh->do($sql);
+ print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if
($dbh->errstr =~ m|ERROR|);
+ return 1;
+ }
+
# program data version and database version only differ in patchlevel
- just uprev the number
#
elsif ( $dbv->{version}->{major} == $datavers->{major}
@@ -537,16 +591,18 @@
-- remote peer IP address
-- [1.2.3.4]
time_first TIMESTAMP (0) WITHOUT TIME ZONE
- NOT NULL,
+ NOT NULL
+ DEFAULT CURRENT_TIMESTAMP,
-- time login+addr was seen first
-- [2005-11-08 00:00:00]
time_last TIMESTAMP (0) WITHOUT TIME ZONE
- NOT NULL,
+ NOT NULL
+ DEFAULT CURRENT_TIMESTAMP,
-- time login+addr was seen last
-- [2005-11-08 00:00:00]
count INTEGER
NOT NULL
- DEFAULT '0',
+ DEFAULT '1',
-- number login+addr was seen at all
-- [0]
PRIMARY KEY (login, addr)
@@ -555,6 +611,23 @@
EOT
}
+sub funcregistry()
+{
+ return <<'EOT'
+ -- Stored Procedure: update statistics and fallback to insert in case
this becomes a new entry
+ CREATE OR REPLACE FUNCTION reg_statisticlog(TEXT, TEXT)
+ RETURNS BOOL LANGUAGE 'plpgsql' AS '
+ BEGIN
+ UPDATE reg_statistic SET time_last = DEFAULT, count = count+1 WHERE
( login = $1 AND addr = $2 );
+ IF NOT FOUND THEN
+ INSERT INTO reg_statistic (login, addr) VALUES ($1, $2);
+ END IF;
+ RETURN FOUND;
+ END;
+ ';
+EOT
+}
+
sub sample()
{
return <<'EOT'
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [email protected]