#ifndef __LOCAL_STORE_H #define __LOCAL_STORE_H #include #include "store-api.hh" namespace nix { class Transaction; /* Nix store and database schema version. Version 1 (or 0) was Nix <= 0.7. Version 2 was Nix 0.8 and 0.9. Version 3 is Nix 0.10. Version 4 is Nix 0.11. */ const int nixSchemaVersion = 4; extern string drvsLogDir; struct OptimiseStats { unsigned long totalFiles; unsigned long sameContents; unsigned long filesLinked; unsigned long long bytesFreed; OptimiseStats() { totalFiles = sameContents = filesLinked = 0; bytesFreed = 0; } }; class LocalStore : public StoreAPI { private: bool substitutablePathsLoaded; PathSet substitutablePaths; public: /* Open the database environment. If `reserveSpace' is true, make sure that a big empty file exists in /nix/var/nix/db/reserved. If `reserveSpace' is false, delete this file if it exists. The idea is that on normal operation, the file exists; but when we run the garbage collector, it is deleted. This is to ensure that the garbage collector has a small amount of disk space available, which is required to open the Berkeley DB environment. */ LocalStore(bool reserveSpace); ~LocalStore(); /* Implementations of abstract store API methods. */ bool isValidPath(const Path & path); PathSet queryValidPaths(); Hash queryPathHash(const Path & path); void queryReferences(const Path & path, PathSet & references); void queryReferrers(const Path & path, PathSet & referrers); Path queryDeriver(const Path & path); PathSet querySubstitutablePaths(); bool hasSubstitutes(const Path & path); Path addToStore(const Path & srcPath, bool fixed = false, bool recursive = false, string hashAlgo = "", PathFilter & filter = defaultPathFilter); Path addTextToStore(const string & suffix, const string & s, const PathSet & references); void exportPath(const Path & path, bool sign, Sink & sink); Path importPath(bool requireSignature, Source & source); void buildDerivations(const PathSet & drvPaths); void ensurePath(const Path & path); void addTempRoot(const Path & path); void addIndirectRoot(const Path & path); void syncWithGC(); Roots findRoots(); void collectGarbage(GCAction action, const PathSet & pathsToDelete, bool ignoreLiveness, PathSet & result, unsigned long long & bytesFreed); /* Optimise the disk space usage of the Nix store by hard-linking files with the same contents. */ void optimiseStore(bool dryRun, OptimiseStats & stats); }; /* Get a transaction object. */ void createStoreTransaction(Transaction & txn); /* Copy a path recursively. */ void copyPath(const Path & src, const Path & dst); /* Register the validity of a path, i.e., that `path' exists, that the paths referenced by it exists, and in the case of an output path of a derivation, that it has been produced by a succesful execution of the derivation (or something equivalent). Also register the hash of the file system contents of the path. The hash must be a SHA-256 hash. */ void registerValidPath(const Transaction & txn, const Path & path, const Hash & hash, const PathSet & references, const Path & deriver); typedef list ValidPathInfos; void registerValidPaths(const Transaction & txn, const ValidPathInfos & infos); /* "Fix", or canonicalise, the meta-data of the files in a store path after it has been built. In particular: - the last modification date on each file is set to 0 (i.e., 00:00:00 1/1/1970 UTC) - the permissions are set of 444 or 555 (i.e., read-only with or without execute permission; setuid bits etc. are cleared) - the owner and group are set to the Nix user and group, if we're in a setuid Nix installation. */ void canonicalisePathMetaData(const Path & path); /* Checks whether a path is valid. */ bool isValidPathTxn(const Transaction & txn, const Path & path); /* Sets the set of outgoing FS references for a store path. Use with care! */ void setReferences(const Transaction & txn, const Path & path, const PathSet & references); /* Sets the deriver of a store path. Use with care! */ void setDeriver(const Transaction & txn, const Path & path, const Path & deriver); /* Delete a value from the nixStore directory. */ void deleteFromStore(const Path & path, unsigned long long & bytesFreed); MakeError(PathInUse, Error); void verifyStore(bool checkContents); /* Whether we are in build users mode. */ bool haveBuildUsers(); /* Whether we are root. */ bool amPrivileged(); /* Recursively change the ownership of `path' to the current uid. */ void getOwnership(const Path & path); /* Like deletePath(), but changes the ownership of `path' using the setuid wrapper if necessary (and possible). */ void deletePathWrapped(const Path & path, unsigned long long & bytesFreed); void deletePathWrapped(const Path & path); } #endif /* !__LOCAL_STORE_H */