Author: eelco
Date: Wed Nov 17 12:40:52 2010
New Revision: 24728
URL: https://svn.nixos.org/websvn/nix/?rev=24728&sc=1

Log:
* Add an operation `nix-store -q --size'.

Modified:
   nix/branches/sqlite/doc/manual/nix-store.xml
   nix/branches/sqlite/src/libstore/local-store.cc
   nix/branches/sqlite/src/libstore/local-store.hh
   nix/branches/sqlite/src/nix-store/help.txt
   nix/branches/sqlite/src/nix-store/nix-store.cc

Modified: nix/branches/sqlite/doc/manual/nix-store.xml
==============================================================================
--- nix/branches/sqlite/doc/manual/nix-store.xml        Wed Nov 17 12:08:01 
2010        (r24727)
+++ nix/branches/sqlite/doc/manual/nix-store.xml        Wed Nov 17 12:40:52 
2010        (r24728)
@@ -404,6 +404,7 @@
     <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 @@
   <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>
 

Modified: nix/branches/sqlite/src/libstore/local-store.cc
==============================================================================
--- nix/branches/sqlite/src/libstore/local-store.cc     Wed Nov 17 12:08:01 
2010        (r24727)
+++ nix/branches/sqlite/src/libstore/local-store.cc     Wed Nov 17 12:40:52 
2010        (r24728)
@@ -88,6 +88,13 @@
 }
 
 
+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 @@
     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 @@
     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 @@
     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);
 

Modified: nix/branches/sqlite/src/libstore/local-store.hh
==============================================================================
--- nix/branches/sqlite/src/libstore/local-store.hh     Wed Nov 17 12:08:01 
2010        (r24727)
+++ nix/branches/sqlite/src/libstore/local-store.hh     Wed Nov 17 12:40:52 
2010        (r24728)
@@ -70,6 +70,7 @@
     operator sqlite3_stmt * () { return stmt; }
     void bind(const string & value);
     void bind(int value);
+    void bind64(long long value);
     void bind();
 };
     

Modified: nix/branches/sqlite/src/nix-store/help.txt
==============================================================================
--- nix/branches/sqlite/src/nix-store/help.txt  Wed Nov 17 12:08:01 2010        
(r24727)
+++ nix/branches/sqlite/src/nix-store/help.txt  Wed Nov 17 12:40:52 2010        
(r24728)
@@ -16,7 +16,7 @@
 
   --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 @@
   --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):

Modified: nix/branches/sqlite/src/nix-store/nix-store.cc
==============================================================================
--- nix/branches/sqlite/src/nix-store/nix-store.cc      Wed Nov 17 12:08:01 
2010        (r24727)
+++ nix/branches/sqlite/src/nix-store/nix-store.cc      Wed Nov 17 12:40:52 
2010        (r24728)
@@ -226,7 +226,7 @@
 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 @@
             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 @@
             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;
 
_______________________________________________
nix-commits mailing list
[email protected]
http://mail.cs.uu.nl/mailman/listinfo/nix-commits

Reply via email to