about summary refs log tree commit diff
path: root/src/libstore/store-api.hh
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-11-30T17·43+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-11-30T17·43+0000
commite2ef5e07fdc142670f7f3161d3133ff04e99d342 (patch)
treebf724d6af6f7fbe3b388fdfdd40f190da9a8378e /src/libstore/store-api.hh
parent5f0b9de6d837daf43c6ab26d41c829621c3ca727 (diff)
* Refactoring. There is now an abstract interface class StoreAPI
  containing functions that operate on the Nix store.  One
  implementation is LocalStore, which operates on the Nix store
  directly.  The next step, to enable secure multi-user Nix, is to
  create a different implementation RemoteStore that talks to a
  privileged daemon process that uses LocalStore to perform the actual
  operations.

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 000000000000..91beba50f7d2
--- /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 */