[cgi-wiki-dev] ::Database::node_exists

Jody Belka cgi-wiki-dev@earth.li
Thu, 4 Dec 2003 21:37:17 -0000 (GMT)


------=_20031204213717_60042
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

Whilst i was working on the previous patch i posted, i noticed that the
node_exists routine doesn't do exactly as documented.

The documentation states that it returns true if the node has ever been
created, and false otherwise. Now, strictly speaking this is correct, but
the truth value is actually the version number of the node. Also, it's
retrieving the entire node, including metadata, to do this. Now (in some
formatters), this method is called for every internal link on a node to
determine how to show the link, so it is in the best interest to do the
minimum necessary.

Therefore, what i suggest (after having talked it over with Earle), is to
seperate node_exists into two seperate methods, one called node_exists
that only does this check, and nothing more, and another called
node_version, that is actually documented as returning the version number.

I have included two patches along these lines. One of them
(CGI-Wiki-node_exists.diff) is against 0.50_01. The other is against my
local dev-tree, which so far consists only of this patch and the earlier
two.

Included along with the new method is a new test file that makes sure it
is working properly. Thankfully, unlike the table-prefix changes, this
does not add a very significant amount of time to the test run ;)


-- 
Jody Belka
knew (at) pimb (dot) org
Modules/Diffs @ perl.pimb.org/modules
------=_20031204213717_60042
Content-Type: text/plain; name="CGI-Wiki-Knew-node_exists.diff"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="CGI-Wiki-Knew-node_exists.diff"

diff -pubr CGI-Wiki-Knew/MANIFEST CGI-Wiki-Knew-node_exists/MANIFEST
--- CGI-Wiki-Knew/MANIFEST	Mon Nov 24 20:48:55 2003
+++ CGI-Wiki-Knew-node_exists/MANIFEST	Thu Dec  4 20:42:41 2003
@@ -38,6 +38,7 @@ t/012_blank_data.t
 t/013_fuzzy_title_match.t
 t/014_advanced_metadata.t
 t/015_dangling_links.t
+t/016_node_version.t
 t/050_mysql_store.t
 t/051_pg_store.t
 t/052_sqlite_store.t
diff -pubr CGI-Wiki-Knew/lib/CGI/Wiki/Store/Database.pm CGI-Wiki-Knew-node_exists/lib/CGI/Wiki/Store/Database.pm
--- CGI-Wiki-Knew/lib/CGI/Wiki/Store/Database.pm	Mon Nov 24 20:49:15 2003
+++ CGI-Wiki-Knew-node_exists/lib/CGI/Wiki/Store/Database.pm	Thu Dec  4 19:55:36 2003
@@ -230,8 +230,35 @@ currently empty), and false otherwise.
 =cut
 
 sub node_exists {
+    my ($self, $node) = @_;
+
+    croak "No valid node name supplied" unless $node;
+
+    my $dbh = $self->dbh;
+    my $node_table = $self->{_table_prefix} . "node"; 
+
+    my $sql = "SELECT version FROM $node_table
+               WHERE name=" . $dbh->quote($node);
+
+    my @results = $dbh->selectrow_array($sql);
+    @results = (0) unless scalar @results;
+
+    return $results[0] > 0;
+}
+
+=item B<node_version>
+
+  my $version = $store->node_version( "Wombat Defenestration" );
+  # do something based on the version of the node
+
+Returns the version number of the node. If the node has never
+existed, then 0 will be returned.
+
+=cut
+
+sub node_version {
     my ( $self, $node ) = @_;
-    my %data = $self->retrieve_node($node) or return ();
+    my %data = $self->_retrieve_node_content( name => $node ) or return ();
     return $data{version}; # will be 0 if node doesn't exist, >=1 otherwise
 }
 
diff -pubr CGI-Wiki-Knew/lib/CGI/Wiki.pm CGI-Wiki-Knew-node_exists/lib/CGI/Wiki.pm
--- CGI-Wiki-Knew/lib/CGI/Wiki.pm	Mon Nov 24 20:48:55 2003
+++ CGI-Wiki-Knew-node_exists/lib/CGI/Wiki.pm	Thu Dec  4 19:55:36 2003
@@ -402,6 +402,21 @@ sub node_exists {
     $self->store->node_exists( @args );
 }
 
+=item B<node_version>
+
+  my $version = $wiki->node_version( "Wombat Defenestration" );
+  # do something based on the version of the node
+
+Returns the version number of the node. If the node has never
+existed, then 0 will be returned.
+
+=cut
+
+sub node_version {
+    my ($self, @args) = @_;
+    $self->store->node_version( @args );
+}
+
 =item B<delete_node>
 
   $wiki->delete_node($node);
diff -pubr /dev/null CGI-Wiki-Knew-node_exists/t/016_node_version.t
--- /dev/null   Thu Jan  1 01:00:00 1970
+++ CGI-Wiki-Knew-node_exists/t/016_node_version.t   Thu Dec  4 19:14:58 2003
@@ -0,0 +1,37 @@
+use strict;
+use CGI::Wiki::TestLib;
+use Test::More tests => ( 5 * scalar @CGI::Wiki::TestLib::wiki_info );
+use Time::Piece;
+
+my $iterator = CGI::Wiki::TestLib->new_wiki_maker;
+
+while ( my $wiki = $iterator->new_wiki ) {
+    # Node doesn't exist yet
+    is( $wiki->node_version("Home"), 0,
+        "...version number is 0 before node creation" );
+
+    # Put some test data in.
+    $wiki->write_node( "Home", "This is the home node." )
+      or die "Couldn't write node";
+
+    # Test initial version number
+    is( $wiki->node_version("Home"), 1,
+        "...version number retrieved successfully after initial write" );
+
+    # Update the node
+    my %node_data = $wiki->retrieve_node("Home");
+
+    ok( $wiki->write_node("Home", "xx", $node_data{checksum}),
+        "write_node succeeds when node matches checksum" );
+
+    # Test updated version number
+    is( $wiki->node_version("Home"), 2,
+        "...version number retrieved successfully after node update" );
+
+    # Delete the node.
+    $wiki->delete_node("Home");
+
+    # Version number is now 0
+    is( $wiki->node_version("Home"), 0,
+        "...version number is 0 after node delete" );
+}
------=_20031204213717_60042
Content-Type: text/plain; name="CGI-Wiki-node_exists.diff"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="CGI-Wiki-node_exists.diff"

diff -pubr CGI-Wiki-0.50_01/MANIFEST CGI-Wiki-node_exists/MANIFEST
--- CGI-Wiki-0.50_01/MANIFEST	Tue Nov 18 17:15:45 2003
+++ CGI-Wiki-node_exists/MANIFEST	Thu Dec  4 20:42:26 2003
@@ -38,6 +38,7 @@ t/012_blank_data.t
 t/013_fuzzy_title_match.t
 t/014_advanced_metadata.t
 t/015_dangling_links.t
+t/016_node_version.t
 t/050_mysql_store.t
 t/051_pg_store.t
 t/052_sqlite_store.t
diff -pubr CGI-Wiki-0.50_01/lib/CGI/Wiki/Store/Database.pm CGI-Wiki-node_exists/lib/CGI/Wiki/Store/Database.pm
--- CGI-Wiki-0.50_01/lib/CGI/Wiki/Store/Database.pm	Thu Nov 20 11:31:25 2003
+++ CGI-Wiki-node_exists/lib/CGI/Wiki/Store/Database.pm	Thu Dec  4 18:52:08 2003
@@ -221,8 +221,33 @@ currently empty), and false otherwise.
 =cut
 
 sub node_exists {
+    my ($self, $node) = @_;
+
+    croak "No valid node name supplied" unless $node;
+
+    my $dbh = $self->dbh;
+    my $sql = "SELECT version FROM node
+               WHERE name=" . $dbh->quote($node);
+
+    my @results = $dbh->selectrow_array($sql);
+    @results = (0) unless scalar @results;
+
+    return $results[0] > 0;
+}
+
+=item B<node_version>
+
+  my $version = $store->node_version( "Wombat Defenestration" );
+  # do something based on the version of the node
+
+Returns the version number of the node. If the node has never
+existed, then 0 will be returned.
+
+=cut
+
+sub node_version {
     my ( $self, $node ) = @_;
-    my %data = $self->retrieve_node($node) or return ();
+    my %data = $self->_retrieve_node_content( name => $node ) or return ();
     return $data{version}; # will be 0 if node doesn't exist, >=1 otherwise
 }
 
diff -pubr CGI-Wiki-0.50_01/lib/CGI/Wiki.pm CGI-Wiki-node_exists/lib/CGI/Wiki.pm
--- CGI-Wiki-0.50_01/lib/CGI/Wiki.pm	Thu Dec  4 18:47:59 2003
+++ CGI-Wiki-node_exists/lib/CGI/Wiki.pm	Thu Dec  4 18:52:08 2003
@@ -402,6 +402,21 @@ sub node_exists {
     $self->store->node_exists( @args );
 }
 
+=item B<node_version>
+
+  my $version = $wiki->node_version( "Wombat Defenestration" );
+  # do something based on the version of the node
+
+Returns the version number of the node. If the node has never
+existed, then 0 will be returned.
+
+=cut
+
+sub node_version {
+    my ($self, @args) = @_;
+    $self->store->node_version( @args );
+}
+
 =item B<delete_node>
 
   $wiki->delete_node($node);
diff -pubr /dev/null CGI-Wiki-node_exists/t/016_node_version.t
--- /dev/null   Thu Jan  1 01:00:00 1970
+++ CGI-Wiki-node_exists/t/016_node_version.t   Thu Dec  4 19:14:58 2003
@@ -0,0 +1,37 @@
+use strict;
+use CGI::Wiki::TestLib;
+use Test::More tests => ( 5 * scalar @CGI::Wiki::TestLib::wiki_info );
+use Time::Piece;
+
+my $iterator = CGI::Wiki::TestLib->new_wiki_maker;
+
+while ( my $wiki = $iterator->new_wiki ) {
+    # Node doesn't exist yet
+    is( $wiki->node_version("Home"), 0,
+        "...version number is 0 before node creation" );
+
+    # Put some test data in.
+    $wiki->write_node( "Home", "This is the home node." )
+      or die "Couldn't write node";
+
+    # Test initial version number
+    is( $wiki->node_version("Home"), 1,
+        "...version number retrieved successfully after initial write" );
+
+    # Update the node
+    my %node_data = $wiki->retrieve_node("Home");
+
+    ok( $wiki->write_node("Home", "xx", $node_data{checksum}),
+        "write_node succeeds when node matches checksum" );
+
+    # Test updated version number
+    is( $wiki->node_version("Home"), 2,
+        "...version number retrieved successfully after node update" );
+
+    # Delete the node.
+    $wiki->delete_node("Home");
+
+    # Version number is now 0
+    is( $wiki->node_version("Home"), 0,
+        "...version number is 0 after node delete" );
+}
------=_20031204213717_60042--