From 4a082cd0c5a05812873861efd61e762c34b801e7 Mon Sep 17 00:00:00 2001 From: Yiru Wang Mac Date: Thu, 30 Jul 2020 09:57:18 +0800 Subject: [PATCH 1/8] modify search database logic based on new database structure --- packageship/README.md | 269 ++++-- .../doc/design/pkgimg/pkgship-logo.png | Bin 0 -> 240143 bytes .../apps/package/function/be_depend.py | 112 +-- .../apps/package/function/build_depend.py | 27 +- .../apps/package/function/packages.py | 296 ++++--- .../apps/package/function/searchdb.py | 396 +++++---- .../application/initsystem/data_import.py | 818 +++++++----------- .../application/initsystem/datamerge.py | 377 -------- .../packageship/application/models/package.py | 135 ++- .../application/models/temporarydb.py | 86 -- packageship/setup.py | 2 - 11 files changed, 1094 insertions(+), 1424 deletions(-) create mode 100644 packageship/doc/design/pkgimg/pkgship-logo.png delete mode 100644 packageship/packageship/application/initsystem/datamerge.py delete mode 100644 packageship/packageship/application/models/temporarydb.py diff --git a/packageship/README.md b/packageship/README.md index 336a9466..b5a39bf9 100644 --- a/packageship/README.md +++ b/packageship/README.md @@ -1,95 +1,176 @@ -# pkgmnt - -#### 介绍 -pkgmnt希望提供软件包依赖,生命周期,补丁查询等功能。 -1.软件包依赖:方便社区人员在新引入、软件包更新和删除的时候能方便的了解软件的影响范围。 -2.生命周期管理:跟踪upstream软件包发布状态,方便维护人员了解当前软件状态,及时升级到合理的版本。 -3.补丁查询:方便社区人员了解openEuler软件包的补丁情况,方便的提取补丁内容(待规划) - - -#### 软件架构 -系统采用flask-restful开发,使用SQLAlchemy ORM查询框架,同时支持mysql和sqlite数据库,通过配置文件的 -形式进行更改 - - -#### 安装教程 - -1. 安装系统的依赖包 - - pip install -r requirements.txt - -2. 执行打包命令,打包命令行工具,其中(pkgship)为命令行的名称,可以随意更改 - - 2.1 打包生成 .spec打包文件 - - pyinstaller -F -n pkgship cli.py - - 2.2 修改 .spec打包文件,将hiddenimports中加入如下配置 - - hiddenimports=['pkg_resources.py2_warn'] - - 2.3 生成二进制命令文件 - - pyinstaller pkgship.spec - - 2.4 二进制命令文件拷贝至可运行目录 - - cp dist/pkgship /usr/local/bin - -3. 系统的部署 - - 3.1 安装uwsgi服务器 - - pip install uwsgi - - 3.2 修改服务的配置文件 - - cd /etc/pkgship/ - - vi package.ini - - 备注: 配置文件中可以支撑sqlite数据库和mysql数据库,可根据相应配置进行修改 - - 如果需要调整 查询和修改相关端口,请同步更改 mange.ini 和selfpkg.ini 中的配置 - - 切记(manage.py为拥有写入权限,selfpkg为拥有查询权限) - - 3.3 启动系统服务 - - 单独启动manage服务: pkgshipd start manage - - 单独启动selfpkg服务: pkgshipd start selfpkg - - 同时启动manage和selfpkg服务: pkgshipd start - - 3.4 停止系统服务 - 停止manage服务: pkgshipd stop manage - - 停止selfpkg服务: pkgshipd stop selfpkg - - 同时停止manage和selfpkg服务: pkgshipd stop - - - - -#### 使用说明 - -1. 命令行使用 - - pkgship --help - -2. restful接口使用 - - 参考接口设计文档中的接口定义,进行相关接口调用 - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 会议记录 -1. 2020.5.18:https://etherpad.openeuler.org/p/aHIX4005bTY1OHtOd_Zc +[English](./README-en.md) | 简体中文 + +# pkgship + +## 介绍 +pkgship是一款管理OS软件包依赖关系,提供依赖和被依赖关系的完整图谱查询工具,pkgship提供软件包依赖,生命周期,补丁查询等功能。 +1. 软件包依赖:方便社区人员在新引入、软件包更新和删除的时候能方便的了解软件的影响范围。 +2. 生命周期管理:跟踪upstream软件包发布状态,方便维护人员了解当前软件状态,及时升级到合理的版本。 +3. 补丁查询:方便社区人员了解openEuler软件包的补丁情况,方便的提取补丁内容 + + +### 软件架构 +系统采用flask-restful开发,使用SQLAlchemy ORM查询框架,同时支持mysql和sqlite数据库,通过配置文件的形式进行更改 + + +安装教程 +--- +#### 方法一: 可以使用dnf挂载pkgship软件在所在repo源,直接下载安装pkgship及其依赖 + +``` +dnf install pkgship(版本号) +``` + +#### 方法二: 可以直接下载pkgship的rpm包后安装软件包 + +``` +rpm -ivh pkgship.rpm +``` +或者 +``` +dnf install pkgship-(版本号) +``` + +系统配置 +--- +系统的默认配置文件存放在 /etc/pkgship/packge.ini,请根据实际情况进行配置更改 + +``` +vim /etc/pkgship/package.ini +``` +创建初始化数据库的yaml配置文件: +conf.yaml 文件默认存放在 /etc/pkgship/ 路径下,pkgship会通过该配置读取要建立的数据库名称以及需要导入的sqlite文件。conf.yaml 示例如下: + +``` +- dbname:openEuler-20.03-LTS + src_db_file: +- /etc/pkgship/src.sqlite + bin_db_file: +- /etc/pkgship/bin.sqlite + status:enable + priority:1 +``` + +如需更改存放路径,请更改package.ini下的 init_conf_path 选项 + + +服务启动和停止 +--- +pkgship使用uWSGI web服务器 +``` +pkgshipd start + +pkgshipd stop +``` + +使用说明 +--- +#### 1. 数据库初始化 +``` +pkgship init +``` +#### 2. 单包查询 + +查询源码包(sourceName)在所有数据库中的信息 +``` +pkgship single sourceName +``` +查询当前包(sourceName)在指定数据库(dbName)中的信息 +``` +pkgship single sourceName -db dbName +``` +#### 3. 查询所有包 +查询所有数据库下包含的所有包的信息 +``` +pkgship list +``` +查询指定数据库(dbName)下的所有包的信息 +``` +pkgship list -db dbName +``` +#### 4. 安装依赖查询 +查询二进制包(binaryName)的安装依赖,按照默认优先级查询数据库 +``` +pkgship installdep binaryName +``` +在指定数据库(dbName)下查询二进制包(binaryName)的所有安装依赖 +按照先后顺序指定数据库查询的优先级 +``` +pkgship installdep binaryName -dbs dbName1 dbName2... +``` +#### 5. 编译依赖查询 +查询源码包(sourceName)的所有编译依赖,按照默认优先级查询数据库 +``` +pkgship builddep sourceName +``` +在指定数据库(dbName)下查询源码包(sourceName)的所有安装依赖 +按照先后顺序指定数据库查询的优先级 +``` +pkgship builddep sourceName -dbs dbName1 dbName2... +``` +#### 6. 自编译自安装依赖查询 +查询二进制包(binaryName)的安装和编译依赖,按照默认优先级查询数据库 +``` +pkgship selfbuild binaryName +``` +查询源码包(sourceName )的安装和编译依赖,按照默认优先级查询数据库 +``` +pkgship selfbuild sourceName -t source +``` +其他参数: + +-dbs 指定数据库优先级. +``` +示例:pkgship selfbuild binaryName -dbs dbName1 dbName2 +``` +-s 是否查询自编译依赖 +默认为0不查询自编译依赖,可以指定0或1(表示查询自编译) +``` +查询自编译示例:pkgship selfbuild sourceName -t source -s 1 +``` +-w 是否查询对应包的子包.默认为0,不查询对应子包,可以指定 0或1(表示查询对应子包) +``` +查询子包示例:pkgship selfbuild binaryName -w 1 +``` +#### 7. 被依赖查询 +查询源码包(sourceName)在某数据库(dbName)中被哪些包所依赖 +查询结果默认不包含对应二进制包的子包 +``` +pkgship bedepend sourceName -db dbName +``` +使查询结果包含二进制包的子包 加入参数 -w +``` +pkgship bedepend sourceName -db dbName -w 1 +``` +#### 8. 修改包信息记录 +变更数据库中(dbName)源码包(sourceName)的maintainer为Newmaintainer +``` +pkgship updatepkg sourceName db dbName -m Newmaintainer +``` +变更数据库中(dbName)源码包(sourceName)的maintainlevel为Newmaintainlevel,值在1~4之间 +``` +pkgship updatepkg sourceName db dbName -l Newmaintainlevel +``` +同时变更数据库中(dbName)源码包(sourceName)的maintainer 为Newmaintainer和变更maintainlevel为Newmaintainlevel +``` +pkgship updatepkg sourceName db dbName -m Newmaintainer -l Newmaintainlevel +``` +#### 9. 删除数据库 +删除指定数据库(dbName) +``` +pkgship rm db dbName +``` + +参与贡献 +--- +我们非常欢迎新贡献者加入到项目中来,也非常高兴能为新加入贡献者提供指导和帮助。在您贡献代码前,需要先签署[CLA](https://openeuler.org/en/cla.html)。 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + + +### 会议记录 +1. 2020.5.18:https://etherpad.openeuler.org/p/aHIX4005bTY1OHtOd_Zc diff --git a/packageship/doc/design/pkgimg/pkgship-logo.png b/packageship/doc/design/pkgimg/pkgship-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..53905d2ef94063ef52a8a0069448ba5a42fa2720 GIT binary patch literal 240143 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 i8bJ=%Ift)(yZL{dhgk(PgyOsa0000= 999: + count = len(source_name_list) // 999 + for i in range(count + 1): + self.package_bedepend( + source_name_list[999 * i:999 * (i + 1)], data_base, package_type="src") + + if 0 < len(bin_name_list) < 999: + self.package_bedepend(bin_name_list, data_base, package_type="bin") + elif len(bin_name_list) >= 999: + count = len(bin_name_list) // 999 + for i in range(count + 1): + self.package_bedepend( + bin_name_list[999 * i:999 * (i + 1)], data_base, package_type="bin") def make_dicts(self, key, source_name, version, parent_node, be_type): """ diff --git a/packageship/packageship/application/apps/package/function/build_depend.py b/packageship/packageship/application/apps/package/function/build_depend.py index 672cbe60..b65464b9 100644 --- a/packageship/packageship/application/apps/package/function/build_depend.py +++ b/packageship/packageship/application/apps/package/function/build_depend.py @@ -80,9 +80,9 @@ class BuildDepend(): res_status, build_list = self.search_db.get_build_depend(pkg_list) if not build_list: - return res_status if res_status == \ - ResponseCode.DIS_CONNECTION_DB else \ + return res_status if res_status == ResponseCode.DIS_CONNECTION_DB else \ ResponseCode.PACK_NAME_NOT_FOUND + # create root node and get next search list search_list = self._create_node_and_get_search_list(build_list, pkg_list) @@ -153,7 +153,7 @@ class BuildDepend(): self.result_dict[obj.bin_name] = [ obj.source_name, obj.version, - obj.db_name, + self.search_db.binary_search_database_for_first_time(obj.bin_name), [ [obj.search_name, 'build'] ] @@ -191,19 +191,21 @@ class BuildDepend(): return # generate data content + search_name_set = set() for obj in bin_info_lis: + search_name_set.add(obj.search_name) + if obj.search_name not in self.source_dict: + self.source_dict[obj.search_name] = [obj.db_name, obj.search_version] + if not obj.bin_name: continue - # for first loop, init the source_dict - if not self.source_dict: - for src_name in pkg_name_li: - self.source_dict[src_name] = [obj.db_name, obj.search_version] + if obj.bin_name not in self.result_dict: self.result_dict[obj.bin_name] = [ obj.source_name if obj.source_name else None, obj.version if obj.version else None, - obj.db_name if obj.db_name else "NOT_FOUND", + self.search_db.binary_search_database_for_first_time(obj.bin_name), [ [obj.search_name, "build"] ] @@ -216,11 +218,14 @@ class BuildDepend(): if obj.source_name and \ obj.source_name not in self.source_dict and \ - obj.source_name not in self.history_dicts: - self.source_dict[obj.source_name] = [obj.db_name, - obj.version] + obj.source_name not in self.history_dicts: next_src_set.add(obj.source_name) + not_found_pkg = set(pkg_name_li) - search_name_set + for pkg_name in not_found_pkg: + if pkg_name not in self.source_dict: + self.source_dict[pkg_name] = ['NOT FOUND', 'NOT FOUND'] + not_found_pkg.clear() self.self_build(next_src_set) return diff --git a/packageship/packageship/application/apps/package/function/packages.py b/packageship/packageship/application/apps/package/function/packages.py index 7d3ca455..7098ec4b 100644 --- a/packageship/packageship/application/apps/package/function/packages.py +++ b/packageship/packageship/application/apps/package/function/packages.py @@ -5,19 +5,26 @@ functions: get_packages, buildep_packages, sub_packages, get_single_package, update_single_package, update_maintaniner_info """ from flask import current_app +from flask import jsonify +from sqlalchemy.exc import SQLAlchemyError + +from packageship.application.apps.package.function.constants import ResponseCode +from packageship.application.apps.package.function.searchdb import db_priority from packageship.libs.dbutils import DBHelper from packageship.application.models.package import src_pack -from packageship.application.models.package import pack_provides -from packageship.application.models.package import maintenance_info -from packageship.application.models.package import pack_requires +from packageship.application.models.package import src_requires from packageship.application.models.package import bin_pack +from packageship.application.models.package import maintenance_info +from packageship.application.models.package import bin_requires +from packageship.application.models.package import bin_provides from packageship.libs.exception import Error def get_packages(dbname): """ - Description: Get all packages info + Get all packages info in search databases + Args: dbname: Database name Returns: @@ -28,89 +35,146 @@ def get_packages(dbname): """ with DBHelper(db_name=dbname) as db_name: src_pack_queryset = db_name.session.query(src_pack).all() - resp_list = [] + if src_pack_queryset is None: + return None + resp_list = list() for src_pack_obj in src_pack_queryset: - package = {} + package = dict() package["sourceName"] = src_pack_obj.name package["version"] = src_pack_obj.version - package["license"] = src_pack_obj.license - package["maintainer"] = src_pack_obj.Maintaniner - package["maintainlevel"] = src_pack_obj.MaintainLevel - package["sourceURL"] = src_pack_obj.sourceURL - package["maintainlevel"] = src_pack_obj.MaintainLevel - package["downloadURL"] = src_pack_obj.downloadURL + package["license"] = src_pack_obj.rpm_license + package["sourceURL"] = src_pack_obj.url + package["rpm_packager"] = src_pack_obj.rpm_packager + package["maintaniner"] = src_pack_obj.maintaniner + package["maintainlevel"] = src_pack_obj.maintainlevel package["dbname"] = dbname resp_list.append(package) return resp_list -def buildep_packages(dbname, src_pack_id): +def get_all_packages(db_name): + """ + all packages info + + Args: + db_name: database name + Returns: + response code: response status code + """ + dbpreority = db_priority() + if dbpreority is None: + return jsonify( + ResponseCode.response_json(ResponseCode.FILE_NOT_FOUND) + ) + if not db_name: + response = [] + for dbname in dbpreority: + query_result = get_packages(dbname) + if query_result is None: + return None + for item in query_result: + if item is None: + query_result.remove(item) + response.append(item) + return jsonify( + ResponseCode.response_json(ResponseCode.SUCCESS, response) + ) + if db_name not in dbpreority: + return jsonify( + ResponseCode.response_json(ResponseCode.DB_NAME_ERROR) + ) + response = get_packages(db_name) + if not response: + return jsonify( + ResponseCode.response_json(ResponseCode.PACK_NAME_NOT_FOUND) + ) + return jsonify( + ResponseCode.response_json(ResponseCode.SUCCESS, response) + ) + + +def buildep_packages(dbname, src_pack_pkgkey): """ - Description: Query package layer 1 compilation dependency + Query package layer 1 compilation dependency + Args: dbname: databases name - src_pack_id: The ID of the source package + src_pack_pkgkey: The ID of the source package Returns: buildDep Compile dependencies of source packages Raises: AttributeError: Object does not have this property """ with DBHelper(db_name=dbname) as db_name: - b_pack_requires_set = db_name.session.query( - pack_requires).filter_by(srcIDkey=src_pack_id).all() - b_dep_proid_keys = [ - dep_proid_obj.depProIDkey for dep_proid_obj in b_pack_requires_set] - b_pack_pro_set = db_name.session.query(pack_provides).filter( - pack_provides.id.in_(b_dep_proid_keys)).all() - b_bin_pack_ids = [ - bin_pack_obj.binIDkey for bin_pack_obj in b_pack_pro_set] + # srcpack's pkgkey to src_requires find pkgkey + s_pack_requires_set = db_name.session.query( + src_requires).filter_by(pkgKey=src_pack_pkgkey).all() + # src_requires pkykey to find the name of the dependent component + s_pack_requires_names = [ + s_pack_requires_obj.name for s_pack_requires_obj in s_pack_requires_set] + + # Find pkgkey in bin_provides by the name of the dependent component + b_pack_provides_set = db_name.session.query(bin_provides).filter( + bin_provides.name.in_(s_pack_requires_names)).all() + b_pack_provides_pkg_list = [ + b_pack_provides_obj.pkgKey for b_pack_provides_obj in b_pack_provides_set] + + # Go to bin_pack to find the name by pkgkey of bin_provides b_bin_pack_set = db_name.session.query(bin_pack).filter( - bin_pack.id.in_(b_bin_pack_ids)).all() - builddep = [bin_pack_obj.name for bin_pack_obj in b_bin_pack_set] + bin_pack.pkgKey.in_(b_pack_provides_pkg_list)).all() + builddep = [b_bin_pack_obj.name for b_bin_pack_obj in b_bin_pack_set] return builddep -def sub_packages(dbname, src_pack_id): +def sub_packages(dbname, sourcename): """ - Description: Query package layer 1 installation dependency + Query package layer 1 installation dependency + Args: dbname: databases name - src_pack_id: srcpackage id + src_pack_pkgkey: srcpackage id Returns: subpack Source package to binary package, then find the installation dependencies - of the binary package + of the binary package Raises: AttributeError: Object does not have this property """ with DBHelper(db_name=dbname) as db_name: - subpack = {} + subpack = dict() + # The name of src_pack finds the sub-package bin_pack query set i_bin_pack_set = db_name.session.query( - bin_pack).filter_by(srcIDkey=src_pack_id).all() - i_bin_pack_ids = [ - bin_pack_obj.id for bin_pack_obj in i_bin_pack_set] - for i_bin_pack_id in i_bin_pack_ids: - i_bin_pack_name = db_name.session.query( - bin_pack).filter_by(id=i_bin_pack_id).first().name - i_pack_req_set = db_name.session.query( - pack_requires).filter_by(binIDkey=i_bin_pack_id).all() - i_dep_proid_keys = [ - dep_proid_obj.depProIDkey for dep_proid_obj in i_pack_req_set] - i_dep_proid_keys = list(set(i_dep_proid_keys)) - i_pack_provides_set = db_name.session.query(pack_provides).filter( - pack_provides.id.in_(i_dep_proid_keys)).all() - i_bin_pack_ids = [ - bin_pack_obj.binIDkey for bin_pack_obj in i_pack_provides_set] + bin_pack).filter_by(src_name=sourcename).all() + if i_bin_pack_set is None: + return subpack + # Find the objects of each sub-package + for b_bin_pack_obj in i_bin_pack_set: + i_bin_pack_name = b_bin_pack_obj.name + i_bin_pack_pkgkey = b_bin_pack_obj.pkgKey + # Find the names of the components required to install bin_requires + # dependencies + i_bin_requires_set = db_name.session.query( + bin_requires).filter_by(pkgKey=i_bin_pack_pkgkey).all() + i_bin_requires_names = [ + b_bin_requires_obj.name for b_bin_requires_obj in i_bin_requires_set] + # Find pkykey in bin_provides by the name of the dependent + # component + i_bin_provides_set = db_name.session.query(bin_provides).filter( + bin_provides.name.in_(i_bin_requires_names)) + i_bin_provides_pkg_list = [ + i_bin_provides_obj.pkgKey for i_bin_provides_obj in i_bin_provides_set] + # Find the name in bin_pack by pkgkey i_bin_pack_set = db_name.session.query(bin_pack).filter( - bin_pack.id.in_(i_bin_pack_ids)).all() + bin_pack.pkgKey.in_(i_bin_provides_pkg_list)) i_bin_pack_names = [ - bin_pack_obj.name for bin_pack_obj in i_bin_pack_set] + in_bin_pack_obj.name for in_bin_pack_obj in i_bin_pack_set] subpack[i_bin_pack_name] = i_bin_pack_names return subpack def get_single_package(dbname, sourcename): """ - Description: Get all packages info + Get single packages info + Args: dbname: Database name sourcename: Source package name @@ -120,89 +184,119 @@ def get_single_package(dbname, sourcename): AttributeError: Object does not have this property """ with DBHelper(db_name=dbname) as db_name: - package = {} + package = dict() src_pack_obj = db_name.session.query(src_pack).filter_by( name=sourcename).first() + if src_pack_obj is None: + return None package["sourceName"] = src_pack_obj.name package["version"] = src_pack_obj.version - package["license"] = src_pack_obj.license - package["maintainer"] = src_pack_obj.Maintaniner - package["maintainlevel"] = src_pack_obj.MaintainLevel - package["sourceURL"] = src_pack_obj.sourceURL - package["downloadURL"] = src_pack_obj.downloadURL + package["license"] = src_pack_obj.rpm_license + package["sourceURL"] = src_pack_obj.url + package["rpm_packager"] = src_pack_obj.rpm_packager + package["maintaniner"] = src_pack_obj.maintaniner + package["maintainlevel"] = src_pack_obj.maintainlevel package["dbname"] = dbname - src_pack_id = src_pack_obj.id - builddep = buildep_packages(dbname, src_pack_id) - subpack = sub_packages(dbname, src_pack_id) + src_pack_pkgkey = src_pack_obj.pkgKey + builddep = buildep_packages(dbname, src_pack_pkgkey) + subpack = sub_packages(dbname, sourcename) package['buildDep'] = builddep package['subpack'] = subpack return package -def update_single_package( +def get_single(dbnames, sourcename): + """ + get single package + + Args: + dbname: database name + sourcename: source name + """ + response_data = None + dbpreority = db_priority() + if db_priority is None: + response_data = ResponseCode.FILE_NOT_FOUND + + if not dbnames: + response = [] + for db_names in dbpreority: + query_result = get_single_package(db_names, sourcename) + response.append(query_result) + for key in response: + if key is None: + response.remove(key) + if not response: + return jsonify( + ResponseCode.response_json(ResponseCode.PACK_NAME_NOT_FOUND) + ) + return jsonify( + ResponseCode.response_json(ResponseCode.SUCCESS, response) + ) + + # Database queries data and catches exceptions + if dbnames not in dbpreority: + return jsonify( + ResponseCode.response_json(ResponseCode.DB_NAME_ERROR) + ) + response = get_single_package(dbnames, sourcename) + if response is None: + response_data = ResponseCode.PACK_NAME_NOT_FOUND + if response_data is not None: + return jsonify(ResponseCode.response_json(response_data)) + return jsonify( + ResponseCode.response_json(ResponseCode.SUCCESS, [response]) + ) + + +def _update_package_info( package_name, dbname, maintainer, maintain_level): """ - Description: change single package management - Args: + change single package management + + Args: package_name: package name dbname: Database name maintainer: maintainer info maintain_level: maintain_level info - Returns: + Returns: message success or failed Raises: AttributeError: Object does not have this property - TypeError: Abnormal error - """ - with DBHelper(db_name=dbname) as db_name: - update_obj = db_name.session.query( - src_pack).filter_by(name=package_name).first() - update_obj.Maintaniner = maintainer - update_obj.MaintainLevel = maintain_level - db_name.session.commit() - - -def update_maintaniner_info(package_name, - dbname, - maintaniner, - maintainlevel): - """ - Description: update separately maintaniner info - Args: - package_name: package name - dbname: Database name - maintainer: maintainer info - maintain_level: maintain_level info - Returns: - message success or failed - Raises: - AttributeError: Object does not have this property - Error: Abnormal error + SQLAlchemyError: Exception of type + Error: Abnormal error """ - with DBHelper(db_name=dbname) as db_name: - src_pack_obj = db_name.session.query(src_pack).filter_by( - name=package_name).first() - name = src_pack_obj.name - version = src_pack_obj.version - with DBHelper(db_name='maintenance.information') as dbs_name: - try: + try: + result_data = True + with DBHelper(db_name=dbname) as data_name: + update_obj = data_name.session.query( + src_pack).filter_by(name=package_name).first() + if update_obj is None: + return False + update_obj.maintaniner = maintainer + update_obj.maintainlevel = maintain_level + data_name.session.commit() + name = update_obj.name + version = update_obj.version + with DBHelper(db_name='maintenance.information') as dbs_name: information_obj = dbs_name.session.query(maintenance_info).filter_by( name=package_name, version=version).first() if information_obj is None: information = maintenance_info( name=name, version=version, - maintaniner=maintaniner, - maintainlevel=maintainlevel) + maintaniner=maintainer, + maintainlevel=maintain_level) dbs_name.session.add(information) dbs_name.session.commit() else: - information_obj.maintaniner = maintaniner - information_obj.maintainlevel = maintainlevel + information_obj.maintaniner = maintainer + information_obj.maintainlevel = maintain_level dbs_name.session.commit() - except (AttributeError, Error) as attri_error: - current_app.logger.error(attri_error) - return + return result_data + except (AttributeError, SQLAlchemyError, Error) as attri_error: + current_app.logger.error(attri_error) + raise attri_error diff --git a/packageship/packageship/application/apps/package/function/searchdb.py b/packageship/packageship/application/apps/package/function/searchdb.py index bba2994b..3804a556 100644 --- a/packageship/packageship/application/apps/package/function/searchdb.py +++ b/packageship/packageship/application/apps/package/function/searchdb.py @@ -11,6 +11,7 @@ from flask import current_app from sqlalchemy import text from sqlalchemy.exc import SQLAlchemyError, DisconnectionError from sqlalchemy.sql import literal_column +from sqlalchemy import exists from packageship.libs.dbutils import DBHelper from packageship.libs.log import Log @@ -30,6 +31,7 @@ class SearchDB(): db_object_dict:A dictionary for storing database connection objects changeLog: """ + def __new__(cls, *args, **kwargs): # pylint: disable=w0613 if not hasattr(cls, "_instance"): @@ -61,6 +63,7 @@ class SearchDB(): """ result_list = [] get_list = [] + provides_not_found = dict() if not self.db_object_dict: LOGGER.logger.warning("Unable to connect to the database, \ check the database configuration") @@ -72,24 +75,27 @@ class SearchDB(): LOGGER.logger.warning( "The input is None, please check the input value.") return result_list + return_tuple = namedtuple('return_tuple', + 'depend_name depend_version depend_src_name \ + search_name search_src_name search_version') for db_name, data_base in self.db_object_dict.items(): try: name_in = literal_column('name').in_(search_set) sql_com = text(""" SELECT DISTINCT - bin_pack.NAME AS depend_name, - bin_pack.version AS depend_version, - s2.NAME AS depend_src_name, - bin.NAME AS search_name, - s1.`name` AS search_src_name, - s1.version AS search_version + bin_pack.NAME AS depend_name, + bin_pack.version AS depend_version, + bin_pack.src_name AS depend_src_name, + bin_requires.NAME AS req_name, + bin.NAME AS search_name, + bin.src_name AS search_src_name, + bin.version AS search_version FROM - ( SELECT id, NAME,srcIDkey FROM bin_pack WHERE {} ) bin - LEFT JOIN pack_requires ON bin.id = pack_requires.binIDkey - LEFT JOIN pack_provides ON pack_provides.id = pack_requires.depProIDkey - LEFT JOIN bin_pack ON bin_pack.id = pack_provides.binIDkey - LEFT JOIN src_pack s1 ON s1.id = bin.srcIDkey - LEFT JOIN src_pack s2 ON s2.id = bin_pack.srcIDkey;""".format(name_in)) + ( SELECT pkgKey,NAME,version,src_name FROM bin_pack WHERE {} ) bin + LEFT JOIN bin_requires ON bin.pkgKey = bin_requires.pkgKey + LEFT JOIN bin_provides ON bin_provides.name = bin_requires.name + LEFT JOIN bin_pack ON bin_pack.pkgKey = bin_provides.pkgKey; + """.format(name_in)) install_set = data_base.session. \ execute(sql_com, {'name_{}'.format(i): v for i, v in enumerate(search_set, 1)}).fetchall() @@ -97,12 +103,28 @@ class SearchDB(): # find search_name in db_name # depend_name's db_name will be found in next loop for result in install_set: - result_list.append((result, db_name)) get_list.append(result.search_name) + if not result.depend_name and result.req_name: + if result.req_name in provides_not_found: + provides_not_found[result.req_name].append([result.search_name, result.search_src_name, result.search_version, db_name]) + else: + provides_not_found[result.req_name] = [[result.search_name, result.search_src_name, result.search_version, db_name]] + else: + obj = return_tuple( + result.depend_name, + result.depend_src_name, + result.depend_version, + result.search_name, + result.search_src_name, + result.search_version, + ) + result_list.append((obj, db_name)) get_set = set(get_list) get_list.clear() search_set.symmetric_difference_update(get_set) if not search_set: + install_result = self.get_install_pro_in_other_database(provides_not_found) + result_list.extend(install_result) return result_list else: continue @@ -110,9 +132,8 @@ class SearchDB(): LOGGER.logger.error(error_msg) except SQLAlchemyError as error_msg: LOGGER.logger.error(error_msg) - return_tuple = namedtuple('return_tuple', - 'depend_name depend_version depend_src_name \ - search_name search_src_name search_version') + install_result = self.get_install_pro_in_other_database(provides_not_found) + result_list.extend(install_result) for binary_name in search_set: result_list.append((return_tuple(None, None, None, binary_name, None, None), 'NOT FOUND')) @@ -137,8 +158,8 @@ class SearchDB(): bin_obj = data_base.session.query(bin_pack).filter_by( name=binary_name ).first() - source_name = bin_obj.src_pack.name - source_version = bin_obj.src_pack.version + source_name = bin_obj.src_name + source_version = bin_obj.version if source_name is not None: return ResponseCode.SUCCESS, db_name, \ source_name, source_version @@ -163,28 +184,26 @@ class SearchDB(): """ if not self.db_object_dict: return ResponseCode.DIS_CONNECTION_DB, None - - if None in source_name_list: - source_name_list.remove(None) - search_set = set(source_name_list) + search_set = set([ + source_name for source_name in source_name_list if source_name]) result_list = [] get_list = [] if not search_set: return ResponseCode.INPUT_NONE, None for db_name, data_base in self.db_object_dict.items(): try: - name_in = literal_column('name').in_(search_set) + name_in = literal_column('src_name').in_(search_set) sql_com = text('''SELECT - t1.NAME as subpack_name, - t2.version as search_version, - t2.NAME as search_name - FROM bin_pack t1, src_pack t2 - WHERE - t2.id = t1.srcIDkey - AND t2.{} + NAME AS subpack_name, + src_name AS search_name, + version AS search_version + FROM + bin_pack + WHERE + {} '''.format(name_in)) subpack_tuple = data_base.session. \ - execute(sql_com, {'name_{}'.format(i): v + execute(sql_com, {'src_name_{}'.format(i): v for i, v in enumerate(search_set, 1)}).fetchall() if subpack_tuple: for result in subpack_tuple: @@ -203,13 +222,13 @@ class SearchDB(): return_tuple = namedtuple( 'return_tuple', 'subpack_name search_version search_name') for search_name in search_set: - LOGGER.logger.warning("Can't not find " + - search_name + " subpack in all database") + # LOGGER.logger.warning("Can't not find " + + # search_name + " subpack in all database") result_list.append( (return_tuple(None, None, search_name), 'NOT_FOUND')) return ResponseCode.SUCCESS, result_list - def get_binary_in_other_database(self, not_found_binary, db_): + def _get_binary_in_other_database(self, not_found_binary): """ Description: Binary package name data not found in the current database, go to other databases to try @@ -235,57 +254,111 @@ class SearchDB(): "version", "db_name", "search_version", - "req_name" ]) - src_req_map = {req_: src for src, req_ in not_found_binary} - - local_search_set = {req_ for _, req_ in not_found_binary} - - local_dict = {k: v for k, v in self.db_object_dict.items() if k != db_} - res = [] + search_list = [] + result_list = [] + for db_name, data_base in self.db_object_dict.items(): + for key, _ in not_found_binary.items(): + search_list.append(key) - for db_name, data_base in local_dict.items(): + search_set = set(search_list) + search_list.clear() try: sql_string = text(""" - SELECT - t3.NAME AS source_name, - t1.NAME AS bin_name, - t1.version, - t3.version as search_version, - t2.NAME AS req_name - FROM - bin_pack t1, - pack_provides t2, - src_pack t3 - WHERE - t2.{} - AND t1.id = t2.binIDkey - AND t1.srcIDkey = t3.id; - """.format(literal_column('name').in_(local_search_set))) - build_set_2 = data_base.session. \ + SELECT DISTINCT + t1.src_name AS source_name, + t1.NAME AS bin_name, + t1.version, + t2.NAME AS req_name + FROM + bin_pack t1, + bin_provides t2 + WHERE + t2.{} + AND t1.pkgKey = t2.pkgKey; + """.format(literal_column('name').in_(search_set))) + bin_set = data_base.session. \ execute(sql_string, {'name_{}'.format(i): v - for i, v in enumerate(local_search_set, 1)}).fetchall() - if not build_set_2: - continue - - res.extend([return_tuple( - src_req_map.get(bin_pack.req_name), - bin_pack.source_name, - bin_pack.bin_name, - bin_pack.version, - db_name, - bin_pack.search_version, - bin_pack.req_name - ) for bin_pack in build_set_2 if bin_pack.bin_name]) - - for obj in res: - local_search_set.remove(obj.req_name) + for i, v in enumerate(search_set, 1)}).fetchall() + if bin_set: + for result in bin_set: + if result.req_name not in not_found_binary: + LOGGER.logger.warning(result.req_name + " contains in two rpm packages!!!") + else: + for source_info in not_found_binary[result.req_name]: + obj = return_tuple( + source_info[0], + result.source_name, + result.bin_name, + result.version, + db_name, + source_info[1] + ) + result_list.append(obj) + del not_found_binary[result.req_name] + if not not_found_binary: + return result_list + except AttributeError as attr_err: + current_app.logger.error(attr_err) + except SQLAlchemyError as sql_err: + current_app.logger.error(sql_err) + + if not_found_binary: + for key, values in not_found_binary.items(): + LOGGER.logger.warning("CANNOT FOUND THE component" + key + " in all database") + return result_list - except AttributeError as attr_error: - current_app.logger.error(attr_error) - except SQLAlchemyError as sql_error: - current_app.logger.error(sql_error) - return res + def _get_install_pro_in_other_database(self, not_found_binary): + if not not_found_binary: + return [] + return_tuple = namedtuple('return_tuple', + 'depend_name depend_version depend_src_name \ + search_name search_src_name search_version') + search_list = [] + result_list = [] + for db_name, data_base in self.db_object_dict.items(): + for key,values in not_found_binary.items(): + search_list.append(key) + search_set = set(search_list) + search_list.clear() + sql_string = text(""" + SELECT DISTINCT + t1.src_name AS source_name, + t1.NAME AS bin_name, + t1.version, + t2.NAME AS req_name + FROM + bin_pack t1, + bin_provides t2 + WHERE + t2.{} + AND t1.pkgKey = t2.pkgKey; + """.format(literal_column('name').in_(search_set))) + bin_set = data_base.session. \ + execute(sql_string, {'name_{}'.format(i): v + for i, v in enumerate(search_set, 1)}).fetchall() + if bin_set: + for result in bin_set: + if result.req_name not in not_found_binary: + LOGGER.logger.warning(result.req_name + " contains in two rpm packages!!!") + else: + for binary_info in not_found_binary[result.req_name]: + obj = return_tuple( + result.bin_name, + result.version, + result.source_name, + binary_info[0], + binary_info[1], + binary_info[2] + ) + result_list.append((obj, binary_info[3])) + del not_found_binary[result.req_name] + if not not_found_binary: + return result_list + # if not_found_binary: + # for key, values in not_found_binary.items(): + # LOGGER.logger.warning("CANNOT FOUND THE component" + key + " in all database") + return result_list def get_build_depend(self, source_name_li): """ @@ -315,89 +388,108 @@ class SearchDB(): if not s_name_set: return ResponseCode.PARAM_ERROR, None - not_found_binary = set() + provides_not_found = dict() build_list = [] for db_name, data_base in self.db_object_dict.items(): - try: - sql_com = text("""SELECT DISTINCT - src.NAME AS search_name, - src.version AS search_version, - s2.NAME AS source_name, - pack_provides.binIDkey AS bin_id, - pack_requires.NAME AS req_name, - bin_pack.version AS version, - bin_pack.NAME AS bin_name - FROM - ( SELECT id, NAME,version FROM src_pack WHERE {} ) src - LEFT JOIN pack_requires ON src.id = pack_requires.srcIDkey - LEFT JOIN pack_provides ON pack_provides.id = pack_requires.depProIDkey - LEFT JOIN bin_pack ON bin_pack.id = pack_provides.binIDkey - LEFT JOIN src_pack s1 ON s1.id = pack_requires.srcIDkey - LEFT JOIN src_pack s2 ON bin_pack.srcIDkey = s2.id; - """.format(literal_column("name").in_(s_name_set))) - - build_set = data_base.session. \ - execute(sql_com, {'name_{}'.format(i): v - for i, v in enumerate(s_name_set, 1)}).fetchall() - if not build_set: - continue - - # When processing source package without compilation dependency - to_remove_obj_index = [] - for index, b_pack in enumerate(build_set): - if not b_pack.source_name and not b_pack.req_name: - obj = return_tuple( - b_pack.search_name, - b_pack.source_name, - b_pack.bin_name, - b_pack.version, - db_name, - b_pack.search_version + build_set = [] + try: + temp_list = list(s_name_set) + for input_name_li in [temp_list[i:i + 900] for i in range(0, len(temp_list), 900)]: + sql_com = text(""" + SELECT DISTINCT + src.NAME AS search_name, + src.version AS search_version, + bin_pack.src_name AS source_name, + bin_provides.pkgKey AS bin_id, + src_requires.NAME AS req_name, + bin_pack.version AS version, + bin_pack.NAME AS bin_name + FROM + ( SELECT pkgKey, NAME, version FROM src_pack WHERE {} ) src + LEFT JOIN src_requires ON src.pkgKey = src_requires.pkgKey + LEFT JOIN bin_provides ON bin_provides.NAME = src_requires.NAME + LEFT JOIN bin_pack ON bin_pack.pkgKey = bin_provides.pkgKey; + """.format(literal_column("name").in_(input_name_li))) + res = data_base.session.execute( + sql_com, + {'name_{}'.format(i): v + for i, v in enumerate(input_name_li, 1)} + ).fetchall() + + build_set.extend(res) + except AttributeError as attr_err: + current_app.logger.error(attr_err) + except SQLAlchemyError as sql_err: + current_app.logger.error(sql_err) + + if not build_set: + continue + + # When processing source package without compilation dependency + get_list = [] + for result in build_set: + get_list.append(result.search_name) + if not result.bin_name and result.req_name: + if result.req_name in provides_not_found: + provides_not_found[result.req_name].append( + [result.search_name, result.search_version, db_name] ) - - build_list.append(obj) - to_remove_obj_index.append(index) - - for i in reversed(to_remove_obj_index): - build_set.pop(i) - - if not build_set: - continue - - build_list.extend([ - return_tuple( - bin_pack.search_name, - bin_pack.source_name, - bin_pack.bin_name, - bin_pack.version, + else: + provides_not_found[result.req_name] = [ + [result.search_name, result.search_version, db_name] + ] + else: + obj = return_tuple( + result.search_name, + result.source_name, + result.bin_name, + result.version, db_name, - bin_pack.search_version - ) for bin_pack in build_set if bin_pack.bin_id and bin_pack.bin_name - ]) - # Component name can't find its binary package name - not_found_binary.update([(bin_pack.search_name, bin_pack.req_name) - for bin_pack in build_set if not bin_pack.bin_id]) - - s_name_set -= {bin_pack.search_name for bin_pack in build_set - if bin_pack.bin_id} - - if not not_found_binary and not s_name_set: - return ResponseCode.SUCCESS, build_list - - for obj in self.get_binary_in_other_database(not_found_binary, db_name): + result.search_version + ) build_list.append(obj) - not_found_binary.clear() - - except AttributeError as attr_error: - current_app.logger.error(attr_error) - except SQLAlchemyError as sql_error: - current_app.logger.error(sql_error) - return ResponseCode.DIS_CONNECTION_DB, None + get_set = set(get_list) + get_list.clear() + s_name_set.symmetric_difference_update(get_set) + if not s_name_set: + build_result = self._get_binary_in_other_database(provides_not_found) + build_list.extend(build_result) + return ResponseCode.SUCCESS, build_list + + if s_name_set: + build_result = self._get_binary_in_other_database(provides_not_found) + build_list.extend(build_result) + for source in s_name_set: + LOGGER.logger.warning("CANNOT FOUND THE source " + source + " in all database") return ResponseCode.SUCCESS, build_list + def binary_search_database_for_first_time(self, binary_name): + """ + Args: + binary_name: a binary package name + + Returns: + The name of the first database + in which the binary package appears according to priority + If it does not exist or exception occurred , return 'NOT FOUND' + + """ + try: + for db_name, data_base in self.db_object_dict.items(): + if data_base.session.query( + exists().where(bin_pack.name == binary_name) + ).scalar(): + return db_name + except AttributeError as attr_err: + current_app.logger.error(attr_err) + except SQLAlchemyError as sql_err: + current_app.logger.error(sql_err) + + return 'NOT FOUND' + def db_priority(): """ diff --git a/packageship/packageship/application/initsystem/data_import.py b/packageship/packageship/application/initsystem/data_import.py index 94d76dad..5d0dd0e6 100644 --- a/packageship/packageship/application/initsystem/data_import.py +++ b/packageship/packageship/application/initsystem/data_import.py @@ -11,17 +11,15 @@ from sqlalchemy.exc import SQLAlchemyError, InternalError from packageship.libs.dbutils.sqlalchemy_helper import DBHelper from packageship.libs.exception import ContentNoneException from packageship.libs.exception import DatabaseRepeatException -from packageship.libs.exception import DataMergeException from packageship.libs.exception import Error from packageship.libs.configutils.readconfig import ReadConfig from packageship.libs.log import Log -from packageship.application.models.package import bin_pack, src_pack, pack_requires, pack_provides -from packageship.application.initsystem.datamerge import MergeData -from packageship.application.models.temporarydb import src_package -from packageship.application.models.temporarydb import src_requires -from packageship.application.models.temporarydb import bin_package -from packageship.application.models.temporarydb import bin_requiresment -from packageship.application.models.temporarydb import bin_provides +from packageship.application.models.package import src_pack +from packageship.application.models.package import bin_pack +from packageship.application.models.package import bin_requires +from packageship.application.models.package import src_requires +from packageship.application.models.package import bin_provides +from packageship.application.models.package import maintenance_info from packageship import system_config LOGGER = Log(__name__) @@ -31,6 +29,7 @@ class InitDataBase(): """ Description: Database initialization, generate multiple databases and data based on configuration files + Attributes: config_file_path: configuration file path config_file_datas: initialize the configuration content of the database @@ -40,6 +39,7 @@ class InitDataBase(): def __init__(self, config_file_path=None): """ Description: Class instance initialization + Args: config_file_path: Configuration file path """ @@ -48,33 +48,26 @@ class InitDataBase(): if self.config_file_path: # yaml configuration file content self.config_file_datas = self.__read_config_file() - self._read_config = ReadConfig() self.db_type = self._read_config.get_database('dbtype') - + self.sql = None + self._database = None + self.mainter_infos = dict() if self.db_type is None: self.db_type = 'mysql' if self.db_type not in ['mysql', 'sqlite']: - LOGGER.logger.error("database type configuration error") - raise Error('database type configuration error') - self._src_requires_dicts = dict() - self._bin_package_dicts = dict() - self._bin_package_name = dict() - self._bin_requires_dicts = dict() - self._bin_provides_dicts = dict() - self._src_packages = dict() - self._src_package_names = dict() + _msg = "The database type is incorrectly configured.\ + The system temporarily supports only sqlite and mysql databases" + LOGGER.logger.error(_msg) + raise Error(_msg) self._sqlite_db = None - self.requires = dict() def __read_config_file(self): """ - Description: Read the contents of the configuration file load each - node data in the yaml configuration file as - a list to return - Args: + Read the contents of the configuration file load each + node data in the yaml configuration file as a list to return Returns: Initialize the contents of the database configuration file @@ -85,7 +78,8 @@ class InitDataBase(): if not os.path.exists(self.config_file_path): raise FileNotFoundError( - 'system initialization configuration file does not exist') + 'system initialization configuration file \ + does not exist: %s' % self.config_file_path) # load yaml configuration file with open(self.config_file_path, 'r', encoding='utf-8') as file_context: init_database_config = yaml.load( @@ -102,17 +96,15 @@ class InitDataBase(): def init_data(self): """ - Description: Initialization of the database - Args: - - Returns: + Initialization of the database Raises: IOError: An error occurred while deleting the database information file """ if getattr(self, 'config_file_datas', None) is None or \ self.config_file_datas is None: - raise ContentNoneException('Initialization file content is empty') + raise ContentNoneException('The content of the database initialization \ + configuration file is empty') if self.__exists_repeat_database(): raise DatabaseRepeatException( @@ -124,27 +116,38 @@ class InitDataBase(): # Create a database maintained by benchmark information if self.db_type == 'mysql': MysqlDatabaseOperations( - 'maintenance.information').create_datum_database() + db_name='maintenance.information', + tables=['maintenance_info'], + is_datum=True).create_database() else: SqliteDatabaseOperations( - 'maintenance.information').create_datum_database() + db_name='maintenance.information', + tables=['maintenance_info'], + is_datum=True).create_database() + # Obtain the maintenance information of the previous data of the system + self._get_maintenance_info() for database in self.config_file_datas: if not database.get('dbname'): + LOGGER.logger.error( + 'The database name in the database initialization configuration file is empty') continue priority = database.get('priority') if not isinstance(priority, int) or priority < 0 or priority > 100: + LOGGER.logger.error('The priority value type in the database initialization \ + configuration file is incorrect') continue - status = database.get('status') - if status not in ['enable', 'disable']: + if database.get('status') not in ['enable', 'disable']: + LOGGER.logger.error('The database status value in the database \ + initialization configuration file is incorrect') continue - # Initialization data self._init_data(database) def _create_database(self, database): """ - Description: create related databases + create related databases + Args: database: Initialize the configuration content of the database Returns: @@ -154,15 +157,18 @@ class InitDataBase(): """ db_name = database.get('dbname') - self._sqlite_db = SqliteDatabaseOperations(db_name=db_name) - + tables = ['src_pack', 'bin_pack', + 'bin_requires', 'src_requires', 'bin_provides'] if self.db_type == 'mysql': - creatadatabase = MysqlDatabaseOperations(db_name) + creatadatabase = MysqlDatabaseOperations( + db_name=db_name, tables=tables) if not creatadatabase.create_database(): raise SQLAlchemyError("failed to create database or table") return db_name + self._sqlite_db = SqliteDatabaseOperations( + db_name=db_name, tables=tables) - sqltedb_file = self._sqlite_db.create_sqlite_database() + sqltedb_file = self._sqlite_db.create_database() if sqltedb_file is None: raise SQLAlchemyError( "failed to create database or table") @@ -170,7 +176,8 @@ class InitDataBase(): def _init_data(self, database): """ - Description: data initialization operation + data initialization operation + Args: database: Initialize the configuration content of the database Returns: @@ -179,431 +186,307 @@ class InitDataBase(): ContentNoneException: Exception with empty content TypeError: Data type error SQLAlchemyError: Abnormal database operation - DataMergeException: Error in data integration IOError: An error occurred while deleting the database information file """ try: - db_file = None # 1. create a database and related tables in the database db_name = self._create_database(database) # 2. get the data of binary packages and source packages - src_package_paths = database.get('src_db_file') - bin_package_paths = database.get('bin_db_file') + src_db_file = database.get('src_db_file') + bin_db_file = database.get('bin_db_file') - if src_package_paths is None or bin_package_paths is None: + if src_db_file is None or bin_db_file is None: raise ContentNoneException( - 'The configured database file path is empty') - if not isinstance(src_package_paths, list) \ - or not isinstance(bin_package_paths, list): - raise TypeError( - 'The source code and binary path types in the initialization file are abnormal') + 'The path to the sqlite file in the database initialization configuration \ + is incorrect ') + if os.path.exists(src_db_file) or os.path.exists(bin_db_file): + raise FileNotFoundError("sqlite file {src} or {bin} does not exist, please \ + check and try again".format(src=src_db_file, bin=bin_db_file)) # 3. Obtain temporary source package files and binary package files - db_file = self.file_merge( - src_package_paths, bin_package_paths) - # 4. dependencies between combined data - self.data_relationship(db_file) - # 5. save data - self.save_data(db_name) - - except (SQLAlchemyError, ContentNoneException, - DataMergeException, TypeError, Error) as error_msg: + if self.__save_data(src_db_file, bin_db_file, db_name): + # Update the configuration file of the database + database_content = { + 'database_name': database.get('dbname'), + 'priority': database.get('priority'), + 'status': database.get('status') + } + InitDataBase.__updata_settings_file( + database_content=database_content) + + except (SQLAlchemyError, ContentNoneException, TypeError, + Error, FileNotFoundError) as error_msg: + LOGGER.logger.error(error_msg) # Delete the specified database - try: - if self.db_type == 'mysql': - MysqlDatabaseOperations.drop_database( - database.get('dbname')) - else: - self._sqlite_db.drop_database() + self.__del_fail_database(database.get('dbname')) - except (IOError, Error) as exception_msg: - LOGGER.logger.error(exception_msg) - else: - # Update the configuration file of the database - database_content = { - 'database_name': database.get('dbname'), - 'priority': database.get('priority'), - 'status': database.get('status') - } - InitDataBase.__updata_settings_file( - database_content=database_content) - finally: - try: - if os.path.exists(db_file): - os.remove(db_file) - except (IOError, UnboundLocalError) as error_msg: - LOGGER.logger.error(error_msg) + def __del_fail_database(self, db_name): + try: + if self.db_type == 'mysql': + MysqlDatabaseOperations.drop_database(db_name) + else: + self._sqlite_db.drop_database() + except (IOError, Error) as exception_msg: + LOGGER.logger.error(exception_msg) - def _src_package_relation(self, src_package_data): + @staticmethod + def __columns(cursor): """ - Description: Mapping of data relations of source packages + functional description:Returns all the column names + queried by the current cursor + Args: - src_package_data: Source package data + cursor: Cursor Returns: - + The first columns Raises: """ + return [col[0] for col in cursor.description] - _src_package_name = src_package_data.name - _src_package = { - "name": src_package_data.name, - "version": src_package_data.version, - "license": src_package_data.rpm_license, - "sourceURL": src_package_data.url, - "Maintaniner": src_package_data.maintaniner - } - if _src_package_name not in self._src_packages.keys(): - self._src_packages[_src_package_name] = _src_package - else: - # Determine the version number - if src_package_data.version > \ - self._src_packages[_src_package_name]['version']: - - self._src_packages[_src_package_name] = _src_package - # Delete previous version - for key in [names[0] for names in self._src_package_names.items() - if _src_package_name == names[1]]: - del self._src_package_names[key] - - self._src_package_names[src_package_data.pkgKey] = _src_package_name - - def _src_requires_relation(self, src_requires_data): + def __get_data(self): """ - Description: Source package dependent package data relationship mapping + According to different sql statements, query related table data + Args: - src_requires_data: Source package dependent package data + Returns: Raises: """ + if self.sql is None: + return None + try: + src_packages_data = self._database.session.execute(self.sql) + columns = InitDataBase.__columns( + src_packages_data.cursor) + return [dict(zip(columns, row)) for row in src_packages_data.fetchall()] + except SQLAlchemyError as sql_error: + LOGGER.logger.error(sql_error) + return None - _src_package_name = self._src_package_names.get( - src_requires_data.pkgKey) - if _src_package_name: - if _src_package_name not in self._src_requires_dicts.keys(): - self._src_requires_dicts[_src_package_name] = [] - self._src_requires_dicts[_src_package_name].append({ - 'name': src_requires_data.name - }) - - def _bin_package_relation(self, bin_package_data): + def __save_data(self, src_db_file, bin_db_file, db_name): """ - Description: Binary package relationship mapping problem + integration of multiple data files + Args: - bin_package_data: Binary package data + src_package_paths: Source package database file + bin_package_paths: Binary package database file Returns: - + Path of the generated temporary database file Raises: """ + try: + with DBHelper(db_name=src_db_file, db_type='sqlite:///', import_database=True) \ + as database: + self._database = database + # Save data related to source package + self._save_src_packages(db_name) + self._save_src_requires(db_name) + + with DBHelper(db_name=bin_db_file, db_type='sqlite:///', import_database=True)\ + as database: + self._database = database + # Save binary package related data + self._save_bin_packages(db_name) + self._save_bin_requires(db_name) + self._save_bin_provides(db_name) + except (SQLAlchemyError, ContentNoneException) as sql_error: + LOGGER.logger.error(sql_error) + self.__del_fail_database(db_name) + return False + else: + return True - _bin_pkg_key = bin_package_data.pkgKey - self._bin_package_name[bin_package_data.name] = _bin_pkg_key - - src_package_name = bin_package_data.src_pack_name - _bin_package = { - 'name': bin_package_data.name, - 'version': bin_package_data.version, - 'relation': True - } - if src_package_name not in self._bin_package_dicts.keys(): - self._bin_package_dicts[src_package_name] = [] - - # Determine whether the version number is consistent with the source code package - # If they are the same, an association relationship is established. - for index, bin_package_item in enumerate(self._bin_package_dicts[src_package_name]): - if bin_package_item.get('name') == bin_package_data.name: - if bin_package_item.get('version') < bin_package_data.version: - self._bin_package_dicts[src_package_name][index]['relation'] = False - - self._bin_package_dicts[src_package_name].append(_bin_package) - - def _bin_requires_relation(self, bin_requires_data): + def _save_src_packages(self, db_name): """ - Description: Binary package dependency package relationship mapping problem + Save the source package data + Args: - bin_requires_data: Binary package dependency package data + db_name: Saved database name Returns: Raises: """ + # Query all source packages + self.sql = " select * from packages " + packages_datas = self.__get_data() + if packages_datas is None: + raise ContentNoneException( + '{db_name}:There is no relevant data in the source \ + package provided '.format(db_name=db_name)) + for index, src_package_item in enumerate(packages_datas): + maintaniner, maintainlevel = self._get_mainter_info( + src_package_item.get('name'), src_package_item.get('version')) + packages_datas[index]['maintaniner'] = maintaniner + packages_datas[index]['maintainlevel'] = maintainlevel - _bin_pkg_key = bin_requires_data.pkgKey - if _bin_pkg_key: - if _bin_pkg_key not in self._bin_requires_dicts: - self._bin_requires_dicts[_bin_pkg_key] = [] - - self._bin_requires_dicts[_bin_pkg_key].append({ - 'name': bin_requires_data.name - }) + with DBHelper(db_name=db_name) as database: + database.batch_add(packages_datas, src_pack) - def _bin_provides_relation(self, bin_provides_data): + def _save_src_requires(self, db_name): """ - Description: Binary package provided by the relationship mapping problem + Save the dependent package data of the source package + Args: - bin_provides_data: Component data provided by the binary package + db_name:Name database Returns: Raises: """ + # Query all source packages + self.sql = " select * from requires " + requires_datas = self.__get_data() + if requires_datas is None: + raise ContentNoneException('{db_name}: The package data that the source package \ + depends on is empty'.format(db_name=db_name)) + with DBHelper(db_name=db_name) as database: + database.batch_add(requires_datas, src_requires) - _bin_pkg_key = bin_provides_data.pkgKey - if _bin_pkg_key: - if _bin_pkg_key not in self._bin_provides_dicts: - self._bin_provides_dicts[_bin_pkg_key] = [] - self._bin_provides_dicts[_bin_pkg_key].append({ - 'name': bin_provides_data.name - }) - - def data_relationship(self, db_file): + def _save_bin_packages(self, db_name): """ - Description: dependencies between combined data + Save binary package data + Args: - db_file: Temporary database file + db_name:Name database Returns: Raises: - Error information - """ - self._bin_provides_dicts = dict() - self._bin_requires_dicts = dict() - self._bin_package_name = dict() - self._bin_package_dicts = dict() - self._src_requires_dicts = dict() - self._src_packages = dict() - self._src_package_names = dict() - try: - with DBHelper(db_name=db_file, db_type='sqlite:///') as database: - # source package data - for src_package_item in database.session.query(src_package).all(): - self._src_package_relation(src_package_item) + """ + self.sql = " select * from packages " + bin_packaegs = self.__get_data() + if bin_packaegs is None: + raise ContentNoneException( + '{db_name}:There is no relevant data in the provided \ + binary package '.format(db_name=db_name)) + for index, bin_package_item in enumerate(bin_packaegs): + try: + src_package_name = bin_package_item.get('rpm_sourcerpm').split( + '-' + bin_package_item.get('version'))[0] + except AttributeError as exception_msg: + src_package_name = None + LOGGER.logger.warning(exception_msg) + finally: + bin_packaegs[index]['src_name'] = src_package_name - # combine all dependent packages of source packages - for src_requires_item in database.session.query(src_requires).all(): - self._src_requires_relation(src_requires_item) + with DBHelper(db_name=db_name) as database: + database.batch_add(bin_packaegs, bin_pack) - # combine all binary packages - for bin_package_item in database.session.query(bin_package).all(): - self._bin_package_relation(bin_package_item) + def _save_bin_requires(self, db_name): + """ + Save the dependent package data of the binary package - # combine all dependent packages under the current binary package - for bin_requires_item in database.session.query( - bin_requiresment).all(): - self._bin_requires_relation(bin_requires_item) + Args: + db_name:Name database + Returns: - # combine the packages provided by the current binary package + Raises: - for bin_provides_item in database.session.query(bin_provides).all(): - self._bin_provides_relation(bin_provides_item) + """ + self.sql = " select * from requires " + requires_datas = self.__get_data() + if requires_datas is None: + raise ContentNoneException( + '{db_name}:There is no relevant data in the provided binary \ + dependency package'.format(db_name=db_name)) - except Error as error_msg: - LOGGER.logger.error(error_msg) + with DBHelper(db_name=db_name) as database: + database.batch_add(requires_datas, bin_requires) - def file_merge(self, src_package_paths, bin_package_paths): + def _save_bin_provides(self, db_name): """ - Description: integration of multiple data files + Save the component data provided by the binary package + Args: - src_package_paths: Source package database file - bin_package_paths: Binary package database file + db_name:Name database Returns: - Path of the generated temporary database file + Raises: - DataMergeException: Abnormal data integration + """ - _db_file = os.path.join( - self._sqlite_db.database_file_folder, 'temporary_database') - - if os.path.exists(_db_file): - os.remove(_db_file) - # create a temporary sqlite database - with DBHelper(db_name=_db_file, db_type='sqlite:///') as database: - tables = ['src_package', 'src_requires', - 'bin_package', 'bin_requiresment', 'bin_provides'] - database.create_table(tables) - - _src_package_key = 1 - # load all source package files and import the files into it - for src_file in src_package_paths: - load_sqlite_data = MergeData(db_file=src_file) - - # Combine data from all source packages - - _src_package_key, src_merge_result = load_sqlite_data.src_file_merge( - src_package_key=_src_package_key, db_file=_db_file) - if not src_merge_result: - raise DataMergeException( - 'abnormal multi-file database integration') - - # load binary package file - _bin_package_key = 1 - for bin_file in bin_package_paths: - load_sqlite_data = MergeData(db_file=bin_file) - - # Combine all binary package data - _bin_package_key, bin_merge_result = load_sqlite_data.bin_file_merge( - bin_package_key=_bin_package_key, db_file=_db_file) - if not bin_merge_result: - raise DataMergeException( - 'abnormal multi-file database integration') - return _db_file + self.sql = " select * from provides " + provides_datas = self.__get_data() + if provides_datas is None: + raise ContentNoneException( + '{db_name}:There is no relevant data in the provided \ + binary component '.format(db_name=db_name)) - def __exists_repeat_database(self): + with DBHelper(db_name=db_name) as database: + database.batch_add(provides_datas, bin_provides) + + def _get_maintenance_info(self): """ - Description: Determine if the same database name exists - Args: + Description: Obtain the information of the maintainer Returns: - True if there are duplicate databases, false otherwise + Maintainer related information Raises: - + SQLAlchemyError: An error occurred while executing the sql statement """ - db_names = [name.get('dbname') - for name in self.config_file_datas] - - if len(set(db_names)) != len(self.config_file_datas): - return True + try: + with DBHelper(db_name='maintenance.information') as database: + for info in database.session.query(maintenance_info).all(): + if info.name not in self.mainter_infos.keys(): + self.mainter_infos[info.name] = [] + self.mainter_infos[info.name].append({ + 'version': info.version, + 'maintaniner': info.maintaniner, + 'maintainlevel': info.maintainlevel + }) + except SQLAlchemyError as sql_error: + LOGGER.logger.error(sql_error) - return False + def _get_mainter_info(self, src_package_name, version): + ''' + Get the maintainer information of the source package - def _save_bin_package(self, src_packages): - """ - Description: Save binary package data Args: - src_packages: Source package data + src_package_name: Source package name + version: Source package version number Returns: - Binary package data + Maintainer's name Raises: - """ - bin_packages = [] - for package_data in src_packages: - try: - bin_package_datas = self._bin_package_dicts.pop( - package_data.name) - except KeyError: - bin_package_datas = None - - if bin_package_datas: - for bin_package_item in bin_package_datas: - bin_package_dict = { - 'name': bin_package_item.get('name'), - 'version': bin_package_item.get('version'), - 'srcIDkey': None - } - if bin_package_item.get('relation'): - bin_package_dict['srcIDkey'] = package_data.id - bin_packages.append(bin_package_dict) - - # source package dependency package - src_requires_datas = self._src_requires_dicts.get( - package_data.name) - if src_requires_datas: - for src_requires_item in src_requires_datas: - requires_name = src_requires_item.get('name') - if requires_name: - if requires_name not in self.requires.keys(): - self.requires[requires_name] = [] - self.requires[requires_name].append({ - 'name': src_requires_item.get('name'), - 'srcIDkey': package_data.id, - 'depProIDkey': None, - 'binIDkey': None - }) - - # organization independent binary package - - for bin_packs in self._bin_package_dicts.values(): - for bin_pack_item in bin_packs: - bin_packages.append({ - 'name': bin_pack_item.get('name'), - 'version': bin_pack_item.get('version'), - 'srcIDkey': None - }) - return bin_packages - - def _save_bin_provides(self, bin_packages): - """ - Description: Save package data provided by binary - Args: - bin_packages: Binary package data - Returns: - Package data provided by binary - Raises: + ''' + maintenance_infos = self.mainter_infos.get(src_package_name) + maintaniner = None + if maintenance_infos: + for maintenance_item in maintenance_infos: + if maintenance_item.get('version') == version: + maintaniner = (maintenance_item.get( + 'maintaniner'), maintenance_item.get('maintainlevel')) + break + if maintaniner is None: + maintaniner = (None, None) + return maintaniner + def __exists_repeat_database(self): """ - bin_provides_list = [] - for bin_pack_entity in bin_packages: - - # Get the pkgKey of the current binary package - pkg_key = self._bin_package_name.get(bin_pack_entity.name) - - if self._bin_requires_dicts.get(pkg_key): - for bin_requires_item in self._bin_requires_dicts.get(pkg_key): - requires_name = bin_requires_item.get('name') - if requires_name: - if requires_name not in self.requires.keys(): - self.requires[requires_name] = [] - self.requires[requires_name].append({ - 'name': bin_requires_item.get('name'), - 'binIDkey': bin_pack_entity.id, - 'depProIDkey': None, - 'srcIDkey': None - }) - - if self._bin_provides_dicts.get(pkg_key): - for bin_provides_item in self._bin_provides_dicts.get(pkg_key): - bin_provides_list.append({ - 'name': bin_provides_item.get('name'), - 'binIDkey': bin_pack_entity.id - }) - return bin_provides_list + Determine if the same database name exists - def save_data(self, db_name): - """ - Description: save related package data - Args: - db_name: The name of the database Returns: - + True if there are duplicate databases, false otherwise Raises: """ + db_names = [name.get('dbname') + for name in self.config_file_datas] - with DBHelper(db_name=db_name) as data_base: - # Add source package data - data_base.batch_add( - [src_package_item[1] for src_package_item in self._src_packages.items()], src_pack) - - self.requires = dict() - - # Save dependency data of binary packages and source packages - - data_base.batch_add(self._save_bin_package( - data_base.session.query(src_pack).all()), bin_pack) - - # Save all packages and dependent packages provided by the binary package - - data_base.batch_add(self._save_bin_provides( - data_base.session.query(bin_pack).all()), pack_provides) - - all_requires = [] - for provides_item in data_base.session.query(pack_provides).all(): - if provides_item.name in self.requires.keys(): - for requires_item in self.requires[provides_item.name]: - requires_item['depProIDkey'] = provides_item.id - all_requires.append(requires_item) + if len(set(db_names)) != len(self.config_file_datas): + return True - data_base.batch_add(all_requires, pack_requires) + return False @staticmethod def __updata_settings_file(**Kwargs): """ - Description: update some configuration files related to the database in the system + update some configuration files related to the database in the system + Args: **Kwargs: data related to configuration file nodes database_name: Name database @@ -632,7 +515,8 @@ class InitDataBase(): @staticmethod def delete_settings_file(): """ - Description: Delete the configuration file of the database + Delete the configuration file of the database + Args: Returns: @@ -652,7 +536,8 @@ class InitDataBase(): def delete_db(self, db_name): """ - Description: elete the database + delete the database + Args: db_name: The name of the database Returns: @@ -660,42 +545,49 @@ class InitDataBase(): Raises: IOError: File or network operation io abnormal """ - if self.db_type == 'mysql': - del_result = MysqlDatabaseOperations.drop_database(db_name) - else: - if not hasattr(self, '_sqlite_db') or getattr(self, '_sqlite_db') is None: - self._sqlite_db = SqliteDatabaseOperations(db_name=db_name) - del_result = self._sqlite_db.drop_database() + try: + del_result = True + file_read = open( + system_config.DATABASE_FILE_INFO, 'r', encoding='utf-8') + _databases = yaml.load( + file_read.read(), Loader=yaml.FullLoader) + for database in _databases: + if database.get('database_name') == db_name: + _databases.remove(database) + # Delete the successfully imported database configuration node + with open(system_config.DATABASE_FILE_INFO, 'w+', encoding='utf-8') as file_context: + yaml.safe_dump(_databases, file_context) + except (IOError, Error) as del_config_error: + LOGGER.logger.error(del_config_error) + del_result = False + finally: + file_read.close() if del_result: - try: - file_read = open(system_config.DATABASE_FILE_INFO, 'r', encoding='utf-8') - _databases = yaml.load( - file_read.read(), Loader=yaml.FullLoader) - for database in _databases: - if database.get('database_name') == db_name: - _databases.remove(database) - # Delete the successfully imported database configuration node - with open(system_config.DATABASE_FILE_INFO, 'w+', encoding='utf-8') as file_context: - yaml.safe_dump(_databases, file_context) - except (IOError, Error) as del_config_error: - LOGGER.logger.error(del_config_error) - finally: - file_read.close() + if self.db_type == 'mysql': + del_result = MysqlDatabaseOperations.drop_database(db_name) + else: + if not hasattr(self, '_sqlite_db') or getattr(self, '_sqlite_db') is None: + self._sqlite_db = SqliteDatabaseOperations(db_name=db_name) + del_result = self._sqlite_db.drop_database() + + return del_result class MysqlDatabaseOperations(): """ - Description: Related to database operations, creating databases, creating tables + Related to database operations, creating databases, creating tables + Attributes: db_name: The name of the database create_database_sql: SQL statement to create a database drop_database_sql: Delete the SQL statement of the database """ - def __init__(self, db_name): + def __init__(self, db_name, tables=None, is_datum=False): """ - Description: Class instance initialization + Class instance initialization + Args: db_name: Database name """ @@ -704,11 +596,12 @@ class MysqlDatabaseOperations(): DEFAULT CHARACTER SET utf8mb4; '''.format(db_name=self.db_name) self.drop_database_sql = '''drop DATABASE if exists `{db_name}` '''.format( db_name=self.db_name) + self.tables = tables + self.is_datum = is_datum def create_database(self): """ - Description: create a database - Args: + create a mysql database Returns: True if successful, otherwise false @@ -720,9 +613,10 @@ class MysqlDatabaseOperations(): try: # create database - data_base.session.execute(self.drop_database_sql) + if not self.is_datum: + data_base.session.execute(self.drop_database_sql) data_base.session.execute(self.create_database_sql) - except SQLAlchemyError as exception_msg: + except (SQLAlchemyError, InternalError) as exception_msg: LOGGER.logger.error(exception_msg) return False else: @@ -732,7 +626,8 @@ class MysqlDatabaseOperations(): @classmethod def drop_database(cls, db_name): """ - Description: Delete the database according to the specified name + Delete the database according to the specified name + Args: db_name: The name of the database to be deleted Returns: @@ -756,8 +651,7 @@ class MysqlDatabaseOperations(): def __create_tables(self): """ - Description: Create the specified data table - Args: + Create the specified data table Returns: True if successful, otherwise false @@ -766,9 +660,8 @@ class MysqlDatabaseOperations(): """ try: with DBHelper(db_name=self.db_name) as database: - tables = ['src_pack', 'bin_pack', 'pack_provides', - 'pack_requires'] - database.create_table(tables) + if self.tables: + database.create_table(self.tables) except SQLAlchemyError as exception_msg: LOGGER.logger.error(exception_msg) @@ -776,64 +669,20 @@ class MysqlDatabaseOperations(): else: return True - def create_datum_database(self): - """ - Description: Create a benchmark database to save the maintainer's information - Args: - - Returns: - True if successful, otherwise false - Raises: - SQLAlchemyError: An exception occurred while creating the database - """ - with DBHelper(db_name='mysql') as data_base: - # create database - try: - data_base.session.execute(self.create_database_sql) - except SQLAlchemyError as exception_msg: - LOGGER.logger.error(exception_msg) - return False - else: - # create tables - return self.__create_datum_tables() - - def __create_datum_tables(self): - """ - Description: Create a data table of maintainer information - rgs: - - Returns: - True if successful, otherwise false - Raises: - SQLAlchemyError: An exception occurred while creating the database - Error: Error information - """ - try: - with DBHelper(db_name=self.db_name) as database: - tables = ['maintenance_info'] - database.create_table(tables) - except InternalError as exists_table_err: - LOGGER.logger.error(exists_table_err) - return True - except (SQLAlchemyError, Error) as exception_msg: - LOGGER.logger.error(exception_msg) - return False - - else: - return True - class SqliteDatabaseOperations(): """ - Description: sqlite database related operations + sqlite database related operations + Attributes: db_name: Name database database_file_folder: Database folder path """ - def __init__(self, db_name, **kwargs): + def __init__(self, db_name, tables=None, is_datum=False, ** kwargs): """ - Description: Class instance initialization + Class instance initialization + Args: db_name: Database name kwargs: data related to configuration file nodes @@ -844,11 +693,13 @@ class SqliteDatabaseOperations(): self._database_file_path() else: self.database_file_folder = kwargs.get('database_path') + self.tables = tables + self.is_datum = is_datum def _database_file_path(self): """ - Description: Database file path - Args: + Database file path + Returns: Raises: @@ -866,10 +717,9 @@ class SqliteDatabaseOperations(): LOGGER.logger.error(makedirs_error) self.database_file_folder = None - def create_sqlite_database(self): + def create_database(self): """ - Description: create sqlite database and table - Args: + create sqlite database and table Returns: After successful generation, return the database file address, @@ -888,28 +738,25 @@ class SqliteDatabaseOperations(): os.remove(_db_file + '.db') # create a sqlite database - with DBHelper(db_name=_db_file) as database: - tables = ['src_pack', 'bin_pack', - 'pack_requires', 'pack_provides'] - try: - database.create_table(tables) - except SQLAlchemyError as create_table_err: - LOGGER.logger.error(create_table_err) - return None + if (self.is_datum and not os.path.exists(_db_file + '.db')) or not self.is_datum: + with DBHelper(db_name=_db_file) as database: + try: + database.create_table(self.tables) + except (SQLAlchemyError, InternalError) as create_table_err: + LOGGER.logger.error(create_table_err) + return None return _db_file def drop_database(self): """ - Description: Delete the specified sqlite database - Args: + Delete the specified sqlite database Returns: Return true after successful deletion, otherwise return false Raises: IOError: An io exception occurred while deleting the specified database file """ - try: db_path = os.path.join( self.database_file_folder, self.db_name + '.db') @@ -920,32 +767,3 @@ class SqliteDatabaseOperations(): return False else: return True - - def create_datum_database(self): - """ - Description: create sqlite database and table - Args: - - Returns: - After successful generation, return the database file address, - otherwise return none - Raises: - FileNotFoundError: The specified database folder does not exist - SQLAlchemyError: An error occurred while generating the database - """ - if self.database_file_folder is None: - raise FileNotFoundError('Database folder does not exist') - - _db_file = os.path.join( - self.database_file_folder, self.db_name) - - if not os.path.exists(_db_file + '.db'): - # create a sqlite database - with DBHelper(db_name=_db_file) as database: - tables = ['maintenance_info'] - try: - database.create_table(tables) - except SQLAlchemyError as create_table_err: - LOGGER.logger.error(create_table_err) - return None - return _db_file diff --git a/packageship/packageship/application/initsystem/datamerge.py b/packageship/packageship/application/initsystem/datamerge.py deleted file mode 100644 index 85a6be7e..00000000 --- a/packageship/packageship/application/initsystem/datamerge.py +++ /dev/null @@ -1,377 +0,0 @@ -#!/usr/bin/python3 -""" -Description: Integration of multiple sqlite file data, including reading - sqlite database and inserting data -Class: MergeData -""" -from sqlalchemy.exc import SQLAlchemyError -from packageship.application.models.temporarydb import src_package -from packageship.application.models.temporarydb import src_requires -from packageship.application.models.temporarydb import bin_package -from packageship.application.models.temporarydb import bin_requiresment -from packageship.application.models.temporarydb import bin_provides -from packageship.application.models.package import maintenance_info -from packageship.libs.dbutils import DBHelper -from packageship.libs.log import Log - -LOGGER = Log(__name__) - - -class MergeData(): - """ - Description: Load data from sqlite database - Attributes: - db_file: Database file - db_type: Connected database type - datum_database: Base database name - """ - - def __init__(self, db_file): - """ - Description: Class instance initialization - Args: - db_file: Database file - """ - self.db_file = db_file - self.db_type = 'sqlite:///' - self.datum_database = 'maintenance.information' - self.src_requires_dicts = dict() - self.src_package_datas = [] - self.bin_provides_dicts = dict() - self.bin_package_datas = [] - self.mainter_infos = dict() - self.bin_requires_dicts = dict() - - @staticmethod - def __columns(cursor): - """ - Description: functional description:Returns all the column names - queried by the current cursor - Args: - cursor: Cursor - - Returns: - The first columns - Raises: - - """ - return [col[0] for col in cursor.description] - - def get_package_data(self): - """ - Description: get binary package or source package data - Args: - - Returns: - All source package data queried - Raises: - SQLAlchemyError: An error occurred while executing the sql statement - """ - try: - with DBHelper(db_name=self.db_file, db_type=self.db_type, import_database=True) \ - as database: - src_packages_data = database.session.execute( - "select pkgKey,name,version,rpm_license,url,rpm_sourcerpm from packages") - columns = MergeData.__columns( - src_packages_data.cursor) - return [dict(zip(columns, row)) for row in src_packages_data.fetchall()] - except SQLAlchemyError as sql_error: - LOGGER.logger.error(sql_error) - return None - - def get_requires_data(self): - """ - Description: get dependent package data of binary package or source package - Args: - - Returns: - All dependent data queried - Raises: - SQLAlchemyError: An error occurred while executing the sql statement - """ - try: - with DBHelper(db_name=self.db_file, db_type=self.db_type, import_database=True) \ - as database: - requires = database.session.execute( - "select pkgKey,name from requires") - columns = MergeData.__columns(requires.cursor) - return [dict(zip(columns, row)) for row in requires.fetchall()] - except SQLAlchemyError as sql_error: - LOGGER.logger.error(sql_error) - return None - - def get_provides(self): - """ - Description: get the dependency package provided by the binary package - Args: - - Returns: - Query the component data provided by all binary packages - Raises: - SQLAlchemyError: An error occurred while executing the sql statement - """ - try: - with DBHelper(db_name=self.db_file, db_type=self.db_type, import_database=True) \ - as database: - requires = database.session.execute( - "select pkgKey,name from provides") - columns = MergeData.__columns(requires.cursor) - return [dict(zip(columns, row)) for row in requires.fetchall()] - except SQLAlchemyError as sql_error: - LOGGER.logger.error(sql_error) - return None - - def get_maintenance_info(self): - """ - Description: Obtain the information of the maintainer - Args: - - Returns: - Maintainer related information - Raises: - SQLAlchemyError: An error occurred while executing the sql statement - """ - try: - if not hasattr(self, 'mainter_infos'): - self.mainter_infos = dict() - with DBHelper(db_name=self.datum_database) as database: - for info in database.session.query(maintenance_info).all(): - if info.name not in self.mainter_infos.keys(): - self.mainter_infos[info.name] = [] - self.mainter_infos[info.name].append({ - 'version': info.version, - 'maintaniner': info.maintaniner - }) - except SQLAlchemyError as sql_error: - LOGGER.logger.error(sql_error) - - def src_file_merge(self, src_package_key, db_file): - """ - Description: Source code related data integration - Args: - src_package_key: The relevant key value of the source package - db_file: Database file - Returns: - Key value after successful data combination - (0, False) or (src_package_key, True) - Raises: - SQLAlchemyError: An error occurred while executing the sql statement - """ - self.get_maintenance_info() - - self.__compose_src_package() - - self.__compose_src_rquires() - - # Combination of relationships between source packages and dependent packages - src_requires_data = [] - for src_package_item in self.src_package_datas: - src_package_key += 1 - requires = self.src_requires_dicts.get( - src_package_item.get('pkgKey')) - if requires: - for src_requires_item in requires: - src_requires_item['pkgKey'] = src_package_key - src_requires_data.append(src_requires_item) - src_package_item['pkgKey'] = src_package_key - - try: - with DBHelper(db_name=db_file, db_type=self.db_type) as data_base: - data_base.batch_add(self.src_package_datas, src_package) - data_base.batch_add(src_requires_data, src_requires) - except SQLAlchemyError as sql_error: - LOGGER.logger.error(sql_error) - return (0, False) - else: - return (src_package_key, True) - - def __compose_src_package(self): - """ - Description: Combine source package data - Args: - - Returns: - - Raises: - - """ - if getattr(self, 'src_package_datas', None) is None: - self.src_package_datas = [] - - for src_package_item in self.get_package_data(): - src_package_name = src_package_item.get('name') - if src_package_name: - # Find the maintainer information of the current data - maintenance_infos = self.mainter_infos.get(src_package_name) - maintenance = [] - version = src_package_item.get('version') - if self.mainter_infos.get(src_package_name): - for maintenance_item in maintenance_infos: - if maintenance_item.get('version') == version: - maintenance.append(maintenance_item) - - self.src_package_datas.append( - { - "name": src_package_item.get('name'), - "version": version, - "rpm_license": src_package_item.get('rpm_license'), - "url": src_package_item.get('url'), - "pkgKey": src_package_item.get('pkgKey'), - 'maintaniner': - maintenance[0].get('maintaniner') if maintenance and len( - maintenance) > 0 else None - } - ) - - def __compose_src_rquires(self): - """ - Description: Combine source package dependent package data - Args: - - Returns: - - Raises: - - """ - if getattr(self, 'src_requires_dicts', None) is None: - self.src_requires_dicts = dict() - - for src_requires_item in self.get_requires_data(): - pkg_key = src_requires_item.get('pkgKey') - if pkg_key: - if pkg_key not in self.src_requires_dicts.keys(): - self.src_requires_dicts[pkg_key] = [] - self.src_requires_dicts[pkg_key].append( - { - 'name': src_requires_item.get('name'), - 'pkgKey': pkg_key - } - ) - - def __compose_bin_package(self): - """ - Description: Combine binary package data - Args: - - Returns: - - Raises: - AttributeError - """ - if getattr(self, 'bin_package_datas', None) is None: - self.bin_package_datas = [] - - for bin_package_item in self.get_package_data(): - try: - src_package_name = bin_package_item.get('rpm_sourcerpm').split( - '-' + bin_package_item.get('version'))[0] - except AttributeError as exception_msg: - src_package_name = None - LOGGER.logger.warning(exception_msg) - else: - self.bin_package_datas.append( - { - "name": bin_package_item.get('name'), - "version": bin_package_item.get('version'), - "license": bin_package_item.get('rpm_license'), - "sourceURL": bin_package_item.get('url'), - "src_pack_name": src_package_name, - "pkgKey": bin_package_item.get('pkgKey') - } - ) - - def __compose_bin_requires(self): - """ - Description: Combining binary dependent package data - Args: - - Returns: - - Raises: - """ - if getattr(self, 'bin_requires_dicts', None) is None: - self.bin_requires_dicts = dict() - - for bin_requires_item in self.get_requires_data(): - pkg_key = bin_requires_item.get('pkgKey') - if pkg_key: - if pkg_key not in self.bin_requires_dicts.keys(): - self.bin_requires_dicts[pkg_key] = [] - self.bin_requires_dicts[pkg_key].append({ - 'name': bin_requires_item.get('name'), - 'pkgKey': 0 - }) - - def __compose_bin_provides(self): - """ - Description: Combine binary package data - Args: - - Returns: - - Raises: - - """ - if getattr(self, 'bin_provides_dicts', None) is None: - self.bin_provides_dicts = dict() - - for bin_provides_item in self.get_provides(): - pkg_key = bin_provides_item.get('pkgKey') - if pkg_key: - if pkg_key not in self.bin_provides_dicts.keys(): - self.bin_provides_dicts[pkg_key] = [] - self.bin_provides_dicts[pkg_key].append({ - 'name': bin_provides_item.get('name'), - 'pkgKey': 0 - }) - - def bin_file_merge(self, bin_package_key, db_file): - """ - Description: Binary package related data integration - Args: - bin_package_key: Primary key of binary package - db_file: Database file - Returns: - Key value after successful data combination - (0, False) or (bin_package_key, True) - Raises: - SQLAlchemyError: An error occurred while executing the sql statement - """ - self.__compose_bin_package() - # binary package dependent package integration - - self.__compose_bin_requires() - - self.__compose_bin_provides() - - # integrate the id data of the binary package - bin_requires_datas = [] - bin_provides_datas = [] - for bin_package_item in self.bin_package_datas: - bin_package_key += 1 - # dependent packages - requires = self.bin_requires_dicts.get( - bin_package_item.get('pkgKey')) - if requires: - for bin_requires_item in requires: - bin_requires_item['pkgKey'] = bin_package_key - bin_requires_datas.append(bin_requires_item) - - provides = self.bin_provides_dicts.get( - bin_package_item.get('pkgKey')) - if provides: - for bin_provides_item in provides: - bin_provides_item['pkgKey'] = bin_package_key - bin_provides_datas.append(bin_provides_item) - bin_package_item['pkgKey'] = bin_package_key - # save binary package related data - try: - with DBHelper(db_name=db_file, db_type=self.db_type) as data_base: - data_base.batch_add(self.bin_package_datas, bin_package) - data_base.batch_add(bin_requires_datas, bin_requiresment) - data_base.batch_add(bin_provides_datas, bin_provides) - except SQLAlchemyError as sql_error: - LOGGER.logger.error(sql_error) - return (0, False) - else: - return (bin_package_key, True) diff --git a/packageship/packageship/application/models/package.py b/packageship/packageship/application/models/package.py index c0f8acb3..725f4af7 100644 --- a/packageship/packageship/application/models/package.py +++ b/packageship/packageship/application/models/package.py @@ -2,33 +2,45 @@ """ Description: Database entity model mapping """ -from sqlalchemy import Column, Integer, String, ForeignKey -from sqlalchemy.orm import relationship +from sqlalchemy import Column, Integer, String from packageship.libs.dbutils.sqlalchemy_helper import DBHelper class src_pack(DBHelper.BASE): # pylint: disable=C0103,R0903 """ - Description: functional description:Source package model + Source package model """ __tablename__ = 'src_pack' - id = Column(Integer, primary_key=True) - - name = Column(String(500), nullable=True) - - version = Column(String(200), nullable=True) - - license = Column(String(500), nullable=True) - - sourceURL = Column(String(200), nullable=True) - - downloadURL = Column(String(200), nullable=True) - - Maintaniner = Column(String(50), nullable=True) - - MaintainLevel = Column(String(20), nullable=True) + pkgKey = Column(Integer, primary_key=True) + pkgId = Column(String(500), nullable=True) + name = Column(String(200), nullable=True) + arch = Column(String(200), nullable=True) + version = Column(String(500), nullable=True) + epoch = Column(String(200), nullable=True) + release = Column(String(500), nullable=True) + summary = Column(String(500), nullable=True) + description = Column(String(500), nullable=True) + url = Column(String(500), nullable=True) + time_file = Column(Integer, nullable=True) + time_build = Column(Integer, nullable=True) + rpm_license = Column(String(500), nullable=True) + rpm_vendor = Column(String(500), nullable=True) + rpm_group = Column(String(500), nullable=True) + rpm_buildhost = Column(String(500), nullable=True) + rpm_sourcerpm = Column(String(500), nullable=True) + rpm_header_start = Column(Integer, nullable=True) + rpm_header_end = Column(Integer, nullable=True) + rpm_packager = Column(String(500), nullable=True) + size_package = Column(Integer, nullable=True) + size_installed = Column(Integer, nullable=True) + size_archive = Column(Integer, nullable=True) + location_href = Column(String(500), nullable=True) + location_base = Column(String(500), nullable=True) + checksum_type = Column(String(500), nullable=True) + maintaniner = Column(String(100), nullable=True) + maintainlevel = Column(String(100), nullable=True) class bin_pack(DBHelper.BASE): # pylint: disable=C0103,R0903 @@ -37,48 +49,81 @@ class bin_pack(DBHelper.BASE): # pylint: disable=C0103,R0903 """ __tablename__ = 'bin_pack' - id = Column(Integer, primary_key=True) - + pkgKey = Column(Integer, primary_key=True) + pkgId = Column(String(500), nullable=True) name = Column(String(500), nullable=True) - - version = Column(String(200), nullable=True) - - srcIDkey = Column(Integer, ForeignKey('src_pack.id')) - - src_pack = relationship('src_pack', backref="bin_pack") - - -class pack_requires(DBHelper.BASE): # pylint: disable=C0103,R0903 + arch = Column(String(500), nullable=True) + version = Column(String(500), nullable=True) + epoch = Column(String(500), nullable=True) + release = Column(String(500), nullable=True) + summary = Column(String(500), nullable=True) + description = Column(String(500), nullable=True) + url = Column(String(500), nullable=True) + time_file = Column(Integer, nullable=True) + time_build = Column(Integer, nullable=True) + rpm_license = Column(String(500), nullable=True) + rpm_vendor = Column(String(500), nullable=True) + rpm_group = Column(String(500), nullable=True) + rpm_buildhost = Column(String(500), nullable=True) + rpm_sourcerpm = Column(String(500), nullable=True) + rpm_header_start = Column(Integer, nullable=True) + rpm_header_end = Column(Integer, nullable=True) + rpm_packager = Column(String(500), nullable=True) + size_package = Column(Integer, nullable=True) + size_installed = Column(Integer, nullable=True) + size_archive = Column(Integer, nullable=True) + location_href = Column(String(500), nullable=True) + location_base = Column(String(500), nullable=True) + checksum_type = Column(String(500), nullable=True) + src_name = Column(String(500), nullable=True) + + +class bin_requires(DBHelper.BASE): # pylint: disable=C0103,R0903 """ - functional description: + Binary package dependent package entity model """ - __tablename__ = 'pack_requires' + __tablename__ = 'bin_requires' id = Column(Integer, primary_key=True) + name = Column(String(200), nullable=True) + flags = Column(String(200), nullable=True) + epoch = Column(String(200), nullable=True) + version = Column(String(500), nullable=True) + release = Column(String(200), nullable=True) + pkgKey = Column(Integer, nullable=True) + pre = Column(String(20), nullable=True) - name = Column(String(500), nullable=True) - - # depProIDkey = Column(Integer, ForeignKey( - # 'pack_provides.id'), nullable=True) - depProIDkey = Column(Integer) - srcIDkey = Column(Integer, ForeignKey('src_pack.id'), nullable=True) +class src_requires(DBHelper.BASE): # pylint: disable=C0103,R0903 + """ + Source entity package dependent package entity model + """ + __tablename__ = 'src_requires' - binIDkey = Column(Integer, ForeignKey('bin_pack.id'), nullable=True) + id = Column(Integer, primary_key=True) + name = Column(String(200), nullable=True) + flags = Column(String(200), nullable=True) + epoch = Column(String(200), nullable=True) + version = Column(String(500), nullable=True) + release = Column(String(200), nullable=True) + pkgKey = Column(Integer, nullable=True) + pre = Column(String(20), nullable=True) -class pack_provides(DBHelper.BASE): # pylint: disable=C0103,R0903 +class bin_provides(DBHelper.BASE): # pylint: disable=C0103,R0903 """ - functional description: + Component entity model provided by binary package """ - __tablename__ = 'pack_provides' + __tablename__ = 'bin_provides' id = Column(Integer, primary_key=True) - - name = Column(String(500), nullable=True) - - binIDkey = Column(Integer, ForeignKey('bin_pack.id')) + name = Column(String(200), nullable=True) + flags = Column(String(200), nullable=True) + epoch = Column(String(200), nullable=True) + version = Column(String(500), nullable=True) + release = Column(String(200), nullable=True) + pkgKey = Column(Integer, nullable=True) class maintenance_info(DBHelper.BASE): # pylint: disable=C0103,R0903 diff --git a/packageship/packageship/application/models/temporarydb.py b/packageship/packageship/application/models/temporarydb.py deleted file mode 100644 index 07a2dd17..00000000 --- a/packageship/packageship/application/models/temporarydb.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/python3 -""" -Description: Database entity model mapping -""" -from sqlalchemy import Column, Integer, String -from packageship.libs.dbutils.sqlalchemy_helper import DBHelper - - -class src_package(DBHelper.BASE): # pylint: disable=C0103,R0903 - """ - Description: Temporary source package model - """ - - __tablename__ = 'src_package' - - pkgKey = Column(Integer, primary_key=True) - - name = Column(String(500), nullable=True) - - version = Column(String(200), nullable=True) - - rpm_license = Column(String(500), nullable=True) - - url = Column(String(200), nullable=True) - - maintaniner = Column(String(100), nullable=True) - - -class bin_package(DBHelper.BASE): # pylint: disable=C0103,R0903 - """ - Description: Temporary binary package model - """ - __tablename__ = 'bin_package' - - pkgKey = Column(Integer, primary_key=True) - - name = Column(String(500), nullable=True) - - version = Column(String(200), nullable=True) - - rpm_license = Column(String(500), nullable=True) - - url = Column(String(500), nullable=True) - - rpm_sourcerpm = Column(String(500), nullable=True) - - src_pack_name = Column(String(200), nullable=True) - - -class src_requires(DBHelper.BASE): # pylint: disable=C0103,R0903 - """ - Description: Temporary source package depends on package model - """ - __tablename__ = 'src_requires' - - id = Column(Integer, primary_key=True) - - pkgKey = Column(Integer) - - name = Column(String(500), nullable=True) - - -class bin_requiresment(DBHelper.BASE): # pylint: disable=C0103,R0903 - """ - Description: Dependency package model for temporary binary packages - """ - __tablename__ = 'bin_requiresment' - - id = Column(Integer, primary_key=True) - - pkgKey = Column(Integer) - - name = Column(String(500), nullable=True) - - -class bin_provides(DBHelper.BASE): # pylint: disable=C0103,R0903 - """ - Description: Provided package model for temporary binary packages - """ - __tablename__ = 'bin_provides' - - id = Column(Integer, primary_key=True) - - pkgKey = Column(Integer) - - name = Column(String(500), nullable=True) diff --git a/packageship/setup.py b/packageship/setup.py index 676e6ccb..b10dc708 100644 --- a/packageship/setup.py +++ b/packageship/setup.py @@ -30,9 +30,7 @@ setup( 'packageship.application.apps.package.function.searchdb', 'packageship.application.apps.package.function.self_depend', 'packageship.application.initsystem.data_import', - 'packageship.application.initsystem.datamerge', 'packageship.application.models.package', - 'packageship.application.models.temporarydb', 'packageship.application.settings', 'packageship.libs.__init__', 'packageship.libs.configutils.readconfig', -- Gitee From 55c5982b88331ec364d3b15d8057a661f3b47245 Mon Sep 17 00:00:00 2001 From: Yiru Wang Mac Date: Thu, 30 Jul 2020 10:36:39 +0800 Subject: [PATCH 2/8] change url-info based on packages.py logic --- .../application/apps/package/url.py | 2 +- .../application/apps/package/view.py | 301 +++++++++--------- packageship/packageship/pkgship.py | 4 +- 3 files changed, 148 insertions(+), 159 deletions(-) diff --git a/packageship/packageship/application/apps/package/url.py b/packageship/packageship/application/apps/package/url.py index 5a082134..873cd793 100644 --- a/packageship/packageship/application/apps/package/url.py +++ b/packageship/packageship/application/apps/package/url.py @@ -10,7 +10,7 @@ urls = [ # Query and update a package info - (view.SinglePack, '/packages/findByPackName', + (view.SinglePack, '/packages/packageInfo', {'query': ('GET'), 'write': ('PUT')}), # Query a package's install depend(support querying in one or more databases) diff --git a/packageship/packageship/application/apps/package/view.py b/packageship/packageship/application/apps/package/view.py index 2058738f..cdf32e4d 100644 --- a/packageship/packageship/application/apps/package/view.py +++ b/packageship/packageship/application/apps/package/view.py @@ -19,10 +19,9 @@ from packageship.libs.exception import DataMergeException from packageship.libs.log import Log from packageship.system_config import DATABASE_FILE_INFO from .function.constants import ResponseCode -from .function.packages import get_packages -from .function.packages import update_single_package -from .function.packages import update_maintaniner_info -from .function.packages import get_single_package +from .function.packages import get_all_packages +from .function.packages import _update_package_info +from .function.packages import get_single from .function.searchdb import db_priority from .serialize import PackagesSchema from .serialize import GetpackSchema @@ -52,25 +51,27 @@ class Packages(Resource): def get(self): """ - Description: Get all package info from a database + Get all package info from a database + Args: dbName: Data path name, not required parameter Returns: - { - "code": "", - "data": [ - { + for + example:: + { + "code": "", + "data": [{ "dbname": "", - "downloadURL": "", "license": "", - "maintainer": , - "maintainlevel": , + "maintainlevel":, + "maintaniner": , + "rpm_packager": "", "sourceName": "", "sourceURL": "", "version": "" - }, - "msg": "" - } + }], + "msg": "" + } Raises: DisconnectionError: Unable to connect to database exception AttributeError: Object does not have this property @@ -86,34 +87,19 @@ class Packages(Resource): dbname = data.get("dbName", None) # Call method to query try: - dbpreority = db_priority() - if dbpreority is None: - return jsonify( - ResponseCode.response_json(ResponseCode.FILE_NOT_FOUND) - ) - if not dbname: - response = [] - for dbname in dbpreority: - query_result = get_packages(dbname) - for item in query_result: - response.append(item) - return jsonify( - ResponseCode.response_json(ResponseCode.SUCCESS, response) - ) - if dbname not in dbpreority: - return jsonify( - ResponseCode.response_json(ResponseCode.DB_NAME_ERROR) - ) - response = get_packages(dbname) - return jsonify( - ResponseCode.response_json(ResponseCode.SUCCESS, response) - ) + response = get_all_packages(dbname) + return response # Database queries data and catches exceptions except DisconnectionError as dis_connection_error: current_app.logger.error(dis_connection_error) return jsonify( ResponseCode.response_json( ResponseCode.DIS_CONNECTION_DB)) + except (AttributeError, TypeError, Error) as attribute_error: + current_app.logger.error(attribute_error) + return jsonify( + ResponseCode.response_json( + ResponseCode.PACK_NAME_NOT_FOUND)) class SinglePack(Resource): @@ -125,29 +111,29 @@ class SinglePack(Resource): def get(self): """ - description: Searching a package info + Searching a package info + Args: dbName: Database name, not required parameter sourceName: Source code package name, must pass Returns: - { - "code": "", - "data": [ + for + examples:: { - "buildDep": [], - "dbname": "", - "downloadURL": "", - "license": "", - "maintainer": "", - "maintainlevel": "", - "sourceName": "", - "sourceURL": "", - "subpack": {}, - "version": "" - } - ], - "msg": "" - } + "code": "", + "data": [{ + "buildDep": [], + "dbname": "", + "license": "", + "maintainlevel": "", + "maintaniner": "", + "rpm_packager": "", + "sourceName": "", + "sourceURL": "", + "subpack": { }, + "version": ""}], + "msg": "" + } Raises: DisconnectionError: Unable to connect to database exception AttributeError: Object does not have this property @@ -166,29 +152,8 @@ class SinglePack(Resource): # Call method to query try: - dbpreority = db_priority() - if db_priority is None: - return jsonify( - ResponseCode.response_json(ResponseCode.FILE_NOT_FOUND) - ) - if not dbname: - response = [] - for dbname in dbpreority: - query_result = get_single_package(dbname, sourcename) - response.append(query_result) - return jsonify( - ResponseCode.response_json(ResponseCode.SUCCESS, response) - ) - - # Database queries data and catches exceptions - if dbname not in dbpreority: - return jsonify( - ResponseCode.response_json(ResponseCode.DB_NAME_ERROR) - ) - response = get_single_package(dbname, sourcename) - return jsonify( - ResponseCode.response_json(ResponseCode.SUCCESS, [response]) - ) + response = get_single(dbname, sourcename) + return response except DisconnectionError as dis_connection_error: current_app.logger.error(dis_connection_error) abnormal = ResponseCode.DIS_CONNECTION_DB @@ -201,18 +166,21 @@ class SinglePack(Resource): def put(self): """ - Description: update a package info, + update a package info, + Args: dbName: Database name,Parameters are required sourceName: The name of the source code package. Parameters are required maintainer: Maintainer, parameter not required maintainlevel: Maintenance level, parameter not required Returns: - { - "code": "", - "data": "", - "msg": "" - } + for + example:: + { + "code": "", + "data": "", + "msg": "" + } Raises: DisconnectionError: Unable to connect to database exception AttributeError: Object does not have this property @@ -242,24 +210,24 @@ class SinglePack(Resource): ResponseCode.response_json(ResponseCode.DB_NAME_ERROR) ) # Database queries data and catches exceptions + try: - update_single_package( - sourcename, dbname, maintainer, maintain_level) - update_maintaniner_info( + result_data = _update_package_info( sourcename, dbname, maintainer, maintain_level) + if result_data is False: + return jsonify( + ResponseCode.response_json( + ResponseCode.PACK_NAME_NOT_FOUND)) return jsonify( - ResponseCode.response_json(ResponseCode.SUCCESS) - ) + ResponseCode.response_json(ResponseCode.SUCCESS)) except DisconnectionError as dis_connection_error: current_app.logger.error(dis_connection_error) - return jsonify( - ResponseCode.response_json( - ResponseCode.DIS_CONNECTION_DB)) + abnormal = ResponseCode.DIS_CONNECTION_DB except (AttributeError, TypeError, Error) as attri_error: current_app.logger.error(attri_error) - return jsonify( - ResponseCode.response_json(ResponseCode.PACK_NAME_NOT_FOUND) - ) + abnormal = ResponseCode.CONNECT_DB_ERROR + if abnormal is not None: + return jsonify(ResponseCode.response_json(abnormal)) class InstallDepend(Resource): @@ -271,12 +239,13 @@ class InstallDepend(Resource): def post(self): """ - Description: Query a package's install depend(support - querying in one or more databases) - input: + Query a package's install depend(support + querying in one or more databases) + + Args: binaryName dbPreority: the array for database preority - return: + Returns: resultDict{ binary_name: //binary package name [ @@ -347,18 +316,21 @@ class BuildDepend(Resource): def post(self): """ - Description: Query a package's build depend and - build depend package's install depend - (support querying in one or more databases) + Query a package's build depend and + build depend package's install depend + (support querying in one or more databases) + Args: sourceName :name of the source package dbPreority:the array for database preority Returns: - { - "code": "", - "data": "", - "msg": "" - } + for + example:: + { + "code": "", + "data": "", + "msg": "" + } Raises: """ schema = BuildDependSchema() @@ -409,8 +381,9 @@ class SelfDepend(Resource): def post(self): """ - Description: Query a package's all dependencies including install and build depend - (support quering a binary or source package in one or more databases) + Query a package's all dependencies including install and build depend + (support quering a binary or source package in one or more databases) + Args: packageName:package name packageType: source/binary @@ -418,12 +391,13 @@ class SelfDepend(Resource): withSubpack: 0/1 dbPreority:the array for database preority Returns: - { - "code": "", - "data": "", - "msg": "" - } - Raises: + for + example:: + { + "code": "", + "data": "", + "msg": "" + } """ schema = SelfDependSchema() @@ -482,25 +456,26 @@ class BeDepend(Resource): def post(self): """ - description: Query a package's all dependencies including - be installed and built depend + Query a package's all dependencies including + be installed and built depend + Args: packageName:package name withSubpack: 0/1 dbname:database name Returns: - resultList[ - restult[ - binaryName: - srcName: - dbName: - type: beinstall or bebuild, which depend on the function - childNode: the binary package name which is the be built/installed - depend for binaryName + for + example:: + resultList[ + restult[ + binaryName: + srcName: + dbName: + type: beinstall or bebuild, which depend on the function + childNode: the binary package name which is the be built/installed + depend for binaryName + ] ] - ] - exception: - changeLog: """ schema = BeDependSchema() data = request.get_json() @@ -542,20 +517,22 @@ class Repodatas(Resource): def get(self): """ - description: get all database - Args: + get all database + Returns: - { - "code": "", - "data": [ - { - "database_name": "", - "priority": "", - "status": "" - } - ], - "msg": "" - } + for + example:: + { + "code": "", + "data": [ + { + "database_name": "", + "priority": "", + "status": "" + } + ], + "msg": "" + } Raises: FileNotFoundError: File not found exception TypeError: Exception of wrong type @@ -583,14 +560,16 @@ class Repodatas(Resource): def delete(self): """ - description: get all database - Args: + get all database + Returns: - { - "code": "", - "data": "", - "msg": "" - } + for + example:: + { + "code": "", + "data": "", + "msg": "" + } Raises: FileNotFoundError: File not found exception, TypeError: Exception of wrong type @@ -614,7 +593,10 @@ class Repodatas(Resource): ) try: drop_db = InitDataBase() - drop_db.delete_db(db_name) + del_result = drop_db.delete_db(db_name) + if del_result is False: + return jsonify( + ResponseCode.response_json(ResponseCode.DELETE_DB_ERROR)) return jsonify( ResponseCode.response_json(ResponseCode.SUCCESS) ) @@ -634,14 +616,16 @@ class InitSystem(Resource): def post(self): """ - description: InitSystem - Args: + InitSystem + Returns: - { - "code": "", - "data": "", - "msg": "" - } + for + example:: + { + "code": "", + "data": "", + "msg": "" + } Raises: ContentNoneException: Unable to connect to the exception of the database DisconnectionError:Exception connecting to database @@ -686,4 +670,9 @@ class InitSystem(Resource): abnormal = ResponseCode.FAILED_CREATE_DATABASE_TABLE if abnormal is not None: return jsonify(ResponseCode.response_json(abnormal)) + db_list = db_priority() + if db_list is None: + return jsonify( + ResponseCode.response_json( + ResponseCode.FAILED_CREATE_DATABASE_TABLE)) return jsonify(ResponseCode.response_json(ResponseCode.SUCCESS)) diff --git a/packageship/packageship/pkgship.py b/packageship/packageship/pkgship.py index 95b16486..290ac3cb 100644 --- a/packageship/packageship/pkgship.py +++ b/packageship/packageship/pkgship.py @@ -621,7 +621,7 @@ class UpdatePackageCommand(PkgshipCommand): Raises: ConnectionError: Request connection error """ - _url = self.write_host + '/packages/findByPackName' + _url = self.write_host + '/packages/packageInfo' try: response = requests.put( _url, data=json.dumps({'sourceName': params.packagename, @@ -1196,7 +1196,7 @@ class SingleCommand(PkgshipCommand): ConnectionError: requests connection error """ _url = self.read_host + \ - '/packages/findByPackName?dbName={db_name}&sourceName={packagename}' \ + '/packages/packageInfo?dbName={db_name}&sourceName={packagename}' \ .format(db_name=params.db, packagename=params.packagename) try: response = requests.get(_url) -- Gitee From 554a18fb1b17e1cca18574db48a6268d8ebe5e80 Mon Sep 17 00:00:00 2001 From: Yiru Wang Mac Date: Thu, 30 Jul 2020 11:42:27 +0800 Subject: [PATCH 3/8] fix database init failed problem --- .../apps/package/function/searchdb.py | 4 ++-- .../apps/package/function/self_depend.py | 16 ++++++++-------- .../application/initsystem/data_import.py | 2 +- packageship/packageship/pkgshipd | 3 ++- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/packageship/packageship/application/apps/package/function/searchdb.py b/packageship/packageship/application/apps/package/function/searchdb.py index 3804a556..b8a91112 100644 --- a/packageship/packageship/application/apps/package/function/searchdb.py +++ b/packageship/packageship/application/apps/package/function/searchdb.py @@ -123,7 +123,7 @@ class SearchDB(): get_list.clear() search_set.symmetric_difference_update(get_set) if not search_set: - install_result = self.get_install_pro_in_other_database(provides_not_found) + install_result = self._get_install_pro_in_other_database(provides_not_found) result_list.extend(install_result) return result_list else: @@ -132,7 +132,7 @@ class SearchDB(): LOGGER.logger.error(error_msg) except SQLAlchemyError as error_msg: LOGGER.logger.error(error_msg) - install_result = self.get_install_pro_in_other_database(provides_not_found) + install_result = self._get_install_pro_in_other_database(provides_not_found) result_list.extend(install_result) for binary_name in search_set: result_list.append((return_tuple(None, None, None, diff --git a/packageship/packageship/application/apps/package/function/self_depend.py b/packageship/packageship/application/apps/package/function/self_depend.py index e63d97c7..54def449 100644 --- a/packageship/packageship/application/apps/package/function/self_depend.py +++ b/packageship/packageship/application/apps/package/function/self_depend.py @@ -213,14 +213,14 @@ class SelfDepend(): continue if key not in self.binary_dict.dictionary and values[0] != 'source': self.binary_dict.dictionary[key] = copy.deepcopy(values) - if self.withsubpack == 1: - source_name = values[ListNode.SOURCE_NAME] - if not source_name: - LOGGER.logger.warning("source name is None") - if source_name and source_name not in self.source_dicts.dictionary: - self.source_dicts.append_src(key=source_name, - dbname=values[ListNode.DBNAME], - version=values[ListNode.VERSION]) + source_name = values[ListNode.SOURCE_NAME] + if not source_name: + LOGGER.logger.warning("source name is None") + if source_name and source_name not in self.source_dicts.dictionary: + self.source_dicts.append_src(key=source_name, + dbname=values[ListNode.DBNAME], + version=values[ListNode.VERSION]) + if self.withsubpack == 1: self.search_subpack_list.append(source_name) elif key in self.binary_dict.dictionary: self.binary_dict.update_value(key=key, parent_list=values[ListNode.PARENT_LIST]) diff --git a/packageship/packageship/application/initsystem/data_import.py b/packageship/packageship/application/initsystem/data_import.py index 5d0dd0e6..03f1e7ea 100644 --- a/packageship/packageship/application/initsystem/data_import.py +++ b/packageship/packageship/application/initsystem/data_import.py @@ -200,7 +200,7 @@ class InitDataBase(): raise ContentNoneException( 'The path to the sqlite file in the database initialization configuration \ is incorrect ') - if os.path.exists(src_db_file) or os.path.exists(bin_db_file): + if not os.path.exists(src_db_file) or not os.path.exists(bin_db_file): raise FileNotFoundError("sqlite file {src} or {bin} does not exist, please \ check and try again".format(src=src_db_file, bin=bin_db_file)) # 3. Obtain temporary source package files and binary package files diff --git a/packageship/packageship/pkgshipd b/packageship/packageship/pkgshipd index a6d2847e..a2e39a4f 100755 --- a/packageship/packageship/pkgshipd +++ b/packageship/packageship/pkgshipd @@ -20,7 +20,8 @@ function create_config_file(){ buffer_size=$(get_config "$service" "buffer-size") http_timeout=$(get_config "$service" "http-timeout") harakiri=$(get_config "$service" "harakiri") - wsgi_file_path=$(find /usr/lib/ -name "packageship") + wsgi_file_path=$(find /usr/lib/ -name "packageship" | head -n 1) + echo "[INFO] run packageship under path: $wsgi_file_path" if [ $service = "manage" -o $service = "all" ];then write_port=$(get_config "$service" "write_port") write_ip_addr=$(get_config "$service" "write_ip_addr") -- Gitee From cc3ce6bb7955232eaf800a42a95a1c715f02f9ac Mon Sep 17 00:00:00 2001 From: Yiru Wang Mac Date: Thu, 30 Jul 2020 12:10:52 +0800 Subject: [PATCH 4/8] fix conflict --- packageship/packageship/application/initsystem/data_import.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packageship/packageship/application/initsystem/data_import.py b/packageship/packageship/application/initsystem/data_import.py index 9c983770..03f1e7ea 100644 --- a/packageship/packageship/application/initsystem/data_import.py +++ b/packageship/packageship/application/initsystem/data_import.py @@ -200,11 +200,7 @@ class InitDataBase(): raise ContentNoneException( 'The path to the sqlite file in the database initialization configuration \ is incorrect ') -<<<<<<< HEAD if not os.path.exists(src_db_file) or not os.path.exists(bin_db_file): -======= - if os.path.exists(src_db_file) or os.path.exists(bin_db_file): ->>>>>>> dec3661c6c56512ebee173dc68694716d8c6b041 raise FileNotFoundError("sqlite file {src} or {bin} does not exist, please \ check and try again".format(src=src_db_file, bin=bin_db_file)) # 3. Obtain temporary source package files and binary package files -- Gitee From f7df6e88542422bab35dd2afc0511c87cac9c72e Mon Sep 17 00:00:00 2001 From: Yiru Wang Mac Date: Thu, 30 Jul 2020 20:58:48 +0800 Subject: [PATCH 5/8] add require in spec file --- .../packageship/application/apps/package/function/packages.py | 4 ++-- packageship/pkgship.spec | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packageship/packageship/application/apps/package/function/packages.py b/packageship/packageship/application/apps/package/function/packages.py index 7098ec4b..5bf347d6 100644 --- a/packageship/packageship/application/apps/package/function/packages.py +++ b/packageship/packageship/application/apps/package/function/packages.py @@ -45,7 +45,7 @@ def get_packages(dbname): package["license"] = src_pack_obj.rpm_license package["sourceURL"] = src_pack_obj.url package["rpm_packager"] = src_pack_obj.rpm_packager - package["maintaniner"] = src_pack_obj.maintaniner + package["maintainer"] = src_pack_obj.maintaniner package["maintainlevel"] = src_pack_obj.maintainlevel package["dbname"] = dbname resp_list.append(package) @@ -194,7 +194,7 @@ def get_single_package(dbname, sourcename): package["license"] = src_pack_obj.rpm_license package["sourceURL"] = src_pack_obj.url package["rpm_packager"] = src_pack_obj.rpm_packager - package["maintaniner"] = src_pack_obj.maintaniner + package["maintainer"] = src_pack_obj.maintaniner package["maintainlevel"] = src_pack_obj.maintainlevel package["dbname"] = dbname src_pack_pkgkey = src_pack_obj.pkgKey diff --git a/packageship/pkgship.spec b/packageship/pkgship.spec index c85191d2..1e8d3c15 100644 --- a/packageship/pkgship.spec +++ b/packageship/pkgship.spec @@ -10,7 +10,7 @@ BuildArch: noarch Requires: python3-pip python3-flask-restful python3-flask python3 python3-pyyaml Requires: python3-sqlalchemy python3-prettytable python3-requests -#Requires: pyinstaller python3-flask-session python3-flask-script marshmallow uwsig +Requires: pyinstaller python3-flask-session python3-flask-script marshmallow uwsig %description Pkgship implements rpm package dependence ,maintainer, patch query and so no. -- Gitee From 846cc81d90d3c4d31063c03773ecb663e4b3062b Mon Sep 17 00:00:00 2001 From: Yiru Wang Mac Date: Thu, 30 Jul 2020 21:21:36 +0800 Subject: [PATCH 6/8] modify maintainer spelling --- .../packageship/application/apps/package/function/packages.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packageship/packageship/application/apps/package/function/packages.py b/packageship/packageship/application/apps/package/function/packages.py index 7098ec4b..5bf347d6 100644 --- a/packageship/packageship/application/apps/package/function/packages.py +++ b/packageship/packageship/application/apps/package/function/packages.py @@ -45,7 +45,7 @@ def get_packages(dbname): package["license"] = src_pack_obj.rpm_license package["sourceURL"] = src_pack_obj.url package["rpm_packager"] = src_pack_obj.rpm_packager - package["maintaniner"] = src_pack_obj.maintaniner + package["maintainer"] = src_pack_obj.maintaniner package["maintainlevel"] = src_pack_obj.maintainlevel package["dbname"] = dbname resp_list.append(package) @@ -194,7 +194,7 @@ def get_single_package(dbname, sourcename): package["license"] = src_pack_obj.rpm_license package["sourceURL"] = src_pack_obj.url package["rpm_packager"] = src_pack_obj.rpm_packager - package["maintaniner"] = src_pack_obj.maintaniner + package["maintainer"] = src_pack_obj.maintaniner package["maintainlevel"] = src_pack_obj.maintainlevel package["dbname"] = dbname src_pack_pkgkey = src_pack_obj.pkgKey -- Gitee From b1e2bd23acf58f307efac4448a08f234b5a56179 Mon Sep 17 00:00:00 2001 From: Yiru Wang Mac Date: Thu, 30 Jul 2020 21:24:13 +0800 Subject: [PATCH 7/8] commit requirement in spec file --- packageship/pkgship.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packageship/pkgship.spec b/packageship/pkgship.spec index 1e8d3c15..c85191d2 100644 --- a/packageship/pkgship.spec +++ b/packageship/pkgship.spec @@ -10,7 +10,7 @@ BuildArch: noarch Requires: python3-pip python3-flask-restful python3-flask python3 python3-pyyaml Requires: python3-sqlalchemy python3-prettytable python3-requests -Requires: pyinstaller python3-flask-session python3-flask-script marshmallow uwsig +#Requires: pyinstaller python3-flask-session python3-flask-script marshmallow uwsig %description Pkgship implements rpm package dependence ,maintainer, patch query and so no. -- Gitee From 15b0a7cd0aa171787ff79e15869bb7649fa5db6c Mon Sep 17 00:00:00 2001 From: Yiru Wang Mac Date: Fri, 31 Jul 2020 17:11:33 +0800 Subject: [PATCH 8/8] add Require in pkgship.spec --- packageship/pkgship.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packageship/pkgship.spec b/packageship/pkgship.spec index c85191d2..7ad4f21a 100644 --- a/packageship/pkgship.spec +++ b/packageship/pkgship.spec @@ -10,7 +10,7 @@ BuildArch: noarch Requires: python3-pip python3-flask-restful python3-flask python3 python3-pyyaml Requires: python3-sqlalchemy python3-prettytable python3-requests -#Requires: pyinstaller python3-flask-session python3-flask-script marshmallow uwsig +Requires: python-PyInstaller python3-flask-session python3-flask-script python3-marshmallow uwsgi %description Pkgship implements rpm package dependence ,maintainer, patch query and so no. -- Gitee