use memcached session bucket for usage
[cloudstore.git] / lib / CloudStore / Couchbase.pm
index 2e9dc15..7585784 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 
 use autodie;
 use JSON::XS;
-use File::Path qw();
+use File::Path qw(make_path);
 use File::Slurp qw();
 use Cache::Memcached;
 use Digest::MD5 qw(md5_base64);
@@ -12,7 +12,7 @@ use Data::Dump qw(dump);
 
 my $buckets = {
        files => 5800,
-       usage => 5801,
+       session => 5801,
 };
 
 sub new {
@@ -42,22 +42,28 @@ sub new {
 
 sub usage_decr {
        my ($self,$data) = @_;
-       $self->{usage}->decr( $data->{login} => $data->{size} );
+       $self->{session}->decr( $data->{login} . ':usage' => $data->{size} );
 }
 
 sub usage_incr {
        my ($self,$data) = @_;
-       $self->{usage}->incr( $data->{login} => $data->{size} );
+       $self->{session}->incr( $data->{login} . ':usage' => $data->{size} );
 }
 
 sub usage {
        my ($self,$data) = @_;
-       $self->{usage}->get( $data->{login} );
+       $self->{session}->get( $data->{login} . ':usage' );
+}
+
+sub _key {
+       my $data = shift;
+       #md5_base64( $data->{login} . '/' . $data->{file} );
+       $data->{login} . ':' . $data->{file};
 }
 
 sub file_set {
        my ($self,$data) = @_;
-       my $k = md5_base64( $data->{login} . '/' . $data->{file} );
+       my $k = _key $data;
        my $json = encode_json $data;
        $self->{files}->set( $k => $json );
        return $json;
@@ -65,7 +71,7 @@ sub file_set {
 
 sub file_get {
        my ($self,$data) = @_;
-       my $k = md5_base64( $data->{login} . '/' . $data->{file} );
+       my $k = _key $data;
        if ( my $json = $self->{files}->get($k) ) {
                return decode_json $json;
        }
@@ -90,7 +96,7 @@ sub new_file {
 sub remove_file {
        my ( $self, $data ) = @_;
        $self->usage_decr( $data );
-       my $k = md5_base64( $data->{login} . '/' . $data->{file} );
+       my $k = _key $data;
        $self->{files}->delete( $k );
 }
 
@@ -99,16 +105,9 @@ sub make_dir {
 
 }
 
-sub remove_dir {
-       my ( $self, $data ) = @_;
-
-}
-
 sub transfer {
        my ( $self,$data ) = @_;
 
-       $data->{base64_path} ||= md5_base64( $data->{login} . '/' . $data->{file} );
-
        my $blob = "users/$data->{login}/blob";
         my $path = "$blob/$data->{file}";
 
@@ -124,13 +123,7 @@ sub transfer {
                        die "unknown type $type ", dump $data;
                }
        } elsif ( $data->{itemize} =~ m/\*deleting/ ) {
-               if ( -d $path ) {
-                       $self->remove_dir($data);
-               } elsif ( -f $path ) {
-                       $self->remove_file($data);
-               } else {
-                       die "unknown delete ", dump $data;
-               }
+               $self->remove_file($data);
        }
        return $data;
 }
@@ -172,10 +165,18 @@ sub dedup {
                        my $new = "users/$data->{login}/blob/$dir$file";
                        if ( ! -e $new ) {
                                # create path from md5sum file
-                               my $dir = $1 if $new =~ m{^(.+)/[^/]+$};
-                               make_path $dir unless -d $dir;
+                               my $only_dir = $1 if $new =~ m{^(.+)/[^/]+$};
+                               make_path $only_dir unless -d $only_dir;
                                $imported += link "md5/$md5", $new;
-                               $self->new_file( $data );
+                               my $fake = {
+                                       login => $data->{login},
+                                       host => $data->{host},
+                                       file => $dir . $file,
+                                       md5 => $md5,
+                                       size => -s $new,
+                               };
+                               $self->new_file($fake);
+                               warn "fake ",dump($fake);
                        } else {
                                md5pool $new => $md5;
                        }