To implement binary caches efficiently, Hydra needs to be able to map the hash part of a store path (e.g. "gbg...zr7") to the full store path (e.g. "/nix/store/gbg...kzr7-subversion-1.7.5"). (The binary cache mechanism uses hash parts as a key for looking up store paths to ensure privacy.) However, doing a search in the Nix store for /nix/store/<hash>* is expensive since it requires reading the entire directory. queryPathFromHashPart() prevents this by doing a cheap database lookup.
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
package Nix::Store;
 | 
						|
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
use Nix::Config;
 | 
						|
 | 
						|
require Exporter;
 | 
						|
 | 
						|
our @ISA = qw(Exporter);
 | 
						|
 | 
						|
our %EXPORT_TAGS = ( 'all' => [ qw( ) ] );
 | 
						|
 | 
						|
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
 | 
						|
 | 
						|
our @EXPORT = qw(
 | 
						|
    isValidPath queryReferences queryPathInfo queryDeriver queryPathHash
 | 
						|
    queryPathFromHashPart
 | 
						|
    topoSortPaths computeFSClosure followLinksToStorePath exportPaths
 | 
						|
    hashPath hashFile hashString
 | 
						|
    addToStore makeFixedOutputPath
 | 
						|
    derivationFromPath
 | 
						|
);
 | 
						|
 | 
						|
our $VERSION = '0.15';
 | 
						|
 | 
						|
sub backtick {
 | 
						|
    open(RES, "-|", @_) or die;
 | 
						|
    local $/;
 | 
						|
    my $res = <RES> || "";
 | 
						|
    close RES or die;
 | 
						|
    return $res;
 | 
						|
}
 | 
						|
 | 
						|
if ($Nix::Config::useBindings) {
 | 
						|
    require XSLoader;
 | 
						|
    XSLoader::load('Nix::Store', $VERSION);
 | 
						|
} else {
 | 
						|
 | 
						|
    # Provide slow fallbacks of some functions on platforms that don't
 | 
						|
    # support the Perl bindings.
 | 
						|
 | 
						|
    use File::Temp;
 | 
						|
    use Fcntl qw/F_SETFD/;
 | 
						|
 | 
						|
    sub hashFile {
 | 
						|
        my ($algo, $base32, $path) = @_;
 | 
						|
        my $res = backtick("$Nix::Config::binDir/nix-hash", "--flat", $path, "--type", $algo, $base32 ? "--base32" : ());
 | 
						|
        chomp $res;
 | 
						|
        return $res;
 | 
						|
    }
 | 
						|
    
 | 
						|
    sub hashPath {
 | 
						|
        my ($algo, $base32, $path) = @_;
 | 
						|
        my $res = backtick("$Nix::Config::binDir/nix-hash", $path, "--type", $algo, $base32 ? "--base32" : ());
 | 
						|
        chomp $res;
 | 
						|
        return $res;
 | 
						|
    }
 | 
						|
    
 | 
						|
    sub hashString {
 | 
						|
        my ($algo, $base32, $s) = @_;
 | 
						|
        my $fh = File::Temp->new();
 | 
						|
        print $fh $s;
 | 
						|
        my $res = backtick("$Nix::Config::binDir/nix-hash", $fh->filename, "--type", $algo, $base32 ? "--base32" : ());
 | 
						|
        chomp $res;
 | 
						|
        return $res;
 | 
						|
    }
 | 
						|
    
 | 
						|
    sub addToStore {
 | 
						|
        my ($srcPath, $recursive, $algo) = @_;
 | 
						|
        die "not implemented" if $recursive || $algo ne "sha256";
 | 
						|
        my $res = backtick("$Nix::Config::binDir/nix-store", "--add", $srcPath);
 | 
						|
        chomp $res;
 | 
						|
        return $res;
 | 
						|
    }
 | 
						|
    
 | 
						|
    sub isValidPath {
 | 
						|
        my ($path) = @_;
 | 
						|
        my $res = backtick("$Nix::Config::binDir/nix-store", "--check-validity", "--print-invalid", $path);
 | 
						|
        chomp $res;
 | 
						|
        return $res ne $path;
 | 
						|
    }
 | 
						|
    
 | 
						|
    sub queryPathHash {
 | 
						|
        my ($path) = @_;
 | 
						|
        my $res = backtick("$Nix::Config::binDir/nix-store", "--query", "--hash", $path);
 | 
						|
        chomp $res;
 | 
						|
        return $res;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
1;
 | 
						|
__END__
 |