From 5ab4febaaaf402136a551a7ab9dbb154d47ed1af Mon Sep 17 00:00:00 2001 From: bcq <814063667@qq.com> Date: Mon, 20 Jul 2020 14:44:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=94=E5=AF=B9=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=8F=98=E6=9B=B4=EF=BC=8C=E5=AF=B9=E8=A2=AB?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E6=9F=A5=E8=AF=A2sql=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E5=81=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apps/package/function/be_depend.py | 112 +++++++++--------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/packageship/packageship/application/apps/package/function/be_depend.py b/packageship/packageship/application/apps/package/function/be_depend.py index 84654af7..da50f0d4 100644 --- a/packageship/packageship/application/apps/package/function/be_depend.py +++ b/packageship/packageship/application/apps/package/function/be_depend.py @@ -70,68 +70,54 @@ class BeDepend(): ] self.source_name_set.add(self.source_name) self.package_bedepend( - [src_obj.id], data_base, package_type='src') + [self.source_name], data_base, package_type='src') return self.result_dict - def package_bedepend(self, pkg_id_list, data_base, package_type): + def package_bedepend(self, pkg_name_list, data_base, package_type): """ Description: Query the dependent function Args: - pkg_id_list:source or binary packages id + pkg_name_list:source or binary packages name data_base: database package_type: package type Returns: Raises: SQLAlchemyError: Database connection exception """ - search_set = set(pkg_id_list) - id_in = literal_column('id').in_(search_set) + search_set = set(pkg_name_list) # package_type if package_type == 'src': - sql_str = text(""" - SELECT b1.name AS search_bin_name, - b1.version AS search_bin_version, - src.NAME AS source_name, - b2.name AS bin_name, - b2.id AS bin_id, - s1.name AS bebuild_src_name, - s1.id AS bebuild_src_id, - s2.name AS install_depend_src_name, - s2.id AS install_depend_src_id - FROM - ( SELECT id,NAME FROM src_pack WHERE {} ) src - LEFT JOIN bin_pack b1 ON b1.srcIDkey = src.id - LEFT JOIN pack_provides ON pack_provides.binIDkey = b1.id - LEFT JOIN pack_requires ON pack_requires.depProIDkey = pack_provides.id - LEFT JOIN src_pack s1 ON s1.id = pack_requires.srcIDkey - LEFT JOIN bin_pack b2 ON b2.id = pack_requires.binIDkey - LEFT JOIN src_pack s2 ON s2.id = b2.srcIDkey;""".format(id_in)) + name_in = literal_column('src_name').in_(search_set) if package_type == 'bin': - sql_str = text(""" - SELECT b1.name AS search_bin_name, - b1.version AS search_bin_version, - s3.NAME AS source_name, - b2.name AS bin_name, - b2.id AS bin_id, - s1.name AS bebuild_src_name, - s1.id AS bebuild_src_id, - s2.name AS install_depend_src_name, - s2.id AS install_depend_src_id - FROM - (SELECT id,NAME,version,srcIDkey FROM bin_pack WHERE {} ) b1 - LEFT JOIN src_pack s3 ON s3.id = b1.srcIDkey - LEFT JOIN pack_provides ON pack_provides.binIDkey = b1.id - LEFT JOIN pack_requires ON pack_requires.depProIDkey = pack_provides.id - LEFT JOIN src_pack s1 ON s1.id = pack_requires.srcIDkey - LEFT JOIN bin_pack b2 ON b2.id = pack_requires.binIDkey - LEFT JOIN src_pack s2 ON s2.id = b2.srcIDkey; - """.format(id_in)) + name_in = literal_column('name').in_(search_set) + + sql_str = text(""" + SELECT b1.name AS search_bin_name, + b1.version AS search_bin_version, + b1.src_name AS source_name, + b2.name AS bin_name, + s1.name AS bebuild_src_name, + b2.src_name AS install_depend_src_name + FROM ( SELECT pkgKey,src_name,name,version FROM bin_pack WHERE {} ) b1 + LEFT JOIN bin_provides ON bin_provides.pkgKey = b1.pkgKey + LEFT JOIN bin_requires br ON br.name = bin_provides.name + LEFT JOIN src_requires sr ON sr.name = bin_provides.name + LEFT JOIN src_pack s1 ON s1.pkgKey = sr.pkgKey + LEFT JOIN bin_pack b2 ON b2.pkgKey = br.pkgKey;""".format(name_in)) + try: - result = data_base.session.execute( - sql_str, { - 'id_{}'.format(i): v for i, v in enumerate( - search_set, 1)}).fetchall() + if package_type == 'src': + result = data_base.session.execute( + sql_str, { + 'src_name_{}'.format(i): v for i, v in enumerate( + search_set, 1)}).fetchall() + if package_type == 'bin': + result = data_base.session.execute( + sql_str, { + 'name_{}'.format(i): v for i, v in enumerate( + search_set, 1)}).fetchall() + except SQLAlchemyError as sql_err: current_app.logger.error(sql_err) return ResponseCode.response_json(ResponseCode.CONNECT_DB_ERROR) @@ -139,8 +125,8 @@ class BeDepend(): if result is None: return # Source and binary packages that were found to be dependent - source_id_list = [] - bin_id_list = [] + source_name_list = [] + bin_name_list = [] for obj in result: if obj.source_name is None: source_name = 'NOT FOUND' @@ -160,7 +146,7 @@ class BeDepend(): if obj.bebuild_src_name not in self.source_name_set: self.source_name_set.add(obj.bebuild_src_name) - source_id_list.append(obj.bebuild_src_id) + source_name_list.append(obj.bebuild_src_name) if obj.bin_name: # Determine if the bin package has been checked @@ -176,20 +162,34 @@ class BeDepend(): if obj.bin_name not in self.bin_name_set: self.bin_name_set.add(obj.bin_name) - bin_id_list.append(obj.bin_id) + bin_name_list.append(obj.bin_name) - # withsubpack=1 + # With_sub_pack=1 if self.with_sub_pack == "1": if obj.install_depend_src_name not in self.source_name_set: self.source_name_set.add( obj.install_depend_src_name) - source_id_list.append(obj.install_depend_src_id) + source_name_list.append( + obj.install_depend_src_name) - if len(source_id_list) != 0: + # Sqlite older versions default to a single query with a maximum of 999 + # parameters + if 0 < len(source_name_list) < 999: self.package_bedepend( - source_id_list, data_base, package_type="src") - if len(bin_id_list) != 0: - self.package_bedepend(bin_id_list, data_base, package_type="bin") + source_name_list, data_base, package_type="src") + elif len(source_name_list) >= 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): """ -- Gitee