[Debtags-commits] [svn] r1439 - central-database/branches/alioth/webfrontend

Enrico Zini enrico at costa.debian.org
Sun Oct 30 12:54:15 UTC 2005


Author: enrico
Date: Sun Oct 30 12:54:14 2005
New Revision: 1439

Modified:
   central-database/branches/alioth/webfrontend/Engine.pm
Log:
Fixed bugs in importing data
 Data is correct
 Much faster
 gdbm file size is much smaller


Modified: central-database/branches/alioth/webfrontend/Engine.pm
==============================================================================
--- central-database/branches/alioth/webfrontend/Engine.pm	(original)
+++ central-database/branches/alioth/webfrontend/Engine.pm	Sun Oct 30 12:54:14 2005
@@ -1,6 +1,7 @@
 package Engine;
 
 use GDBM_File;
+use Carp;
 
 ##
 ## Configuration
@@ -80,6 +81,32 @@
 	openDB();
 }
 
+# Read all the database contents to RAM
+sub readToRam ()
+{
+	# Read everything in RAM
+	my (%p, %f, %t);
+	tie %p, 'GDBM_File', $BASEDIR.'/packages.gdbm', &GDBM_READER, 0640;
+	tie %f, 'GDBM_File', $BASEDIR.'/facets.gdbm', &GDBM_READER, 0640;
+	tie %t, 'GDBM_File', $BASEDIR.'/tags.gdbm', &GDBM_READER, 0640;
+
+	%packages = %p;
+	%facets = %f;
+	%tags = %t;
+}
+
+sub writeFromRam ()
+{
+	# Write everything back
+	tie %p, 'GDBM_File', $BASEDIR.'/packages.gdbm', &GDBM_NEWDB, 0660;
+	tie %f, 'GDBM_File', $BASEDIR.'/facets.gdbm', &GDBM_NEWDB, 0660;
+	tie %t, 'GDBM_File', $BASEDIR.'/tags.gdbm', &GDBM_NEWDB, 0660;
+
+	%p = %packages;
+	%f = %facets;
+	%t = %tags;
+}
+
 # Get the list of package names
 sub packages () { return keys %packages; }
 
@@ -90,6 +117,7 @@
 sub getPackage ($)
 {
 	my ($name) = @_;
+	confess "Name is not defined" if not defined $name;
 	my $data = $packages{$name};
 	return { name => $name, tags => [] } if not defined $data;
 	my ($sdesc, $ldesc, $tags) = split("\0", $data);
@@ -105,6 +133,8 @@
 sub setPackage ($)
 {
 	my ($pkg) = @_;
+	confess "pkg not a hash" if ref($pkg) ne 'HASH';
+	confess "sdesc is a ".ref($pkg->{sdesc})." instead of a scalar" if ref($pkg->{sdesc}) ne '';
 	$packages{$pkg->{name}} = join("\0", ($pkg->{sdesc} or ''), ($pkg->{ldesc} or ''), join(', ', @{$pkg->{tags}}));
 }
 
@@ -118,6 +148,7 @@
 sub getFacet ($)
 {
 	my ($name) = @_;
+	confess "Name is not defined" if not defined $name;
 	my $data = $facets{$name};
 	return { name => $name, tags => [] } if not defined $data;
 	my ($sdesc, $ldesc, $tags) = split("\0", $data);
@@ -146,6 +177,7 @@
 sub getTag ($)
 {
 	my ($name) = @_;
+	confess "Name is not defined" if not defined $name;
 	my $data = $tags{$name};
 	return { name => $name, packages => [] } if not defined $data;
 	my ($sdesc, $ldesc, $pkgs) = split("\0", $data);
@@ -173,7 +205,7 @@
 {
 	my ($parms, $p) = @_;
 
-#	&main::msg("Match t:%s w:%s\n", join(', ', @{$parms->{tags}}), join(', ', @{$parms->{words}}));
+	&main::msg("Match %s with t:%s w:%s\n", $p->{name}, join(', ', @{$parms->{tags}}), join(', ', @{$parms->{words}}));
 
 	if (@{$parms->{tags}})
 	{
@@ -191,7 +223,7 @@
 			index($p->{ldesc}, $w) == -1;
 	}
 
-#	&main::msg("OK %s\n", $p->{name});
+	&main::msg("OK %s\n", $p->{name});
 	return 1;
 }
 
@@ -337,14 +369,14 @@
 	# Delete the packages that are not in the package database anymore
 	for my $tag (keys %deleted)
 	{
-		my $t = getTag($pkg);
-		for my $pkg ($t->{packages})
+		my $t = getTag($tag);
+		for my $pkg (@{$t->{packages}})
 		{
 			my $p = getPackage($pkg);
 			$p->{tags} = [ grep { $_ != $tag } @{$p->{tags}} ];
 			setPackage($pkg);
 		}
-		delete $packages{$pkg};
+		delete $tags{$tag};
 	}
 }
 
@@ -360,13 +392,14 @@
 		chop;
 		die "Cannot parse line \"$_\"" if (/[^:,] /);
 		my ($pkg, $tags) = split(': ', $_);
+		my $p = getPackage($pkg);
 
 		#printf STDERR "Pkg: %s, tags: %s\n", $pkg, $tags;
 
 		# Compute the difference between the previous tagset and the
 		# one we just read
 
-		my %first = map { $_ => 1 } @{$packages{$pkg}{tags}};
+		my %first = map { $_ => 1 } @{$p->{tags}};
 		my %second = map { $_ => 1 } split(', ', ($tags or ''));
 		my %union = map { $_ => 1 } ( keys %first, keys %second );
 		my (@added, @deleted);
@@ -383,7 +416,6 @@
 		if (@added or @deleted)
 		{
 			# Update the tags in %packages
-			my $p = getPackage($pkg);
 			$p->{tags} = [ keys %second ];
 			setPackage($p);
 
@@ -414,18 +446,23 @@
 	my $reopen = 1 if $tied == 1;
 	closeDB() if $tied == 1;
 
-	tie %packages, 'GDBM_File', $BASEDIR.'/packages.gdbm', &GDBM_NEWDB, 0660;
-	tie %facets, 'GDBM_File', $BASEDIR.'/facets.gdbm', &GDBM_NEWDB, 0660;
-	tie %tags, 'GDBM_File', $BASEDIR.'/tags.gdbm', &GDBM_NEWDB, 0660;
+	print STDERR "Reading into RAM\n";
+	readToRam();
 
+	print STDERR "Initializing package data\n";
 	resyncPackages($pkgs);
+	print STDERR "Initializing vocabulary data\n";
 	resyncVocabulary($vocab);
+	print STDERR "Initializing tag data\n";
 	resyncTags($tags);
-	
-	untie %packages ;
-	untie %facets ;
-	untie %tags ;
 
+	print STDERR "Writing\n";
+	writeFromRam();
+
+	%packages = ();
+	%facets = ();
+	%tags = ();
+	
 	openDB() if $reopen;
 }
 



More information about the Debtags-commits mailing list