Merge remote-tracking branch 'git.irl/master'

Conflicts:
	include/ccnx-name.h
diff --git a/include/ccnx-name.h b/include/ccnx-name.h
index d652008..8b8be4a 100644
--- a/include/ccnx-name.h
+++ b/include/ccnx-name.h
@@ -1,3 +1,24 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012-2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
+ *	   Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
 #ifndef CCNX_NAME_H
 #define CCNX_NAME_H
 #include <boost/shared_ptr.hpp>
@@ -23,6 +44,14 @@
   getBuf() { return m_buf; }
   static CcnxCharbufPtr Null;
 
+  const unsigned char *
+  buf () const
+  { return m_buf->buf; }
+
+  size_t
+  length () const
+  { return m_buf->length; }
+  
 private:
   void init(ccn_charbuf *buf);
 
@@ -42,11 +71,14 @@
   Name(const vector<Bytes> &comps);
   Name(const Name &other);
   Name(const unsigned char *data, const ccn_indexbuf *comps);
+  Name (const unsigned char *buf, const size_t length);
   virtual ~Name() {}
 
   CcnxCharbufPtr
   toCcnxCharbuf() const;
 
+  operator CcnxCharbufPtr () const { return toCcnxCharbuf (); }
+
   Name &
   appendComp(const Bytes &comp);
 
diff --git a/src/action-item.proto b/src/action-item.proto
index 6d50065..0144a22 100644
--- a/src/action-item.proto
+++ b/src/action-item.proto
@@ -17,6 +17,6 @@
   optional uint32 ctime = 10;
   optional uint32 mode  = 11;
 
-  optional string parent_device_name = 12;
+  optional bytes  parent_device_name = 12;
   optional uint64 parent_seq_no = 13;
 }
diff --git a/src/action-log.cc b/src/action-log.cc
index 3b9f757..a701885 100644
--- a/src/action-log.cc
+++ b/src/action-log.cc
@@ -68,7 +68,7 @@
         {
           parent_device_id = sqlite3_column_int64 (stmt, 1);
           parent_seq_no = sqlite3_column_int64 (stmt, 2);
-          parent_device_name = string(reinterpret_cast<const char*> (sqlite3_column_text (stmt, 4)));
+          parent_device_name = string(reinterpret_cast<const char*> (sqlite3_column_blob (stmt, 4), sqlite3_column_bytes (stmt, 4)));
         }
     }
   
@@ -245,7 +245,7 @@
 {
   ActionLog *the = reinterpret_cast<ActionLog*> (sqlite3_user_data (context));
 
-  if (argc != 8)
+  if (argc != 10)
     {
       sqlite3_result_error (context, "``apply_action'' expects 8 arguments", -1);
       return;
@@ -257,37 +257,46 @@
   // cout << "action: " << sqlite3_value_int (argv[1]) << endl;
   // cout << "filename: " << sqlite3_value_text (argv[2]) << endl;
   
-  string device_name = reinterpret_cast<const char*> (sqlite3_value_text (argv[0]));
-  int action         = sqlite3_value_int  (argv[1]);
-  string filename    = reinterpret_cast<const char*> (sqlite3_value_text (argv[2]));
+  string device_name (reinterpret_cast<const char*> (sqlite3_value_blob (argv[0])), sqlite3_value_bytes (argv[0]));
+  sqlite3_int64 device_id = sqlite3_value_int64 (argv[1]);
+  sqlite3_int64 seq_no    = sqlite3_value_int64 (argv[2]);
+  int action         = sqlite3_value_int  (argv[3]);
+  string filename    = reinterpret_cast<const char*> (sqlite3_value_text (argv[4]));
 
   if (action == 0) // update
     {
-      Hash hash (sqlite3_value_blob (argv[3]), sqlite3_value_bytes (argv[3]));
-      time_t atime = static_cast<time_t> (sqlite3_value_int64 (argv[4]));
-      time_t mtime = static_cast<time_t> (sqlite3_value_int64 (argv[5]));
-      time_t ctime = static_cast<time_t> (sqlite3_value_int64 (argv[6]));
-      int mode = sqlite3_value_int (argv[7]);
+      Hash hash (sqlite3_value_blob (argv[5]), sqlite3_value_bytes (argv[5]));
+      time_t atime = static_cast<time_t> (sqlite3_value_int64 (argv[6]));
+      time_t mtime = static_cast<time_t> (sqlite3_value_int64 (argv[7]));
+      time_t ctime = static_cast<time_t> (sqlite3_value_int64 (argv[8]));
+      int mode = sqlite3_value_int (argv[9]);
 
-      cout << "Update " << filename << " " << atime << " " << mtime << " " << ctime << endl;
+      cout << "Update " << filename << " " << atime << " " << mtime << " " << ctime << " " << hash << endl;
 
       sqlite3_stmt *stmt;
       sqlite3_prepare_v2 (the->m_db, "UPDATE FileState "
-                          "SET file_hash=?,"
+                          "SET "
+                          "device_id=?, seq_no=?, "
+                          "file_hash=?,"
                           "file_atime=datetime(?, 'unixepoch'),"
                           "file_mtime=datetime(?, 'unixepoch'),"
                           "file_ctime=datetime(?, 'unixepoch'),"
                           "file_chmod=? "
                           "WHERE type=0 AND filename=?", -1, &stmt, 0);
 
-      sqlite3_bind_blob  (stmt, 1, hash.GetHash (), hash.GetHashBytes (), SQLITE_TRANSIENT);
-      sqlite3_bind_int64 (stmt, 2, atime);
-      sqlite3_bind_int64 (stmt, 3, mtime);
-      sqlite3_bind_int64 (stmt, 4, ctime);
-      sqlite3_bind_int   (stmt, 5, mode);
-      sqlite3_bind_text  (stmt, 6, filename.c_str (), -1, SQLITE_TRANSIENT);
+      sqlite3_bind_int64 (stmt, 1, device_id);
+      sqlite3_bind_int64 (stmt, 2, seq_no);
+      sqlite3_bind_blob  (stmt, 3, hash.GetHash (), hash.GetHashBytes (), SQLITE_TRANSIENT);
+      sqlite3_bind_int64 (stmt, 4, atime);
+      sqlite3_bind_int64 (stmt, 5, mtime);
+      sqlite3_bind_int64 (stmt, 6, ctime);
+      sqlite3_bind_int   (stmt, 7, mode);
+      sqlite3_bind_text  (stmt, 8, filename.c_str (), -1, SQLITE_TRANSIENT);
       
       sqlite3_step (stmt);
+
+      // cout << sqlite3_errmsg (the->m_db) << endl;
+      
       sqlite3_finalize (stmt);
 
       int affected_rows = sqlite3_changes (the->m_db);
@@ -295,18 +304,21 @@
         {
           sqlite3_stmt *stmt;
           sqlite3_prepare_v2 (the->m_db, "INSERT INTO FileState "
-                              "(type,filename,file_hash,file_atime,file_mtime,file_ctime,file_chmod) "
-                              "VALUES (0, ?, ?, "
+                              "(type,filename,device_id,seq_no,file_hash,file_atime,file_mtime,file_ctime,file_chmod) "
+                              "VALUES (0, ?, ?, ?, ?, "
                               "datetime(?, 'unixepoch'), datetime(?, 'unixepoch'), datetime(?, 'unixepoch'), ?)", -1, &stmt, 0);
 
           sqlite3_bind_text  (stmt, 1, filename.c_str (), -1, SQLITE_TRANSIENT);
-          sqlite3_bind_blob  (stmt, 2, hash.GetHash (), hash.GetHashBytes (), SQLITE_TRANSIENT);
-          sqlite3_bind_int64 (stmt, 3, atime);
-          sqlite3_bind_int64 (stmt, 4, mtime);
-          sqlite3_bind_int64 (stmt, 5, ctime);
-          sqlite3_bind_int   (stmt, 6, mode);
+          sqlite3_bind_int64 (stmt, 2, device_id);
+          sqlite3_bind_int64 (stmt, 3, seq_no);
+          sqlite3_bind_blob  (stmt, 4, hash.GetHash (), hash.GetHashBytes (), SQLITE_TRANSIENT);
+          sqlite3_bind_int64 (stmt, 5, atime);
+          sqlite3_bind_int64 (stmt, 6, mtime);
+          sqlite3_bind_int64 (stmt, 7, ctime);
+          sqlite3_bind_int   (stmt, 8, mode);
       
           sqlite3_step (stmt);
+          // cout << sqlite3_errmsg (the->m_db) << endl;
           sqlite3_finalize (stmt);
         }
     }
diff --git a/src/ccnx-name.cpp b/src/ccnx-name.cpp
index 05df5b3..9bc2663 100644
--- a/src/ccnx-name.cpp
+++ b/src/ccnx-name.cpp
@@ -86,6 +86,26 @@
   }
 }
 
+Name::Name (const unsigned char *buf, const size_t length)
+{
+  ccn_indexbuf *idx = ccn_indexbuf_create();
+  const ccn_charbuf namebuf = { length, length, const_cast<unsigned char *> (buf) };
+  ccn_name_split (&namebuf, idx);
+
+  const unsigned char *compPtr = NULL;
+  size_t size = 0;
+  int i = 0;
+  while (ccn_name_comp_get(namebuf.buf, idx, i, &compPtr, &size) == 0)
+    {
+      Bytes comp;
+      readRaw (comp, compPtr, size);
+      m_comps.push_back(comp);
+      i++;
+    }
+  ccn_indexbuf_destroy(&idx);
+}
+
+
 Name &
 Name::operator=(const Name &other)
 {
diff --git a/src/db-helper.cc b/src/db-helper.cc
index bb4fa04..217c3ee 100644
--- a/src/db-helper.cc
+++ b/src/db-helper.cc
@@ -33,7 +33,7 @@
 CREATE TABLE                                                    \n\
     SyncNodes(                                                  \n\
         device_id       INTEGER PRIMARY KEY AUTOINCREMENT,      \n\
-        device_name     TEXT NOT NULL,                          \n\
+        device_name     BLOB NOT NULL,                          \n\
         description     TEXT,                                   \n\
         seq_no          INTEGER NOT NULL,                       \n\
         last_known_tdi  TEXT,                                   \n\
@@ -139,6 +139,7 @@
                                     WHERE device_id=NEW.device_id)) IS NULL      \n\
     BEGIN                                                               \n\
         SELECT apply_action ((SELECT device_name FROM SyncNodes where device_id=NEW.device_id), \
+                             NEW.device_id, NEW.seq_no,                 \
                              NEW.action,NEW.filename,NEW.file_hash,     \
                              strftime('%s', NEW.file_atime),strftime('%s', NEW.file_mtime),strftime('%s', NEW.file_ctime), \
                              NEW.file_chmod); /* function that applies action and adds record the FileState */  \n \
@@ -147,6 +148,8 @@
 CREATE TABLE FileState (                                                \n\
     type        INTEGER NOT NULL, /* 0 - newest, 1 - oldest */          \n\
     filename    TEXT NOT NULL,                                          \n\
+    device_id   INTEGER NOT NULL,                                       \n\
+    seq_no      INTEGER NOT NULL,                                       \n\
     file_hash   BLOB, /* NULL if action is \"delete\" */                \n\
     file_atime  TIMESTAMP,                                              \n\
     file_mtime  TIMESTAMP,                                              \n\
@@ -155,6 +158,8 @@
                                                                         \n\
     PRIMARY KEY (type, filename)                                        \n\
 );                                                                      \n\
+                                                                        \n\
+CREATE INDEX FileState_device_id_seq_no ON FileState (device_id, seq_no); \n\
 ";
 
 DbHelper::DbHelper (const std::string &path)
@@ -204,11 +209,11 @@
       sqlite3_result_error (context, "Wrong arguments are supplied for ``hash'' function", -1);
       return;
     }
-  if (sqlite3_value_type (argv[0]) != SQLITE_TEXT ||
+  if (sqlite3_value_type (argv[0]) != SQLITE_BLOB ||
       sqlite3_value_type (argv[1]) != SQLITE_INTEGER)
     {
-      // _LOG_ERROR ("Hash expects (text,integer) parameters");
-      sqlite3_result_error (context, "Hash expects (text,integer) parameters", -1);
+      // _LOG_ERROR ("Hash expects (blob,integer) parameters");
+      sqlite3_result_error (context, "Hash expects (blob,integer) parameters", -1);
       return;
     }
   
@@ -226,8 +231,8 @@
       EVP_DigestInit_ex (*hash_context, HASH_FUNCTION (), 0);
     }
   
-  int nameBytes = sqlite3_value_bytes (argv[0]);
-  const unsigned char *name = sqlite3_value_text (argv[0]);
+  int nameBytes       = sqlite3_value_bytes (argv[0]);
+  const void *name    = sqlite3_value_blob  (argv[0]);
   sqlite3_int64 seqno = sqlite3_value_int64 (argv[1]);
 
   EVP_DigestUpdate (*hash_context, name, nameBytes);
diff --git a/src/sync-log.cc b/src/sync-log.cc
index 677904a..ce5b46c 100644
--- a/src/sync-log.cc
+++ b/src/sync-log.cc
@@ -36,7 +36,9 @@
   
   sqlite3_stmt *stmt;
   int res = sqlite3_prepare_v2 (m_db, "SELECT device_id, seq_no FROM SyncNodes WHERE device_name=?", -1, &stmt, 0);
-  sqlite3_bind_text (stmt, 1, m_localName.c_str (), m_localName.size (), SQLITE_STATIC);
+
+  Ccnx::CcnxCharbufPtr name = m_localName;
+  sqlite3_bind_blob (stmt, 1, name->buf (), name->length (), SQLITE_STATIC);
 
   if (sqlite3_step (stmt) == SQLITE_ROW)
     {
@@ -90,7 +92,7 @@
   if (res != SQLITE_OK)
     {
       BOOST_THROW_EXCEPTION (Error::Db ()
-                             << errmsg_info_str ("1"));
+                             << errmsg_info_str (sqlite3_errmsg(m_db)));
     }
   
   sqlite3_int64 rowId = sqlite3_last_insert_rowid (m_db);
@@ -109,7 +111,7 @@
   if (res != SQLITE_OK)
     {
       BOOST_THROW_EXCEPTION (Error::Db ()
-                             << errmsg_info_str ("4"));
+                             << errmsg_info_str (sqlite3_errmsg(m_db)));
     }
   sqlite3_finalize (insertStmt);
   
@@ -177,14 +179,15 @@
 }
 
 void
-SyncLog::UpdateDeviceSeqno (const std::string &name, sqlite3_int64 seqNo)
+SyncLog::UpdateDeviceSeqno (const Ccnx::Name &name, sqlite3_int64 seqNo)
 {
   sqlite3_stmt *stmt;
   // update is performed using trigger
   int res = sqlite3_prepare (m_db, "INSERT INTO SyncNodes (device_name, seq_no) VALUES (?,?);", 
                              -1, &stmt, 0);
 
-  res += sqlite3_bind_text  (stmt, 1, name.c_str (), name.size (), SQLITE_STATIC);
+  Ccnx::CcnxCharbufPtr nameBuf = name;
+  res += sqlite3_bind_blob  (stmt, 1, nameBuf->buf (), nameBuf->length (), SQLITE_STATIC);
   res += sqlite3_bind_int64 (stmt, 2, seqNo);
   sqlite3_step (stmt);
   
@@ -282,7 +285,7 @@
     {
       SyncState *state = msg->add_state ();
 
-      state->set_name (reinterpret_cast<const char*> (sqlite3_column_text (stmt, 0)));
+      state->set_name (reinterpret_cast<const char*> (sqlite3_column_blob (stmt, 0), sqlite3_column_bytes (stmt, 0)));
 
       sqlite3_int64 newSeqNo = sqlite3_column_int64 (stmt, 2);
       if (newSeqNo > 0)
diff --git a/src/sync-log.h b/src/sync-log.h
index bef41a7..0316294 100644
--- a/src/sync-log.h
+++ b/src/sync-log.h
@@ -24,6 +24,7 @@
 
 #include "db-helper.h"
 #include <sync-state.pb.h>
+#include <ccnx-name.h>
 
 typedef boost::shared_ptr<SyncStateMsg> SyncStateMsgPtr;
 
@@ -40,7 +41,7 @@
   
   // done
   void
-  UpdateDeviceSeqno (const std::string &name, sqlite3_int64 seqNo);
+  UpdateDeviceSeqno (const Ccnx::Name &name, sqlite3_int64 seqNo);
 
   // std::string
   // LookupForwardingAlias (const std::string &deviceName);
@@ -71,9 +72,10 @@
   FindStateDifferences (const Hash &oldHash, const Hash &newHash);  
 
 protected:
-  std::string m_localName;
-  sqlite3_int64 m_localDeviceId;
+  // std::string m_localName;
+  Ccnx::Name m_localName;
   
+  sqlite3_int64 m_localDeviceId;
 };
 
 
diff --git a/src/sync-state.proto b/src/sync-state.proto
index 9ef5e33..2aafb0c 100644
--- a/src/sync-state.proto
+++ b/src/sync-state.proto
@@ -1,12 +1,6 @@
-// message Name
-// {
-//   repeated bytes comp = 1;
-// }
-
 message SyncState
 {
-  // required Name name = 1;
-  required string name = 1;
+  required bytes name = 1;
 
   enum ActionType
   {
diff --git a/test/database-test.cc b/test/database-test.cc
index 7432fd0..a4fe0d6 100644
--- a/test/database-test.cc
+++ b/test/database-test.cc
@@ -25,9 +25,11 @@
 #include <unistd.h>
 #include "action-log.h"
 #include <iostream>
+#include <ccnx-name.h>
 
 using namespace std;
 using namespace boost;
+using namespace Ccnx;
 
 BOOST_AUTO_TEST_SUITE(DatabaseTest)
 
@@ -40,40 +42,40 @@
 
   HashPtr hash = db.RememberStateInStateLog ();
   // should be empty
-  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "461f0ed1300b7f947fbe8e38a04186b74938febe7e43fe4ed571551fa3bd6ab9");
+  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "7a6f2c1eefd539560d2dc3e5542868a79810d0867db15d9b87e41ec105899405");
 
-  db.UpdateDeviceSeqno ("Alex", 1);
+  db.UpdateDeviceSeqno (Name ("Alex"), 1);
   hash = db.RememberStateInStateLog ();
 
-  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "80463c859f23367e1cbabfa80d6de78af334589ec88dc9c56c854c1f7e196c34");
+  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "bf19308cb2c2ddab7bcce66e9074cd0eed74893be0813ca67a95e97c55d65896");
 
-  db.UpdateDeviceSeqno ("Alex", 2);
+  db.UpdateDeviceSeqno (Name ("Alex"), 2);
   hash = db.RememberStateInStateLog ();
-  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "95284d3132a7a88b85c5141ca63efa68b7a7daf37315def69e296a0c24692833");
+  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "86b51f1f98662583b295b61385ae4450ff8fac955981f1ca4381144ab1d7a4e0");
 
-  db.UpdateDeviceSeqno ("Alex", 2);
+  db.UpdateDeviceSeqno (Name ("Alex"), 2);
   hash = db.RememberStateInStateLog ();
-  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "95284d3132a7a88b85c5141ca63efa68b7a7daf37315def69e296a0c24692833");
+  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "86b51f1f98662583b295b61385ae4450ff8fac955981f1ca4381144ab1d7a4e0");
 
-  db.UpdateDeviceSeqno ("Alex", 1);
+  db.UpdateDeviceSeqno (Name ("Alex"), 1);
   hash = db.RememberStateInStateLog ();
-  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "95284d3132a7a88b85c5141ca63efa68b7a7daf37315def69e296a0c24692833");
+  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "86b51f1f98662583b295b61385ae4450ff8fac955981f1ca4381144ab1d7a4e0");
 
   
-  db.FindStateDifferences ("00", "95284d3132a7a88b85c5141ca63efa68b7a7daf37315def69e296a0c24692833");
-  db.FindStateDifferences ("95284d3132a7a88b85c5141ca63efa68b7a7daf37315def69e296a0c24692833", "00");
-  db.FindStateDifferences ("869c38c6dffe8911ced320aecc6d9244904d13d3e8cd21081311f2129b4557ce",
-                           "95284d3132a7a88b85c5141ca63efa68b7a7daf37315def69e296a0c24692833");
-  db.FindStateDifferences ("95284d3132a7a88b85c5141ca63efa68b7a7daf37315def69e296a0c24692833",
-                           "869c38c6dffe8911ced320aecc6d9244904d13d3e8cd21081311f2129b4557ce");
+  // db.FindStateDifferences ("00", "95284d3132a7a88b85c5141ca63efa68b7a7daf37315def69e296a0c24692833");
+  // db.FindStateDifferences ("86b51f1f98662583b295b61385ae4450ff8fac955981f1ca4381144ab1d7a4e0", "00");
+  // db.FindStateDifferences ("869c38c6dffe8911ced320aecc6d9244904d13d3e8cd21081311f2129b4557ce",
+  //                          "86b51f1f98662583b295b61385ae4450ff8fac955981f1ca4381144ab1d7a4e0");
+  // db.FindStateDifferences ("86b51f1f98662583b295b61385ae4450ff8fac955981f1ca4381144ab1d7a4e0",
+  //                          "869c38c6dffe8911ced320aecc6d9244904d13d3e8cd21081311f2129b4557ce");
 
-  db.UpdateDeviceSeqno ("Bob", 1);
-  hash = db.RememberStateInStateLog ();
-  BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "d001d4680fd9adcb48e34a795e3cc3d5d36f209fbab34fd57f70f362c2085310");
+  // db.UpdateDeviceSeqno (Name ("Bob"), 1);
+  // hash = db.RememberStateInStateLog ();
+  // BOOST_CHECK_EQUAL (lexical_cast<string> (*hash), "d001d4680fd9adcb48e34a795e3cc3d5d36f209fbab34fd57f70f362c2085310");
 
-  db.FindStateDifferences ("00", "d001d4680fd9adcb48e34a795e3cc3d5d36f209fbab34fd57f70f362c2085310");
-  db.FindStateDifferences ("95284d3132a7a88b85c5141ca63efa68b7a7daf37315def69e296a0c24692833",
-                           "d001d4680fd9adcb48e34a795e3cc3d5d36f209fbab34fd57f70f362c2085310");
+  // db.FindStateDifferences ("00", "d001d4680fd9adcb48e34a795e3cc3d5d36f209fbab34fd57f70f362c2085310");
+  // db.FindStateDifferences ("86b51f1f98662583b295b61385ae4450ff8fac955981f1ca4381144ab1d7a4e0",
+  //                          "d001d4680fd9adcb48e34a795e3cc3d5d36f209fbab34fd57f70f362c2085310");
 
 }
 
diff --git a/wscript b/wscript
index 7fdb1ea..e18214a 100644
--- a/wscript
+++ b/wscript
@@ -2,7 +2,7 @@
 
 VERSION='0.1'
 APPNAME='chronoshare'
-CCNXLIB='ccnx'
+CCNXLIB='ccnxx'
 
 from waflib import Build, Logs
 
@@ -44,7 +44,7 @@
 
     if conf.options.debug:
         conf.define ('_DEBUG', 1)
-        conf.env.append_value('CXXFLAGS', ['-O0', '-g3'])
+        conf.env.append_value('CXXFLAGS', ['-O0', '-Wall', '-Wno-unused-variable', '-fcolor-diagnostics', '-g3'])
     else:
         conf.env.append_value('CXXFLAGS', ['-O3', '-g'])
 
@@ -102,7 +102,7 @@
           target="unit-tests",
           source = bld.path.ant_glob(['test/**/*.cc']),
           features=['cxx', 'cxxprogram'],
-          use = 'BOOST_TEST ccnx database',
+          use = 'BOOST_TEST ccnxx database',
           includes = ['include', 'src'],
           )
 
@@ -122,6 +122,6 @@
         source = ['daemon/daemon.cc',
                   'daemon/notify-i.cc',
                   ],
-        use = "BOOST CCNX SSL SQLITE3 ICE common database",
+        use = "BOOST CCNX SSL SQLITE3 ICE common database ccnxx",
         includes = ['include', 'src'],
         )