- Timestamp:
- Jul 30, 2010, 9:31:50 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20100621/Nebulous-Server/lib/Nebulous/Server.pm
r27115 r28794 9 9 no warnings qw( uninitialized ); 10 10 11 our $VERSION = '0.1 7';11 our $VERSION = '0.18'; 12 12 13 13 use base qw( Class::Accessor::Fast ); … … 1510 1510 } 1511 1511 1512 sub 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 1512 1612 # find matching objects from the given server 1513 1613 sub _find_objects_for_index … … 1598 1698 } 1599 1699 1700 sub 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 } 1600 1754 1601 1755 sub find_instances
Note:
See TracChangeset
for help on using the changeset viewer.
