Solstice

 view release on metacpan or  search on metacpan

lib/Solstice/Resource/File/BlackBox.pm  view on Meta::CPAN

package Solstice::Resource::File::BlackBox;

# $Id: BlackBox.pm 924 2006-03-03 00:13:09Z jlaney $

=head1 NAME

Solstice::Resource::File::BlackBox - A file implementation 

=head1 SYNOPSIS

  package Solstice::Resource::File::BlackBox;

  use Solstice::Resource::File::BlackBox;

=head1 DESCRIPTION

=cut

use 5.006_000;
use strict;
use warnings;

use base qw(Solstice::Resource::File);

use Solstice::Database;
use Solstice::DateTime;
use Solstice::Encryption;

use Image::Magick;
use Digest::MD5 qw(md5_hex);

use constant TRUE  => 1;
use constant FALSE => 0;

use constant FILE_ROOT => 'solstice/files';

our ($VERSION) = ('$Revision: 924 $' =~ /^\$Revision:\s*([\d.]*)/);

=head2 Superclass

L<Solstice::Resource::File|Solstice::Resource::File>.

=head2 Export

No symbols exported.

=head2 Methods

=over 4

=cut

=item setAttribute($key, $value)

=cut

sub setAttribute {
    my $self = shift;
    my $key  = shift;
    return FALSE unless $key;
    $self->_getAttributes()->{$key} = shift;
    $self->_taint();
    return TRUE;    
}

=item getAttribute($key)

Returns the value of the attribute identified by $key.

=cut

sub getAttribute {
    my $self = shift;
    my $key  = shift;
    return $self->_getAttributes()->{$key};
}

=item setName($name)

Sets the name of the resource.

=cut

sub setName {
    my $self = shift;
    my $name = shift;
    $self->_taint();
    return $self->_setName($name);
}

lib/Solstice/Resource/File/BlackBox.pm  view on Meta::CPAN

    
    return FALSE unless defined $owner;
  
    my $db = Solstice::Database->new();
    my $db_name = $self->getConfigService()->getDBName();
  
    if (defined $self->getID()) {
        $self->_setModificationDate(Solstice::DateTime->new(time));

        $db->writeQuery('UPDATE '.$db_name.'.File
            SET name = ?, modification_date = ?
            WHERE file_id = ?',
            $self->getName(),
            $self->getModificationDate()->toSQL(),
            $self->getID() );
        
    } else {
        my $filehandle = $self->_getFilehandle();
        if (!defined $filehandle) {
            $filehandle = $self->_getPerlFilehandle();
        }
    
        return FALSE unless defined $filehandle;
    
        $self->_setModificationDate(Solstice::DateTime->new(time));
        $self->_setCreationDate(Solstice::DateTime->new(time));

        $db->writeQuery('INSERT INTO '.$db_name.'.File (
                person_id, name, creation_date, modification_date,
                content_type, content_length
            ) VALUES (?,?,?,?,?,?)',
            $owner->getID(),
            $self->getName(),
            $self->getCreationDate()->toSQL(),
            $self->getModificationDate()->toSQL(),
            $self->getContentType(),
            $self->getSize() );
    
        $self->_setID($db->getLastInsertID());

        # Write the file content to disk
        my $file_path = $self->_generateFilePath(); 
        $self->_dirCheck($file_path);
        $file_path .= $self->getID();
        
        open(my $FILE, '>', $file_path) or die "Cannot open file $file_path for writing\n";
    
        binmode($FILE);
        while (my $content = <$filehandle>) {
            print $FILE $content;
        }
        close($FILE);
   
        $self->_setFilehandle(undef);
        $self->_setPerlFilehandle(undef);
        
        my $ct_service = $self->getContentTypeService();
        if ($ct_service->isKnownType($self->getContentType())) {
            # Images only: get width and height attributes once
            if ($ct_service->isImageType($self->getContentType())) {
                my $image = Image::Magick->new();
                my $msg = $image->Read(filename => $file_path);
                unless ($msg && $msg !~ /^Exception (415|420)/) {
                    $self->setAttribute('width', $image->Get('width'));
                    $self->setAttribute('height', $image->Get('height'));
                }
            }
        } else {
            # Log the unknown content types
            $self->getLogService()->log({
                log_file => 'unknown_content_types',
                model_id => $self->getID(),
                content  => $self->getContentType(),
            });
        }
    }
    $self->_storeAttributes();
    $self->_untaint();
    
    return TRUE;
}

=item _delete()
    
=cut 

sub _delete {
    my $self = shift;

    return FALSE unless $self->getID();

    my $db = Solstice::Database->new();
    my $db_name = $self->getConfigService()->getDBName();
    
    $db->writeQuery('DELETE FROM '.$db_name.'.File
        WHERE file_id = ?', $self->getID());

    $db->writeQuery('DELETE FROM '.$db_name.'.FileAttribute
        WHERE file_id = ?', $self->getID());
    
    unlink($self->getPath());
    
    return TRUE;
}

=item _initFromID($int)

Loads the File from the DB by id.

=cut

sub _initFromID {
    my $self = shift;
    my $id   = shift;

    my $db = Solstice::Database->new();
    my $db_name = $self->getConfigService()->getDBName();

    $db->readQuery('SELECT f.file_id AS id, f.* 
        FROM '.$db_name.'.File AS f 
        WHERE f.file_id = ?', $id



( run in 2.429 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )