bool Repo::findFile(const char *path, const std::string &root, MD5& md5) { if (m_dbc == nullptr) { return false; } int repoId; for (repoId = RepoIdCount - 1; repoId >= 0; --repoId) { if (*path == '/' && !root.empty() && !strncmp(root.c_str(), path, root.size()) && m_getFileHash[repoId].get(path + root.size(), md5)) { TRACE(3, "Repo loaded file hash for '%s' from '%s'\n", path + root.size(), repoName(repoId).c_str()); return true; } if (m_getFileHash[repoId].get(path, md5)) { TRACE(3, "Repo loaded file hash for '%s' from '%s'\n", path, repoName(repoId).c_str()); return true; } } TRACE(3, "Repo file hash: error loading '%s'\n", path); return false; }
int packagesPage::initPackages() { QDir packagesDir; if (!packagesDir.cd(packagesListDirPath)) { setStatus(tr("Ooops , Couldn't find the packages info directory : ")+packagesListDirPath, ERROR); return 1; } cerr << packagesListDirPath.toStdString() << endl << flush; QString repoName(""); QVector<meskPackage> repoPackages; //packages.clear(); for ( unsigned int repo =0; repo < packagesDir.count(); repo++) { repoName = packagesDir.entryList().at(repo); if (repoName == "." || repoName == "..") { continue; } packagesDir.cd(repoName); for ( unsigned int package = 0; package < packagesDir.count(); package++) { if (packagesDir.entryList().at(package) == "." || packagesDir.entryList().at(package) == "..") { continue; } meskPackage mpackage = parsePackageFile(packagesDir.absoluteFilePath(packagesDir.entryList().at(package))); repoPackages.push_back(mpackage); } packages.push_back(qMakePair(repoName, repoPackages)); repoName = ""; repoPackages.clear(); packagesDir.cdUp(); } fixCriticals(); return 0; }
void Repo::commitMd5(UnitOrigin unitOrigin, UnitEmitter* ue) { try { RepoTxn txn(*this); bool err = insertMd5(unitOrigin, ue, txn); if (!err) { txn.commit(); } } catch(RepoExc& re) { int repoId = repoIdForNewUnit(unitOrigin); if (repoId != RepoIdInvalid) { TRACE(3, "Failed to commit md5 for '%s' to '%s': %s\n", ue->m_filepath->data(), repoName(repoId).c_str(), re.msg().c_str()); } } }
bool Repo::insertMd5(UnitOrigin unitOrigin, UnitEmitter* ue, RepoTxn& txn) { const StringData* path = ue->m_filepath; const MD5& md5 = ue->md5(); int repoId = repoIdForNewUnit(unitOrigin); if (repoId == RepoIdInvalid) { return true; } try { m_insertFileHash[repoId].insert(txn, path, md5); return false; } catch(RepoExc& re) { TRACE(3, "Failed to commit md5 for '%s' to '%s': %s\n", path->data(), repoName(repoId).c_str(), re.msg().c_str()); return true; } }
void Repo::loadGlobalData(bool allowFailure /* = false */) { m_lsrp.load(); if (!RuntimeOption::RepoAuthoritative) return; std::vector<std::string> failures; /* * This should probably just go to the Local repo always, except * that our unit test suite is currently running RepoAuthoritative * tests with the compiled repo as the Central repo. */ for (int repoId = RepoIdCount - 1; repoId >= 0; --repoId) { if (repoName(repoId).empty()) { // The repo wasn't loadable continue; } try { RepoStmt stmt(*this); const auto& tbl = table(repoId, "GlobalData"); stmt.prepare( folly::format( "SELECT count(*), data from {};", tbl ).str() ); RepoTxn txn(*this); RepoTxnQuery query(txn, stmt); query.step(); if (!query.row()) { throw RepoExc("Can't find table %s", tbl.c_str()); }; int val; query.getInt(0, val); if (val == 0) { throw RepoExc("No rows in %s. Did you forget to compile that file with " "this HHVM version?", tbl.c_str()); }; BlobDecoder decoder = query.getBlob(1); decoder(s_globalData); txn.commit(); } catch (RepoExc& e) { failures.push_back(repoName(repoId) + ": " + e.msg()); continue; } // TODO: this should probably read out the other elements of the global data // which control Option or RuntimeOption values -- the others are read out // in an inconsistent and ad-hoc manner. But I don't understand their uses // and interactions well enough to feel comfortable fixing now. RuntimeOption::PHP7_IntSemantics = s_globalData.PHP7_IntSemantics; RuntimeOption::PHP7_ScalarTypes = s_globalData.PHP7_ScalarTypes; RuntimeOption::AutoprimeGenerators = s_globalData.AutoprimeGenerators; return; } if (allowFailure) return; if (failures.empty()) { std::fprintf(stderr, "No repo was loadable. Check all the possible repo " "locations (Repo.Central.Path, HHVM_REPO_CENTRAL_PATH, and " "$HOME/.hhvm.hhbc) to make sure one of them is a valid " "sqlite3 HHVM repo built with this exact HHVM version.\n"); } else { // We should always have a global data section in RepoAuthoritative // mode, or the repo is messed up. std::fprintf(stderr, "Failed to load Repo::GlobalData:\n"); for (auto& f : failures) { std::fprintf(stderr, " %s\n", f.c_str()); } } assert(Process::IsInMainThread()); exit(1); }
void Repo::loadGlobalData(bool allowFailure /* = false */, bool readArrayTable /* = true */) { if (readArrayTable) m_lsrp.load(); if (!RuntimeOption::RepoAuthoritative) return; std::vector<std::string> failures; /* * This should probably just go to the Local repo always, except * that our unit test suite is currently running RepoAuthoritative * tests with the compiled repo as the Central repo. */ for (int repoId = RepoIdCount - 1; repoId >= 0; --repoId) { if (repoName(repoId).empty()) { // The repo wasn't loadable continue; } try { RepoStmt stmt(*this); const auto& tbl = table(repoId, "GlobalData"); stmt.prepare( folly::format( "SELECT count(*), data from {};", tbl ).str() ); RepoTxn txn(*this); RepoTxnQuery query(txn, stmt); query.step(); if (!query.row()) { throw RepoExc("Can't find table %s", tbl.c_str()); }; int val; query.getInt(0, val); if (val == 0) { throw RepoExc("No rows in %s. Did you forget to compile that file with " "this HHVM version?", tbl.c_str()); } BlobDecoder decoder = query.getBlob(1); decoder(s_globalData); if (readArrayTable) { auto& arrayTypeTable = globalArrayTypeTable(); decoder(arrayTypeTable); decoder(s_globalData.APCProfile); decoder(s_globalData.ConstantFunctions); decoder.assertDone(); } txn.commit(); } catch (RepoExc& e) { failures.push_back(repoName(repoId) + ": " + e.msg()); continue; } // TODO: this should probably read out the other elements of the global data // which control Option or RuntimeOption values -- the others are read out // in an inconsistent and ad-hoc manner. But I don't understand their uses // and interactions well enough to feel comfortable fixing now. RuntimeOption::EvalPromoteEmptyObject = s_globalData.PromoteEmptyObject; RuntimeOption::EnableIntrinsicsExtension = s_globalData.EnableIntrinsicsExtension; HHBBC::options.ElideAutoloadInvokes = s_globalData.ElideAutoloadInvokes; RuntimeOption::AutoprimeGenerators = s_globalData.AutoprimeGenerators; RuntimeOption::EnableHipHopSyntax = s_globalData.EnableHipHopSyntax; RuntimeOption::EvalHardTypeHints = s_globalData.HardTypeHints; RuntimeOption::EvalUseHHBBC = s_globalData.UsedHHBBC; RuntimeOption::PHP7_Builtins = s_globalData.PHP7_Builtins; RuntimeOption::PHP7_IntSemantics = s_globalData.PHP7_IntSemantics; RuntimeOption::PHP7_NoHexNumerics = s_globalData.PHP7_NoHexNumerics; RuntimeOption::PHP7_ScalarTypes = s_globalData.PHP7_ScalarTypes; RuntimeOption::PHP7_Substr = s_globalData.PHP7_Substr; RuntimeOption::EvalReffinessInvariance = s_globalData.ReffinessInvariance; RuntimeOption::EvalHackArrDVArrs = s_globalData.HackArrDVArrs; RuntimeOption::DisallowDynamicVarEnvFuncs = s_globalData.DisallowDynamicVarEnvFuncs; if (s_globalData.HardReturnTypeHints) { RuntimeOption::EvalCheckReturnTypeHints = 3; } if (s_globalData.ThisTypeHintLevel == 3) { RuntimeOption::EvalThisTypeHintLevel = s_globalData.ThisTypeHintLevel; } RuntimeOption::ConstantFunctions.clear(); for (auto const& elm : s_globalData.ConstantFunctions) { RuntimeOption::ConstantFunctions.insert(elm); } return; } if (allowFailure) return; if (failures.empty()) { std::fprintf(stderr, "No repo was loadable. Check all the possible repo " "locations (Repo.Central.Path, HHVM_REPO_CENTRAL_PATH, and " "$HOME/.hhvm.hhbc) to make sure one of them is a valid " "sqlite3 HHVM repo built with this exact HHVM version.\n"); } else { // We should always have a global data section in RepoAuthoritative // mode, or the repo is messed up. std::fprintf(stderr, "Failed to load Repo::GlobalData:\n"); for (auto& f : failures) { std::fprintf(stderr, " %s\n", f.c_str()); } } assertx(Process::IsInMainThread()); exit(1); }