#!/bin/bash
master() {
	if (( active >= concurrency)) || [ -n "$quit" ]
	then
		sleep 0.1
	else
		echo '
			SELECT	COUNT(*)
			FROM	tasks
			WHERE	status = 0;
		'>&3

		read -u4 -r -d $'\0' remaining
		if (( remaining == 0 ))
		then
			sleep 0.1
			return 0
		fi

		until (( active == concurrency || remaining == 0 ))
		do
			echo '
				SELECT	COUNT(*)
				FROM	tasks
				WHERE	status = 0
				AND	requires IN (
						SELECT	id
						FROM	tasks
						WHERE	status = 4
					);

				SELECT
					id,
					source_file,
					cmd_arg0,
					cmd_arg1,
					cmd_arg2,
					cmd_arg3,
					cmd_arg4,
					cmd_arg5,
					cmd_arg6,
					cmd_arg7,
					cmd_arg8,
					cmd_arg9,
					cmd_arg10,
					cmd_arg11,
					cmd_arg12,
					cmd_arg13,
					cmd_arg14,
					cmd_arg15,
					cmd_arg16,
					cmd_arg17,
					cmd_arg18,
					cmd_arg19,
					cmd_arg20,
					cmd_arg21,
					cmd_arg22,
					cmd_arg23,
					cmd_arg24,
					cmd_arg25,
					cmd_arg26,
					cmd_arg27,
					cmd_arg28,
					cmd_arg29,
					cmd_arg30,
					cmd_arg31,
					cmd_arg32,
					cmd_arg33,
					cmd_arg34,
					cmd_arg35,
					cmd_arg36,
					cmd_arg37,
					cmd_arg38,
					cmd_arg39,
					cmd_arg40,
					cmd_arg41,
					cmd_arg42,
					cmd_arg43,
					cmd_arg44,
					cmd_arg45,
					cmd_arg46,
					cmd_arg47,
					cmd_arg48,
					cmd_arg49,
					cmd_arg50,
					cmd_arg51,
					cmd_arg52,
					cmd_arg53,
					cmd_arg54,
					cmd_arg55,
					cmd_arg56,
					cmd_arg57,
					cmd_arg58,
					cmd_arg59,
					cleanup,
					fileid,
					filename
				FROM	tasks
				WHERE	status = 0
				AND	requires IN (
						SELECT	id
						FROM	tasks
						WHERE	status = 4
						ORDER BY source_file
						/* LIMIT 1 */
					)
				ORDER BY source_file
				LIMIT 1;
			'>&3

			read -u4 -r -d $'\0' ready
			if (( ready > 0 ))
			then
				createworker
				continue
			fi

			echo '
				SELECT	COUNT(*)
				FROM	tasks
				WHERE	status = 0
				AND	requires is NULL;

				SELECT
					id,
					source_file,
					cmd_arg0,
					cmd_arg1,
					cmd_arg2,
					cmd_arg3,
					cmd_arg4,
					cmd_arg5,
					cmd_arg6,
					cmd_arg7,
					cmd_arg8,
					cmd_arg9,
					cmd_arg10,
					cmd_arg11,
					cmd_arg12,
					cmd_arg13,
					cmd_arg14,
					cmd_arg15,
					cmd_arg16,
					cmd_arg17,
					cmd_arg18,
					cmd_arg19,
					cmd_arg20,
					cmd_arg21,
					cmd_arg22,
					cmd_arg23,
					cmd_arg24,
					cmd_arg25,
					cmd_arg26,
					cmd_arg27,
					cmd_arg28,
					cmd_arg29,
					cmd_arg30,
					cmd_arg31,
					cmd_arg32,
					cmd_arg33,
					cmd_arg34,
					cmd_arg35,
					cmd_arg36,
					cmd_arg37,
					cmd_arg38,
					cmd_arg39,
					cmd_arg40,
					cmd_arg41,
					cmd_arg42,
					cmd_arg43,
					cmd_arg44,
					cmd_arg45,
					cmd_arg46,
					cmd_arg47,
					cmd_arg48,
					cmd_arg49,
					cmd_arg50,
					cmd_arg51,
					cmd_arg52,
					cmd_arg53,
					cmd_arg54,
					cmd_arg55,
					cmd_arg56,
					cmd_arg57,
					cmd_arg58,
					cmd_arg59,
					cleanup,
					fileid,
					filename
				FROM	tasks
				WHERE	status = 0
				AND	requires is NULL
				ORDER BY source_file
				LIMIT 1;
			' >&3

			read -u4 -r -d $'\0' ready

			if (( active == 0 && ready == 0 ))
			then
				dumpfile="$tempdir/tasks-$(date -Iseconds).csv"
				cat <<-EOF


				$remaining TASKS LEFT, NONE READY!

				Something went wrong, dumping tasks table to $dumpfile
				EOF
				cat >&3 <<-EOSQL
				.mode csv
				.headers on
				.output $dumpfile
				SELECT * from tasks;
				.mode list
				.headers off
				.output stdout
				COMMIT;
				EOSQL
				closeDatabase
				echo "Waiting for children to come back home..."
				wait
				echo $'\nGood luck!'
				exit $ETASKLEFT
			elif (( ready == 0 ))
			then
				sleep 0.1
				break
			else
				createworker
			fi
			echo '
				SELECT	COUNT(*)
				FROM	tasks
				WHERE	status = 0;
			'>&3

			read -u4 -r -d $'\0' remaining
		done
	fi
}
