about summary refs log tree commit diff
path: root/src/libstore/store-api.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/store-api.hh')
-rw-r--r--src/libstore/store-api.hh115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh
new file mode 100644
index 0000000000..91beba50f7
--- /dev/null
+++ b/src/libstore/store-api.hh
@@ -0,0 +1,115 @@
+#ifndef __STOREAPI_H
+#define __STOREAPI_H
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "hash.hh"
+
+
+namespace nix {
+
+
+/* A substitute is a program invocation that constructs some store
+   path (typically by fetching it from somewhere, e.g., from the
+   network). */
+struct Substitute
+{       
+    /* The derivation that built this store path (empty if none). */
+    Path deriver;
+    
+    /* Program to be executed to create the store path.  Must be in
+       the output path of `storeExpr'. */
+    Path program;
+
+    /* Extra arguments to be passed to the program (the first argument
+       is the store path to be substituted). */
+    Strings args;
+
+    bool operator == (const Substitute & sub) const;
+};
+
+typedef list<Substitute> Substitutes;
+
+
+class StoreAPI 
+{
+public:
+
+    virtual ~StoreAPI() { }
+
+    /* Checks whether a path is valid. */ 
+    virtual bool isValidPath(const Path & path) = 0;
+
+    /* Return the substitutes for the given path. */
+    virtual Substitutes querySubstitutes(const Path & srcPath) = 0;
+
+    /* Queries the hash of a valid path. */ 
+    virtual Hash queryPathHash(const Path & path) = 0;
+
+    /* Queries the set of outgoing FS references for a store path.
+       The result is not cleared. */
+    virtual void queryReferences(const Path & storePath,
+        PathSet & references) = 0;
+
+    /* Queries the set of incoming FS references for a store path.
+       The result is not cleared. */
+    virtual void queryReferrers(const Path & storePath,
+        PathSet & referrers) = 0;
+
+    /* Copy the contents of a path to the store and register the
+       validity the resulting path.  The resulting path is
+       returned. */
+    virtual Path addToStore(const Path & srcPath) = 0;
+
+    /* Like addToStore(), but for pre-adding the outputs of
+       fixed-output derivations. */
+    virtual Path addToStoreFixed(bool recursive, string hashAlgo,
+        const Path & srcPath) = 0;
+
+    /* Like addToStore, but the contents written to the output path is
+       a regular file containing the given string. */
+    virtual Path addTextToStore(const string & suffix, const string & s,
+        const PathSet & references) = 0;
+};
+
+
+/* !!! These should be part of the store API, I guess. */
+
+/* Throw an exception if `path' is not directly in the Nix store. */
+void assertStorePath(const Path & path);
+
+bool isInStore(const Path & path);
+bool isStorePath(const Path & path);
+
+void checkStoreName(const string & name);
+
+/* Chop off the parts after the top-level store name, e.g.,
+   /nix/store/abcd-foo/bar => /nix/store/abcd-foo. */
+Path toStorePath(const Path & path);
+
+
+/* Constructs a unique store path name. */
+Path makeStorePath(const string & type,
+    const Hash & hash, const string & suffix);
+    
+Path makeFixedOutputPath(bool recursive,
+    string hashAlgo, Hash hash, string name);
+
+
+/* For now, there is a single global store API object, but we'll
+   purify that in the future. */
+extern boost::shared_ptr<StoreAPI> store;
+
+
+/* Factory method: open the Nix database, either through the local or
+   remote implementation. */
+boost::shared_ptr<StoreAPI> openStore(bool reserveSpace = true);
+
+
+
+}
+
+
+#endif /* !__STOREAPI_H */