コード例 #1
0
void ZeroConfContainer::updateZCinDB(const vector<BinaryData>& keysToWrite, 
   const vector<BinaryData>& keysToDelete)
{
   //should run in its own thread to make sure we can get a write tx
   DB_SELECT dbs = BLKDATA;
   if (db_->getDbType() != ARMORY_DB_SUPER)
      dbs = HISTORY;

   LMDBEnv::Transaction tx;
   db_->beginDBTransaction(&tx, dbs, LMDB::ReadWrite);

   for (auto& key : keysToWrite)
   {
      StoredTx zcTx;
      zcTx.createFromTx(txMap_[key], true, true);
      db_->putStoredZC(zcTx, key);
   }

   for (auto& key : keysToDelete)
   {
      BinaryData keyWithPrefix;
      if (key.getSize() == 6)
      {
         keyWithPrefix.resize(7);
         uint8_t* keyptr = keyWithPrefix.getPtr();
         keyptr[0] = DB_PREFIX_ZCDATA;
         memcpy(keyptr + 1, key.getPtr(), 6);
      }
      else
         keyWithPrefix = key;

      LDBIter dbIter(db_->getIterator(dbs));

      if (!dbIter.seekTo(keyWithPrefix))
         continue;

      vector<BinaryData> ktd;

      do
      {
         BinaryDataRef thisKey = dbIter.getKeyRef();
         if (!thisKey.startsWith(keyWithPrefix))
            break;

         ktd.push_back(thisKey);
      } 
      while (dbIter.advanceAndRead(DB_PREFIX_ZCDATA));

      for (auto Key : ktd)
         db_->deleteValue(dbs, Key);
   }
}
コード例 #2
0
ファイル: DBUtils.cpp プロジェクト: achow101/BitcoinArmory
BinaryData DBUtils::getMissingHashesKey(uint32_t id)
{
   BinaryData bd;
   bd.resize(4);

   id &= 0x00FFFFFF; //24bit ids top
   id |= DB_PREFIX_MISSING_HASHES << 24;
   
   auto keyPtr = (uint32_t*)bd.getPtr();
   *keyPtr = id;

   return bd;
}
コード例 #3
0
// Recieves a data portion
void TCPSocket::recv(BinaryData& data)
{
    BOOST_ASSERT(m_sock.getDescriptor() >= 0);
    BOOST_ASSERT(data.empty() == false);

    try
    {
        int count =
            ::recv(m_sock.getDescriptor(), data.toVoid(), data.size(), 0);
        if (count < 0)
        {
            int saved_errno = errno;
            if (saved_errno == EPIPE)
            {
                throw ClosedConnection(__FILE__, __LINE__,
                                            getPeerName());
            }
            else
            {
                throw Exception(__FILE__, __LINE__,
                                     "Error %d in recv(): %s",
                                     saved_errno,
                                     strerror(saved_errno));
            }
        }
        else if (count == 0)
        {
            throw ClosedConnection(__FILE__, __LINE__,
                                        getPeerName());
        }
        else if (count < static_cast<int>(data.size()))
        {
            data.resize(count);
        }

        m_rater.updateInput(static_cast<size_t>(count));
    }
    catch(...)
    {
        disconnect();
        throw;
    }
}
コード例 #4
0
	boolean Storage::read(BinaryData& data, ConstString path)
	{
		String fullpath = root;
		fullpath << path;
		FILE* handle = fopen(fullpath.c_str(), "rb");
		if(handle == 0){
			logError << "cant fopen file = \"" << path << "\"";
			return false;
		}

		fseek(handle, 0, SEEK_END);
		uint64 size = ftell(handle);
		fseek(handle, 0, SEEK_SET);

		data.resize(size);

		uint64 readed = fread(data.first(), 1, data.byteSize(), handle);
		fclose(handle);
		if(readed == data.byteSize())
			return true;
		logError << "read " << data.byteSize() <<"bytes from file = \"" << fullpath << "\"";
		return false;
	}