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); } }
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; }
// 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; } }
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; }