📄 database.cxx
字号:
// should have at least one version. Any errors will be // handled by the catch statement further down. for (std::map<std::string,package_data>::iterator pkg_i = packages.begin(); pkg_i != packages.end(); pkg_i++) { std::string pkgdir = repo + "/" + pkg_i->second.directory; std::vector<std::string> subdirs; unsigned int i; interp->locate_subdirs(pkgdir, subdirs); for (i = 0; i < subdirs.size(); i++) { if (("CVS" != subdirs[i]) && (interp->is_file(pkgdir + "/" + subdirs[i] + "/cdl/" + pkg_i->second.script) || interp->is_file(pkgdir + "/" + subdirs[i] + "/" + pkg_i->second.script))) { pkg_i->second.versions.push_back(subdirs[i]); } } if (0 == pkg_i->second.versions.size()) { throw CdlInputOutputException("Package " + pkg_i->first + ": there are no version subdirectories"); } std::sort(pkg_i->second.versions.begin(), pkg_i->second.versions.end(), Cdl::version_cmp()); } // Now start looking for templates. These should reside in the // templates subdirectory of the component repository. Each template // should be in its own directory, and inside each directory should // be versioned template files with a .ect extension. std::string templates_dir = repo + "/" + "templates"; std::vector<std::string> subdirs; interp->locate_subdirs(templates_dir, subdirs); for (i = 0; i < subdirs.size(); i++) { // Do not add the template to the known ones until we are sure there is // at least one valid template. std::vector<std::string> files; interp->locate_files(templates_dir + "/" + subdirs[i], files); unsigned int j; for (j = 0; j < files.size(); j++) { if ((4 < files[j].size()) && (".ect" == files[j].substr(files[j].size() - 4))) { break; } } if (j != files.size()) { this->template_names.push_back(subdirs[i]); for ( ; j < files.size(); j++) { if ((4 < files[j].size()) && (".ect" == files[j].substr(files[j].size() - 4))) { this->templates[subdirs[i]].versions.push_back(files[j].substr(0, files[j].size() - 4)); } } } } // Consistency checks. All target-specific packages should have the // hardware attribute. Also, all the packages should exist. for (name_i = target_names.begin(); name_i != target_names.end(); name_i++) { for (name_j = targets[*name_i].packages.begin(); name_j != targets[*name_i].packages.end(); name_j++) { if (std::find(package_names.begin(), package_names.end(), *name_j) == package_names.end()) { throw CdlInputOutputException("Target " + *name_i + " refers to an unknown package " + *name_j); } if (!packages[*name_j].hardware) { throw CdlInputOutputException("Target " + *name_i + " refers to a non-hardware package " + *name_j); } } } } catch(...) { // Something has gone wrong. Clear out all of the data accumulated so far, as well // as the interpreter. delete interp; package_names.clear(); target_names.clear(); template_names.clear(); packages.clear(); targets.clear(); templates.clear(); throw; } delete interp; CYGDBG_MEMLEAK_CONSTRUCTOR(); CYG_REPORT_RETURN();}//}}}//{{{ CdlPackagesDatabase:: destructor // ----------------------------------------------------------------------------CdlPackagesDatabaseBody::~CdlPackagesDatabaseBody(){ CYG_REPORT_FUNCNAME("CdlPackagesDatabase:: default destructor"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); cdlpackagesdatabasebody_cookie = CdlPackagesDatabaseBody_Invalid; component_repository = ""; package_names.clear(); target_names.clear(); template_names.clear(); packages.clear(); targets.clear(); templates.clear(); CYGDBG_MEMLEAK_DESTRUCTOR(); CYG_REPORT_RETURN();}//}}}//{{{ CdlPackagesDatabase:: check_this() // ----------------------------------------------------------------------------boolCdlPackagesDatabaseBody::check_this(cyg_assert_class_zeal zeal) const{ if (CdlPackagesDatabaseBody_Magic != cdlpackagesdatabasebody_cookie) { return false; } CYGDBG_MEMLEAK_CHECKTHIS(); switch(zeal) { case cyg_system_test : case cyg_extreme : { std::vector<std::string>::const_iterator names_i; std::map<std::string,package_data>::const_iterator pkgs_i; // Every entry in the names vector should have an entry in the packages vector. for (names_i = package_names.begin(); names_i != package_names.end(); names_i++) { if (packages.find(*names_i) == packages.end()) { return false; } } // The inverse should be true as well for (pkgs_i = packages.begin(); pkgs_i != packages.end(); pkgs_i++) { if (std::find(package_names.begin(), package_names.end(), pkgs_i->first) == package_names.end()) { return false; } } // Repeat for targets. std::map<std::string,target_data>::const_iterator targets_i; for (names_i = target_names.begin(); names_i != target_names.end(); names_i++) { if (targets.find(*names_i) == targets.end()) { return false; } } for (targets_i = targets.begin(); targets_i != targets.end(); targets_i++) { if (std::find(target_names.begin(), target_names.end(), targets_i->first) == target_names.end()) { return false; } } // And for templates std::map<std::string,template_data>::const_iterator templates_i; for (names_i = template_names.begin(); names_i != template_names.end(); names_i++) { if (templates.find(*names_i) == templates.end()) { return false; } } // The inverse should be true as well for (templates_i = templates.begin(); templates_i != templates.end(); templates_i++) { if (std::find(template_names.begin(), template_names.end(), templates_i->first) == template_names.end()) { return false; } } // Possibly the package directories should be validated as // well, not to mention the various version subdirectories, // but doing file I/O inside an assertion is excessive. } case cyg_thorough : case cyg_quick: if ("" == component_repository) { return false; } case cyg_trivial: case cyg_none : break; } return true;}//}}}//{{{ CdlPackagesDatabase:: misc // ----------------------------------------------------------------------------std::stringCdlPackagesDatabaseBody::get_component_repository() const{ CYG_REPORT_FUNCNAME("CdlPackagesDatabase::get_component_repository"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); CYG_REPORT_RETURN(); return component_repository;}//}}}//{{{ CdlPackagesDatabase:: get package information // ----------------------------------------------------------------------------const std::vector<std::string>&CdlPackagesDatabaseBody::get_packages(void) const{ CYG_REPORT_FUNCNAME("CdlPackagesDatabase::get_packages"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); CYG_REPORT_RETURN(); return package_names;}boolCdlPackagesDatabaseBody::is_known_package(std::string name) const{ CYG_REPORT_FUNCNAMETYPE("CdlPackagesDatabase::is_known_package", "result %d"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); bool result = false; if (std::find(package_names.begin(), package_names.end(), name) != package_names.end()) { result = true; } CYG_REPORT_RETVAL(result); return result;}const std::string&CdlPackagesDatabaseBody::get_package_description(std::string pkg_name) const{ CYG_REPORT_FUNCNAME("CdlPackagesDatabase::get_package_description"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); std::map<std::string,package_data>::const_iterator pkgs_i = packages.find(pkg_name); if (pkgs_i != packages.end()) { CYG_REPORT_RETURN(); return pkgs_i->second.description; } CYG_FAIL("Invalid package name passed to CdlPackagesDatabase::get_package_description()"); static std::string dummy = ""; return dummy;}const std::vector<std::string>&CdlPackagesDatabaseBody::get_package_aliases(std::string pkg_name) const{ CYG_REPORT_FUNCNAME("CdlPackagesDatabase::get_package_aliases"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); std::map<std::string,package_data>::const_iterator pkgs_i = packages.find(pkg_name); if (pkgs_i != packages.end()) { CYG_REPORT_RETURN(); return pkgs_i->second.aliases; } CYG_FAIL("Invalid package name passed to CdlPackagesDatabase::get_package_aliases()"); static std::vector<std::string> dummy; return dummy;}const std::vector<std::string>&CdlPackagesDatabaseBody::get_package_versions(std::string pkg_name) const{ CYG_REPORT_FUNCNAME("CdlPackagesDatabase::get_package_versions"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); std::map<std::string,package_data>::const_iterator pkgs_i = packages.find(pkg_name); if (pkgs_i != packages.end()) { CYG_REPORT_RETURN(); return pkgs_i->second.versions; } CYG_FAIL("Invalid package name passed to CdlPackagesDatabase::get_package_versions()"); static std::vector<std::string> dummy; return dummy;}const std::string&CdlPackagesDatabaseBody::get_package_directory(std::string pkg_name) const{ CYG_REPORT_FUNCNAME("CdlPackagesDatabase::get_package_directory"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); std::map<std::string,package_data>::const_iterator pkgs_i = packages.find(pkg_name); if (pkgs_i != packages.end()) { CYG_REPORT_RETURN(); return pkgs_i->second.directory; } CYG_FAIL("Invalid package name passed to CdlPackagesDatabase::get_package_directory()"); static std::string dummy = ""; return dummy;}const std::string&CdlPackagesDatabaseBody::get_package_script(std::string pkg_name) const{ CYG_REPORT_FUNCNAME("CdlPackagesDatabase::get_package_script"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); std::map<std::string,package_data>::const_iterator pkgs_i = packages.find(pkg_name); if (pkgs_i != packages.end()) { CYG_REPORT_RETURN(); return pkgs_i->second.script; } CYG_FAIL("Invalid package name passed to CdlPackagesDatabase::get_package_script()"); static std::string dummy = ""; return dummy;}boolCdlPackagesDatabaseBody::is_hardware_package(std::string pkg_name) const{ CYG_REPORT_FUNCNAME("CdlPackagesDatabase::is_hardware_package"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); std::map<std::string,package_data>::const_iterator pkgs_i = packages.find(pkg_name); if (pkgs_i != packages.end()) { CYG_REPORT_RETURN(); return pkgs_i->second.hardware; } CYG_FAIL("Invalid package name passed to CdlPackagesDatabase::is_hardware_package()"); return false;}//}}}//{{{ CdlPackagesDatabase:: get target information // ----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -