Index: trunk/Nebulous-Server/lib/Nebulous/Server.pm
===================================================================
--- trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 13131)
+++ trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 13173)
@@ -1,5 +1,5 @@
 # Copyright (c) 2004  Joshua Hoblitt
 #
-# $Id: Server.pm,v 1.31 2007-05-02 20:53:42 jhoblitt Exp $
+# $Id: Server.pm,v 1.32 2007-05-03 01:44:23 jhoblitt Exp $
 
 package Nebulous::Server;
@@ -283,10 +283,17 @@
     my $self = shift;
 
-    my ($key, $volume) = validate_pos(@_,
-        {
-            type        => SCALAR,
-        },
-        {
-            type        => SCALAR,
+    my ($key, $vol_name) = validate_pos(@_,
+        {
+            type        => SCALAR,
+            callbacks   => {
+                'is valid object key' => sub { $self->_is_valid_object_key($_[0]) },
+            },
+        },
+        {
+            type        => SCALAR,
+            callbacks   => {
+                # check that the volume name requested is valid
+                'is valid volume name' => sub { $self->_is_valid_volume_name($_[0]) },
+            },
             optional    => 1,
         },
@@ -301,5 +308,5 @@
     my ($vol_id, $vol_path);
     eval {
-        ($vol_id, $vol_path) = $self->_get_storage_volume($volume);
+        ($vol_id, $vol_path) = $self->_get_storage_volume($vol_name);
     };
     if ($@) {
@@ -312,5 +319,5 @@
         {
             my $query = $db->prepare_cached( $sql->get_object_instances );
-            my $rows = $query->execute( $key );
+            my $rows = $query->execute($key, 1);
 
             unless ( $rows > 0 ) {
@@ -866,10 +873,17 @@
     my $self = shift;
 
-    my ( $key, $volume ) = validate_pos( @_,
-        {
-            type        => SCALAR,
-        },
-        {
-            type        => SCALAR,
+    my ($key, $vol_name) = validate_pos(@_,
+        {
+            type        => SCALAR,
+            callbacks   => {
+                'is valid object key' => sub { $self->_is_valid_object_key($_[0]) },
+            },
+        },
+        {
+            type        => SCALAR,
+            callbacks   => {
+                # check that the volume name requested is valid
+                'is valid volume name' => sub { $self->_is_valid_volume_name($_[0]) },
+            },
             optional    => 1,
         },
@@ -880,26 +894,45 @@
     my $db  =$self->db;
 
-    $log->debug( "entered - @_" );
-
-    # TODO restrict search to a volume
+    $log->debug("entered - @_");
 
     my $query;
-
-    eval {
-        $query = $db->prepare_cached( $sql->get_object_instances );
-        $query->execute( $key );
-    };
-    $log->logdie( "database error: $@" ) if $@;
+    eval {
+        {
+            # ask the db to generate the table of mounted Nebulous volume 
+            my $query = $db->prepare_cached("call getmountedvol()");
+            $query->execute();
+        }
+
+        if ($vol_name) {
+            $query = $db->prepare_cached( $sql->get_object_instances_by_vol_name );
+            # ext_id, name, available
+            my $rows = $query->execute($key, $vol_name, 1);
+            unless ($rows > 0) {
+                $query->finish;
+                $log->logdie("no instances on storage volume: $vol_name or volume is not available");
+            }
+        } else {
+            $query = $db->prepare_cached( $sql->get_object_instances );
+            # ext_id, available
+            my $rows = $query->execute($key, 1);
+            unless ($rows > 0) {
+                $query->finish;
+                $log->logdie("no instances available");
+            }
+        }
+    };
+    $log->logdie("database error: $@") if $@;
 
     my @locations;
 
-    while ( my $row = $query->fetchrow_hashref ) {
+    while (my $row = $query->fetchrow_hashref) {
         my $instance = $row->{ 'uri' };
         push @locations, $instance if $instance;
     }
 
-    $log->logdie( "no instances found" ) unless ( scalar @locations );
-
-    $log->debug( "leaving" );
+    # XXX remove this?
+    $log->logdie("no instances found") unless (scalar @locations);
+
+    $log->debug("leaving");
 
     return \@locations;
@@ -1089,4 +1122,30 @@
 }
 
+sub _is_valid_object_key  {
+    my ($self, $key) = @_;
+
+    my $log = $self->log;
+    my $sql = $self->sql;
+    my $db  =$self->db;
+
+    my $ext_id;
+    eval {
+        my $query = $db->prepare_cached( $sql->get_object ); 
+        $query->execute($key);
+        ($ext_id) = $query->fetchrow_array;
+        $query->finish;
+    };
+    if ($@) {
+        $db->rollback;
+        $log->logdie( "database error: $@" );
+    }
+
+    if (defined $ext_id) {
+        return 1;
+    } 
+
+    return;
+}
+
 sub _is_valid_volume_name  {
     my ($self, $vol_name) = @_;
