IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 30, 2010, 9:31:50 AM (16 years ago)
Author:
eugene
Message:

updates from trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20100621/Nebulous-Server/lib/Nebulous/Server.pm

    r27115 r28794  
    99no warnings qw( uninitialized );
    1010
    11 our $VERSION = '0.17';
     11our $VERSION = '0.18';
    1212
    1313use base qw( Class::Accessor::Fast );
     
    15101510}
    15111511
     1512sub find_objects_wildcard
     1513{
     1514    my $self = shift;
     1515
     1516    my $log = $self->log;
     1517    $log->debug( "entered - @_" );
     1518
     1519    my ($pattern) = validate_pos( @_,
     1520        {
     1521            type        => SCALAR,
     1522            optional    => 1,
     1523        },
     1524    );
     1525
     1526    my $sql = $self->sql;
     1527    my $db  = $self->_db_for_index(0);
     1528   
     1529    # validate that we have a key to deal with
     1530    eval {
     1531        $pattern = parse_neb_key($pattern) if defined $pattern;
     1532    };
     1533    $log->logdie("$@") if $@;
     1534
     1535    unless (defined $pattern) {
     1536        $log->debug( "leaving" );
     1537        $log->logdie("no keys found");
     1538    }
     1539
     1540    # parse out the directory we're working in, and decide if we are a directory
     1541    my $dir_id = $self->_resolve_dir_parent_id(key => $pattern, dir_id => 1);
     1542    my $work_dir;
     1543    my $file_pattern;
     1544    if (defined $dir_id) {
     1545        $work_dir = $pattern;
     1546        $file_pattern = '%';
     1547    }
     1548    else {
     1549        my $dir_plain = dirname($pattern);
     1550        if ($dir_plain eq 'neb:') {
     1551            $dir_plain = 'neb:///';
     1552        }
     1553        if ($dir_plain) {
     1554            $work_dir = parse_neb_key($dir_plain);
     1555        }
     1556        else {
     1557            $work_dir = parse_neb_key('/');
     1558        }
     1559        $file_pattern = basename $pattern;
     1560        unless ($file_pattern) {
     1561            $file_pattern = '%';
     1562        }
     1563       
     1564        $dir_id = $self->_resolve_dir_parent_id(key => $work_dir, dir_id => 1);
     1565        unless (defined $dir_id) {
     1566            $log->logdie("pattern $work_dir does not match any key or directory");
     1567        }
     1568    }
     1569   
     1570    # find dirs under dir
     1571    my @dir_keys;
     1572
     1573    eval {
     1574        $log->debug("looking for directories under dir: $dir_id");
     1575        my $query = $db->prepare_cached( $sql->find_dir_by_parent_id . " AND dirname LIKE ? ");
     1576        $query->execute( $dir_id, $file_pattern );
     1577
     1578        while ( my $row = $query->fetchrow_hashref ) {
     1579            next if $row->{'dir_id'} == 1;
     1580            my $dir = $row->{'dirname'};
     1581            if ($dir_id == 1) {
     1582                push @dir_keys, $dir . '/' if $dir;
     1583            } else {
     1584                push @dir_keys, $work_dir->path . '/' . $dir . '/' if $dir;
     1585            }
     1586            $log->debug( "matched $dir" ) if $dir;
     1587        }
     1588    };
     1589    $log->logdie("database error: $@") if $@;
     1590
     1591    # find files under dir
     1592    my @keys;
     1593    eval {
     1594        $log->debug("looking for objects under dir: $dir_id");
     1595        my $query = $db->prepare_cached( $sql->find_object_by_dir_id . " AND ext_id_basename LIKE ? ");
     1596        $query->execute( $dir_id , $file_pattern);
     1597
     1598        while ( my $row = $query->fetchrow_hashref ) {
     1599            my $key = $row->{ 'ext_id' };
     1600            push @keys, $key if $key;
     1601            $log->debug( "matched $key" ) if $key;
     1602        }
     1603    };
     1604    $log->logdie("database error: $@") if $@;
     1605
     1606    $log->debug( "leaving" );
     1607   
     1608    return [sort(@dir_keys), sort(@keys)];
     1609
     1610}
     1611
    15121612# find matching objects from the given server
    15131613sub _find_objects_for_index
     
    15981698}
    15991699
     1700sub find_ext_id_by_volume
     1701{
     1702    my $self = shift;
     1703    my $log = $self->log;
     1704    $log->debug("entered - @_");
     1705    my ($vol_name,$limit) = validate_pos(@_,
     1706                                        {
     1707                                            type      => SCALAR,
     1708# #                                         callbacks => {
     1709# #                                             'is valid volume name' => sub {
     1710# #                                                 return 1 if not defined $_[0];
     1711# #                                                 $self->_is_valid_volume_name($_[0])
     1712# #                                             },
     1713#                                           },
     1714                                        },
     1715                                        {
     1716                                            type      => SCALAR|UNDEF,
     1717                                            optional => 1,
     1718                                        },
     1719        );
     1720    unless (defined($limit)) {
     1721        $limit = 50000;
     1722    }
     1723
     1724    my $sql = $self->sql;
     1725    my @ext_ids;
     1726    my $db = $self->_db_for_index(0);
     1727    eval {
     1728        my $query;
     1729        $query = $db->prepare_cached( $sql->get_ext_id_by_vol_name );
     1730        my $rows = $query->execute($vol_name, 1,$limit);
     1731        unless ($rows > 0) {
     1732            $query->finish;
     1733            $log->logdie("no instances on storage volume or volume is not avaiable for volume: $vol_name");
     1734        }
     1735        while (my $row = $query->fetchrow_hashref) {
     1736            my $ext_id = $row->{ 'ext_id' };
     1737            push @ext_ids, $ext_id if $ext_id;
     1738        }
     1739    };
     1740    if ($@) {
     1741        $db->rollback;
     1742        $log->logdie("database error: $@");
     1743    }
     1744
     1745    # XXX remove this?
     1746    $log->logdie("no ext_ids found") unless (scalar @ext_ids);
     1747
     1748    $log->debug("found: \@ext_ids");
     1749
     1750    $log->debug("leaving");
     1751
     1752    return \@ext_ids;
     1753}
    16001754
    16011755sub find_instances
Note: See TracChangeset for help on using the changeset viewer.