aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2010-11-17 12:40:52 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2010-11-17 12:40:52 +0000
commite60c962fb8dd3d8be37c1f4ae08d5247901fa129 (patch)
treec8ac16743478164312460f897901d1731930dbd1
parent1db6259076b1b8f667451da8d2e44a55ece19056 (diff)
* Add an operation `nix-store -q --size'.
-rw-r--r--doc/manual/nix-store.xml19
-rw-r--r--src/libstore/local-store.cc14
-rw-r--r--src/libstore/local-store.hh1
-rw-r--r--src/nix-store/help.txt3
-rw-r--r--src/nix-store/nix-store.cc13
5 files changed, 40 insertions, 10 deletions
diff --git a/doc/manual/nix-store.xml b/doc/manual/nix-store.xml
index 10bb3eda5..a32559c03 100644
--- a/doc/manual/nix-store.xml
+++ b/doc/manual/nix-store.xml
@@ -404,6 +404,7 @@ error: cannot delete path `/nix/store/zq0h41l75vlb4z45kzgjjmsjxvcv1qk7-mesa-6.4'
<arg choice='plain'><option>--tree</option></arg>
<arg choice='plain'><option>--binding</option> <replaceable>name</replaceable></arg>
<arg choice='plain'><option>--hash</option></arg>
+ <arg choice='plain'><option>--size</option></arg>
<arg choice='plain'><option>--roots</option></arg>
</group>
<arg><option>--use-output</option></arg>
@@ -587,9 +588,21 @@ query is applied to the target of the symlink.</para>
<varlistentry><term><option>--hash</option></term>
<listitem><para>Prints the SHA-256 hash of the contents of the
- store paths <replaceable>paths</replaceable>. Since the hash is
- stored in the Nix database, this is a fast
- operation.</para></listitem>
+ store paths <replaceable>paths</replaceable> (that is, the hash of
+ the output of <command>nix-store --dump</command> on the given
+ paths). Since the hash is stored in the Nix database, this is a
+ fast operation.</para></listitem>
+
+ </varlistentry>
+
+ <varlistentry><term><option>--size</option></term>
+
+ <listitem><para>Prints the size in bytes of the contents of the
+ store paths <replaceable>paths</replaceable> — to be precise, the
+ size of the output of <command>nix-store --dump</command> on the
+ given paths. Note that the actual disk space required by the
+ store paths may be higher, especially on filesystems with large
+ cluster sizes.</para></listitem>
</varlistentry>
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index 9595561bc..201e4bae1 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -88,6 +88,13 @@ void SQLiteStmt::bind(int value)
}
+void SQLiteStmt::bind64(long long value)
+{
+ if (sqlite3_bind_int64(stmt, curArg++, value) != SQLITE_OK)
+ throw SQLiteError(db, "binding argument");
+}
+
+
void SQLiteStmt::bind()
{
if (sqlite3_bind_null(stmt, curArg++) != SQLITE_OK)
@@ -340,7 +347,7 @@ void LocalStore::openDB(bool create)
stmtAddReference.create(db,
"insert or replace into Refs (referrer, reference) values (?, ?);");
stmtQueryPathInfo.create(db,
- "select id, hash, registrationTime, deriver from ValidPaths where path = ?;");
+ "select id, hash, registrationTime, deriver, narSize from ValidPaths where path = ?;");
stmtQueryReferences.create(db,
"select path from Refs join ValidPaths on reference = id where referrer = ?;");
stmtQueryReferrers.create(db,
@@ -449,7 +456,7 @@ unsigned long long LocalStore::addValidPath(const ValidPathInfo & info)
else
stmtRegisterValidPath.bind(); // null
if (info.narSize != 0)
- stmtRegisterValidPath.bind(info.narSize);
+ stmtRegisterValidPath.bind64(info.narSize);
else
stmtRegisterValidPath.bind(); // null
if (sqlite3_step(stmtRegisterValidPath) != SQLITE_DONE)
@@ -600,6 +607,9 @@ ValidPathInfo LocalStore::queryPathInfo(const Path & path)
s = (const char *) sqlite3_column_text(stmtQueryPathInfo, 3);
if (s) info.deriver = s;
+ /* Note that narSize = NULL yields 0. */
+ info.narSize = sqlite3_column_int64(stmtQueryPathInfo, 4);
+
/* Get the references. */
SQLiteStmtUse use2(stmtQueryReferences);
diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh
index 2fd31c26d..4076e5957 100644
--- a/src/libstore/local-store.hh
+++ b/src/libstore/local-store.hh
@@ -70,6 +70,7 @@ struct SQLiteStmt
operator sqlite3_stmt * () { return stmt; }
void bind(const string & value);
void bind(int value);
+ void bind64(long long value);
void bind();
};
diff --git a/src/nix-store/help.txt b/src/nix-store/help.txt
index 342281b33..478251851 100644
--- a/src/nix-store/help.txt
+++ b/src/nix-store/help.txt
@@ -16,7 +16,7 @@ Operations:
--gc: run the garbage collector
- --dump: dump a path as a Nix archive, forgetting dependencies
+ --dump: dump a path as a Nix archive (NAR), forgetting dependencies
--restore: restore a path from a Nix archive, without
registering validity
@@ -44,6 +44,7 @@ Query flags:
--graph: print a dot graph rooted at given path
--xml: emit an XML representation of the graph rooted at the given path
--hash: print the SHA-256 hash of the contents of the path
+ --size: print the size of the NAR dump of the path
--roots: print the garbage collector roots that point to the path
Query switches (not applicable to all queries):
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index 120f6ce72..49a705585 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -226,7 +226,7 @@ static void printTree(const Path & path,
static void opQuery(Strings opFlags, Strings opArgs)
{
enum { qOutputs, qRequisites, qReferences, qReferrers
- , qReferrersClosure, qDeriver, qBinding, qHash
+ , qReferrersClosure, qDeriver, qBinding, qHash, qSize
, qTree, qGraph, qXml, qResolve, qRoots } query = qOutputs;
bool useOutput = false;
bool includeOutputs = false;
@@ -248,6 +248,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
query = qBinding;
}
else if (*i == "--hash") query = qHash;
+ else if (*i == "--size") query = qSize;
else if (*i == "--tree") query = qTree;
else if (*i == "--graph") query = qGraph;
else if (*i == "--xml") query = qXml;
@@ -310,11 +311,15 @@ static void opQuery(Strings opFlags, Strings opArgs)
break;
case qHash:
+ case qSize:
foreach (Strings::iterator, i, opArgs) {
Path path = maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise);
- Hash hash = store->queryPathHash(path);
- assert(hash.type == htSHA256);
- cout << format("sha256:%1%\n") % printHash32(hash);
+ ValidPathInfo info = store->queryPathInfo(path);
+ if (query == qHash) {
+ assert(info.hash.type == htSHA256);
+ cout << format("sha256:%1%\n") % printHash32(info.hash);
+ } else if (query == qSize)
+ cout << format("%1%\n") % info.narSize;
}
break;