Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/lib/mysql-functions
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2018-09-19 08:08:26 +0200
committerErich Eckner <git@eckner.net>2018-09-19 08:08:26 +0200
commitc3102a56ef285aee187a7f4350db1fdea23e1e42 (patch)
treeb60a0963625e2a0eac4a495376805f809e1583b6 /lib/mysql-functions
parent2845a46d435e80abd65c85e6059789f6bfe170ea (diff)
lib/mysql-functions: mysql_find_build_assignment_loops(): use awk, a tmp_file and load data local instead of bash, pipes and insert into
Diffstat (limited to 'lib/mysql-functions')
-rwxr-xr-xlib/mysql-functions165
1 files changed, 82 insertions, 83 deletions
diff --git a/lib/mysql-functions b/lib/mysql-functions
index c249a5f..51ca894 100755
--- a/lib/mysql-functions
+++ b/lib/mysql-functions
@@ -708,92 +708,91 @@ mysql_sanity_check() {
# mysql_find_build_assignment_loops
# recreate the `build_dependency_loops` table
mysql_find_build_assignment_loops() {
- {
- printf 'SELECT DISTINCT `architectures`.`id`'
- printf ' FROM `architectures`'
- printf ' WHERE `architectures`.`id`!=%s;\n' \
- "${architecture_ids__any}"
- } | \
- mysql_run_query | \
- while read -r arch_id; do
- {
- printf 'SELECT DISTINCT'
- printf ' `ncy_ba`.`id`,'
- printf '`nt_ba`.`id`'
- printf ' FROM `dependencies`'
- mysql_join_dependencies_dependency_types
- mysql_join_dependencies_install_target_providers_with_versions
- mysql_join_install_target_providers_binary_packages '' 'ncy_bp'
- mysql_join_dependencies_binary_packages '' 'nt_bp'
- for which in 'ncy' 'nt'; do
- mysql_join_binary_packages_binary_packages_in_repositories "${which}"'_bp' "${which}"'_bpir'
- mysql_join_binary_packages_build_assignments "${which}"'_bp' "${which}"'_ba'
- printf ' JOIN `architecture_compatibilities` AS `%s_ac`' \
- "${which}"
- printf ' ON `%s_ac`.`built_for`=`%s_ba`.`architecture`' \
- "${which}" "${which}"
- printf ' AND `%s_ac`.`runs_on`=%s' \
- "${which}" "${arch_id}"
- printf ' AND `%s_ac`.`fully_compatible`' \
- "${which}"
- done
- printf ' WHERE `nt_bpir`.`repository`=%s' \
- "${repository_ids__any_build_list}"
- printf ' AND `ncy_bpir`.`repository`=%s' \
- "${repository_ids__any_build_list}"
- printf ' AND `dependency_types`.`relevant_for_building`'
- printf ' AND ('
- printf '`dependency_types`.`relevant_for_binary_packages`'
- printf ' OR NOT EXISTS ('
- printf 'SELECT 1 FROM `binary_packages_in_repositories` AS `subst_bpir`'
- mysql_join_binary_packages_in_repositories_repositories 'subst_bpir' 'subst_r'
- printf ' AND `subst_r`.`is_on_master_mirror`'
- mysql_join_binary_packages_in_repositories_binary_packages 'subst_bpir' 'subst_bp'
- mysql_join_binary_packages_build_assignments 'subst_bp' 'subst_ba'
- printf ' JOIN `architecture_compatibilities` AS `subst_ac`'
- printf ' ON `subst_ac`.`built_for`=`subst_ba`.`architecture`'
- printf ' AND `subst_ac`.`runs_on`=%s' \
- "${arch_id}"
- printf ' AND `subst_ac`.`fully_compatible`'
- mysql_join_binary_packages_in_repositories_install_target_providers 'subst_bpir' 'subst_itp'
- mysql_join_install_target_providers_versions 'subst_itp' 'subst_itp_v'
- printf ' WHERE `subst_itp`.`install_target`=`dependencies`.`depending_on`'
- printf ' AND '
- mysql_query_ordering_correct \
- '`dependencies_versions`.`order`' \
- '`subst_itp_v`.`order`' \
- '`dependencies`.`version_relation`'
- printf ')'
- printf ');\n'
- } | \
- mysql_run_query | \
- tr '\t' ' ' | \
- tsort 2>&1 >/dev/null | \
- sed 's/^tsort:\s*//'
- done | \
+ ( # new shell is intentional
+ tmp_file=$(mktemp "tmp.mysql-functions.mysql_find_build_assignment_loops.XXXXXXXXXX")
+ trap 'rm "${tmp_file}"' EXIT
{
- loop=0
- while read -r id; do
- if [ "x${id}" = 'x-: input contains a loop:' ]; then
- loop=$((loop+1))
- continue
- fi
- if ! printf '%s' "${id}" | tr '\n' ' ' | grep -q '^[0-9]\+$'; then
- >&2 printf 'ERROR: non-numeric id "%s"\n' "${id}"
- continue
- fi
- printf '(%s,%s),\n' "${loop}" "${id}"
+ printf 'SELECT DISTINCT `architectures`.`id`'
+ printf ' FROM `architectures`'
+ printf ' WHERE `architectures`.`id`!=%s;\n' \
+ "${architecture_ids__any}"
+ } | \
+ mysql_run_query | \
+ while read -r arch_id; do
+ {
+ printf 'SELECT DISTINCT'
+ printf ' `ncy_ba`.`id`,'
+ printf '`nt_ba`.`id`'
+ printf ' FROM `dependencies`'
+ mysql_join_dependencies_dependency_types
+ mysql_join_dependencies_install_target_providers_with_versions
+ mysql_join_install_target_providers_binary_packages '' 'ncy_bp'
+ mysql_join_dependencies_binary_packages '' 'nt_bp'
+ for which in 'ncy' 'nt'; do
+ mysql_join_binary_packages_binary_packages_in_repositories "${which}"'_bp' "${which}"'_bpir'
+ mysql_join_binary_packages_build_assignments "${which}"'_bp' "${which}"'_ba'
+ printf ' JOIN `architecture_compatibilities` AS `%s_ac`' \
+ "${which}"
+ printf ' ON `%s_ac`.`built_for`=`%s_ba`.`architecture`' \
+ "${which}" "${which}"
+ printf ' AND `%s_ac`.`runs_on`=%s' \
+ "${which}" "${arch_id}"
+ printf ' AND `%s_ac`.`fully_compatible`' \
+ "${which}"
+ done
+ printf ' WHERE `nt_bpir`.`repository`=%s' \
+ "${repository_ids__any_build_list}"
+ printf ' AND `ncy_bpir`.`repository`=%s' \
+ "${repository_ids__any_build_list}"
+ printf ' AND `dependency_types`.`relevant_for_building`'
+ printf ' AND ('
+ printf '`dependency_types`.`relevant_for_binary_packages`'
+ printf ' OR NOT EXISTS ('
+ printf 'SELECT 1 FROM `binary_packages_in_repositories` AS `subst_bpir`'
+ mysql_join_binary_packages_in_repositories_repositories 'subst_bpir' 'subst_r'
+ printf ' AND `subst_r`.`is_on_master_mirror`'
+ mysql_join_binary_packages_in_repositories_binary_packages 'subst_bpir' 'subst_bp'
+ mysql_join_binary_packages_build_assignments 'subst_bp' 'subst_ba'
+ printf ' JOIN `architecture_compatibilities` AS `subst_ac`'
+ printf ' ON `subst_ac`.`built_for`=`subst_ba`.`architecture`'
+ printf ' AND `subst_ac`.`runs_on`=%s' \
+ "${arch_id}"
+ printf ' AND `subst_ac`.`fully_compatible`'
+ mysql_join_binary_packages_in_repositories_install_target_providers 'subst_bpir' 'subst_itp'
+ mysql_join_install_target_providers_versions 'subst_itp' 'subst_itp_v'
+ printf ' WHERE `subst_itp`.`install_target`=`dependencies`.`depending_on`'
+ printf ' AND '
+ mysql_query_ordering_correct \
+ '`dependencies_versions`.`order`' \
+ '`subst_itp_v`.`order`' \
+ '`dependencies`.`version_relation`'
+ printf ')'
+ printf ');\n'
+ } | \
+ mysql_run_query | \
+ tr '\t' ' ' | \
+ tsort 2>&1 >/dev/null | \
+ sed 's/^tsort:\s*//'
done | \
- sed '
- 1~20 i INSERT INTO `build_dependency_loops` (`loop`,`build_assignment`) VALUES ''
- 0~20 s/,$/;/
- $ s/,$/;/
- '
+ awk '
+ BEGIN {
+ i=0
+ };
+ /^-: input contains a loop:$/ {
+ i=i+1
+ };
+ !/^-: input contains a loop:$/ {
+ print i "\t" $1
+ }
+ ' > \
+ "${tmp_file}"
+ {
+ printf 'DELETE FROM `build_dependency_loops`;\n'
+ printf 'LOAD DATA LOCAL INFILE "%s" INTO TABLE `build_assignments_loops` (`loop`,`build_assignment`);\n' \
+ "${tmp_file}"
} | \
- sed '
- 1 i DELETE FROM `build_dependency_loops`;
- ' | \
- mysql_run_query
+ mysql_run_query
+ )
}
# mysql_cleanup [dry]