Index: trunk/Nebulous-Server/lib/Nebulous/Server.pm
===================================================================
--- trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 18400)
+++ trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 18451)
@@ -1,5 +1,5 @@
 # Copyright (c) 2004-2008  Joshua Hoblitt
 #
-# $Id: Server.pm,v 1.79 2008-07-02 03:40:10 jhoblitt Exp $
+# $Id: Server.pm,v 1.80 2008-07-09 23:32:35 jhoblitt Exp $
 
 package Nebulous::Server;
@@ -22,5 +22,5 @@
 use Nebulous::Server::Log;
 use Nebulous::Server::SQL;
-use Nebulous::Keys qw( parse_neb_key );
+use Nebulous::Keys qw( parse_neb_key parse_neb_volume );
 use Params::Validate qw( validate_pos SCALAR SCALARREF UNDEF );
 use URI::file;
@@ -167,16 +167,20 @@
     $log->debug( "entered - @_" );
 
-    {
-        my $volume;
-        ($volume, $key) = parse_neb_key($key);
-        # vol_name overrides the key implied volume
-        $vol_name ||= $volume;
-    }
-
-    if (defined $vol_name and !$self->_is_valid_volume_name($vol_name)) {
-        die "$vol_name is not a valid volume name"
+    $key = parse_neb_key($key, $vol_name);
+    # vol_name overrides the key implied volume
+    $vol_name = $key->volume;
+
+    # the key isn't validiated on input for this method so we have to check it
+    # again after parsing the key
+    if (defined $vol_name and not $self->_is_valid_volume_name($vol_name)) {
+        $log->logdie("$vol_name is not a valid volume name");
     }
         
-    my ($vol_id, $vol_host, $vol_path, $vol_xattr) = $self->_get_storage_volume($vol_name);
+    if (defined $key->soft_volume) {
+        $vol_name = undef;
+    }
+
+    my ($vol_id, $vol_host, $vol_path, $vol_xattr)
+        = $self->_get_storage_volume($vol_name);
 
     my $uri;
@@ -185,5 +189,5 @@
             # create storage_object
             my $query = $db->prepare_cached( $sql->new_object ); 
-            $query->execute('NULL', $key);
+            $query->execute('NULL', $key->path);
         }
 
@@ -231,5 +235,5 @@
 
         # TODO add some stuff here to retry if unsucessful
-        $uri = $self->_create_empty_instance_file($key, $so_id, $ins_id, $vol_path, $vol_xattr);
+        $uri = $self->_create_empty_instance_file($key->path, $so_id, $ins_id, $vol_path, $vol_xattr);
         $log->debug("created $uri on volume ID: $vol_id");
 
@@ -289,5 +293,5 @@
         my $query = $db->prepare_cached($sql->rename_object); 
         # this SQL statment takes the new key name as the first param
-        my $rows = $query->execute($newkey, $key);
+        my $rows = $query->execute($newkey->path, $key->path);
 
         # if we affected more then one row something very bad has happened.
@@ -351,9 +355,10 @@
     $log->debug("entered - @_");
 
-    {
-        my $volume;
-        ($volume, $key) = parse_neb_key($key);
-        # vol_name overrides the key implied volume
-        $vol_name ||= $volume;
+    $key = parse_neb_key($key, $vol_name);
+    # vol_name overrides the key implied volume
+    $vol_name = $key->volume;
+
+    if (defined $key->soft_volume) {
+        $vol_name = undef;
     }
 
@@ -377,5 +382,5 @@
             # verify that at least one instance is currently available
             my $query = $db->prepare_cached( $sql->get_object_instances );
-            my $rows = $query->execute($key, 1);
+            my $rows = $query->execute($key->path, 1);
 
             unless ( $rows > 0 ) {
@@ -409,5 +414,5 @@
 
         # TODO add some stuff here to retry if unsucessful
-        $uri = $self->_create_empty_instance_file($key, $so_id, $ins_id, $vol_path, $vol_xattr);
+        $uri = $self->_create_empty_instance_file($key->path, $so_id, $ins_id, $vol_path, $vol_xattr);
 
         {
@@ -467,5 +472,5 @@
             # this will set update locks
             my $query = $db->prepare_cached( $sql->get_object_locks );
-            my $rows = $query->execute( $key );
+            my $rows = $query->execute( $key->path );
             unless ( $rows == 1 ) {
                 $query->finish;
@@ -494,5 +499,5 @@
             {
                 my $query = $db->prepare_cached( $sql->set_write_lock );
-                my $rows = $query->execute($key);
+                my $rows = $query->execute($key->path);
             
                 # if we affected more then one row something very bad has happened.
@@ -510,5 +515,5 @@
             {
                 my $query = $db->prepare_cached( $sql->increment_read_lock );
-                my $rows = $query->execute($key);
+                my $rows = $query->execute($key->path);
             
                 # if we affected more then one row something very bad has happened.
@@ -569,5 +574,5 @@
             # this will set update locks
             my $query = $db->prepare_cached( $sql->get_object_locks );
-            my $rows = $query->execute($key);
+            my $rows = $query->execute($key->path);
             unless ($rows == 1) {
                 $query->finish;
@@ -595,5 +600,5 @@
             {
                 my $query = $db->prepare_cached( $sql->delete_write_lock );
-                my $rows = $query->execute($key);
+                my $rows = $query->execute($key->path);
             
                 # if we affected more then one row something very bad has happened.
@@ -615,5 +620,5 @@
             {
                 my $query = $db->prepare_cached( $sql->decrement_read_lock );
-                my $rows = $query->execute($key);
+                my $rows = $query->execute($key->path);
             
                 # if we affected more then one row something very bad has happened.
@@ -684,5 +689,5 @@
 
         # name, value, ext_id
-        my $rows = $query->execute($name, $value, $key);
+        my $rows = $query->execute($name, $value, $key->path);
         $query->finish;
 
@@ -744,5 +749,5 @@
         my $query = $db->prepare_cached( $sql->get_object_xattr );
         # ext_id, name
-        my $rows = $query->execute($key, $name);
+        my $rows = $query->execute($key->path, $name);
 
         # no rows returned means that the xattr does not exist
@@ -797,5 +802,5 @@
         my $query = $db->prepare_cached( $sql->list_object_xattr );
         # ext_id
-        my $rows = $query->execute($key);
+        my $rows = $query->execute($key->path);
 
         while (my $row = $query->fetchrow_hashref) {
@@ -839,5 +844,5 @@
         my $query = $db->prepare_cached( $sql->remove_object_xattr );
         # ext_id, name
-        my $rows = $query->execute($key, $name);
+        my $rows = $query->execute($key->path, $name);
         $query->finish;
 
@@ -885,7 +890,5 @@
 
     # attempt to strip off neb:// if it exists
-    if ($pattern =~ m|^neb:|) {
-        $pattern = parse_neb_key($pattern);        
-    }
+    $pattern =~ s|^neb:||;
 
     my @keys;
@@ -939,16 +942,10 @@
     $log->debug("entered - @_");
 
-    {
-        my $volume;
-        ($volume, $key) = parse_neb_key($key);
-        if (defined $volume) {
-            die "$volume is not a valid volume name"
-                unless $self->_is_valid_volume_name($volume);
-        }
-        $vol_name ||= $volume;
-    }
-
-    # handle :any volume
-    if ($vol_name eq ':any') {
+    $key = parse_neb_key($key, $vol_name);
+    # vol_name overrides the key implied volume
+    $vol_name = $key->volume;
+
+    # handle soft volumes
+    if (defined $key->soft_volume) {
         $vol_name = undef;
     }
@@ -960,5 +957,5 @@
             $query = $db->prepare_cached( $sql->get_object_instances_by_vol_name );
             # ext_id, name, available
-            my $rows = $query->execute($key, $vol_name, 1);
+            my $rows = $query->execute($key->path, $vol_name, 1);
             unless ($rows > 0) {
                 $query->finish;
@@ -968,5 +965,5 @@
             $query = $db->prepare_cached( $sql->get_object_instances );
             # ext_id, available
-            my $rows = $query->execute($key, 1);
+            my $rows = $query->execute($key->path, 1);
             unless ($rows > 0) {
                 $query->finish;
@@ -1102,5 +1099,5 @@
     eval {
         my $query = $db->prepare_cached( $sql->stat_object );
-        my $rows = $query->execute($key);
+        my $rows = $query->execute($key->path);
 
         unless ($rows == 1) {
@@ -1228,6 +1225,5 @@
     my $key = shift;
 
-    my $volume;
-    ($volume, $key) = parse_neb_key($key);
+    $key = parse_neb_key($key);
 
     my ($vol_id, $vol_host, $vol_path, $xattr);
@@ -1236,5 +1232,5 @@
         my $query = $db->prepare_cached( $sql->get_replication_volume_for_ext_id );
         # ext_id, %free, avaiable, allocate
-        $rows = $query->execute($key, 0.95, 1, 1);
+        $rows = $query->execute($key->path, 0.95, 1, 1);
         # XXX destinguish between non-existant and unaviable
         unless ($rows > 0) {
@@ -1271,11 +1267,10 @@
     my $db  =$self->db;
 
-    my $volume;
-    ($volume, $key) = parse_neb_key($key);
+    $key = parse_neb_key($key);
 
     my $ext_id;
     eval {
         my $query = $db->prepare_cached( $sql->get_object ); 
-        $query->execute($key);
+        $query->execute($key->path);
         ($ext_id) = $query->fetchrow_array;
         $query->finish;
@@ -1303,6 +1298,10 @@
     my $db  =$self->db;
 
-    # handle ":any" volume
-    if ($vol_name eq ':any') {
+    my $volume_info = parse_neb_volume($vol_name);
+
+    $vol_name = $volume_info->{volume};
+
+    # handle "any" volume
+    if ($vol_name eq 'any') {
         return 1;
     }
