private static void UpdateBuildLogDB (DB db, DBLane lane, List<DBHost> hosts, List<DBHostLane> hostlanes) { List<DBRevision> revisions; List<DBCommand> commands = null; List<DBLaneDependency> dependencies = null; DBHostLane hostlane; DBWork work; bool got_dependencies = false; bool got_commands = false; try { Logger.Log ("Updating build db log... Got {0} hosts", hosts.Count); foreach (DBHost host in hosts) { hostlane = null; for (int i = 0; i < hostlanes.Count; i++) { if (hostlanes [i].lane_id == lane.id && hostlanes [i].host_id == host.id) { hostlane = hostlanes [i]; break; } } if (hostlane == null) { Logger.Log ("Lane '{0}' is not configured for host '{1}', not adding any work.", lane.lane, host.host); continue; } else if (!hostlane.enabled) { Logger.Log ("Lane '{0}' is disabled for host '{1}', not adding any work.", lane.lane, host.host); continue; } AddRevisionWork (db, lane, host); revisions = db.GetDBRevisionsWithoutWork (lane.id, host.id); Logger.Log ("Updating build db log... Got {0} revisions for host {1}", revisions.Count, host.host); foreach (DBRevision revision in revisions) { bool dependencies_satisfied = true; if (!got_commands) { commands = db.GetCommands (lane.id); got_commands = true; } if (!got_dependencies) { dependencies = DBLaneDependency_Extensions.GetDependencies (db, lane); got_dependencies = true; } if (dependencies != null) { Logger.Log ("Lane '{0}', revision '{1}' checking dependencies...", lane.lane, revision.revision); foreach (DBLaneDependency dependency in dependencies) dependencies_satisfied &= dependency.IsSuccess (db, revision.revision); Logger.Log ("Lane '{0}', revision '{1}' dependency checking resulted in: {2}.", lane.lane, revision.revision, dependencies_satisfied); } int revisionwork_id; bool pending_dependencies; using (IDbCommand cmd = db.CreateCommand ()) { cmd.CommandText = "SELECT add_revisionwork (@lane_id, @host_id, @revision_id);"; DB.CreateParameter (cmd, "lane_id", lane.id); DB.CreateParameter (cmd, "host_id", host.id); DB.CreateParameter (cmd, "revision_id", revision.id); revisionwork_id = (int) cmd.ExecuteScalar (); } using (IDbCommand cmd = db.CreateCommand ()) { cmd.CommandText = "SELECT state FROM RevisionWork WHERE id = @id;"; DB.CreateParameter (cmd, "id", revisionwork_id); pending_dependencies = (int) DBState.DependencyNotFulfilled == (int) cmd.ExecuteScalar (); } if (pending_dependencies && !dependencies_satisfied) continue; Logger.Log ("Pending dependencies: {0}", pending_dependencies); foreach (DBCommand command in commands) { work = null; if (pending_dependencies) { using (IDbCommand cmd = db.CreateCommand ()) { cmd.CommandText = "SELECT * FROM Work WHERE revisionwork_id = @revisionwork_id AND command_id = @command_id;"; DB.CreateParameter (cmd, "revisionwork_id", revisionwork_id); DB.CreateParameter (cmd, "command_id", command.id); using (IDataReader reader = cmd.ExecuteReader ()) { if (reader.Read ()) work = new DBWork (reader); } } } if (work == null) { work = new DBWork (); work.command_id = command.id; work.revisionwork_id = revisionwork_id; } work.State = dependencies_satisfied ? DBState.NotDone : DBState.DependencyNotFulfilled; work.Save (db); Logger.Log ("Saved revision {0}, host {2}, command {1}", revision.revision, command.command, host.host); } if (!dependencies_satisfied) { db.ExecuteScalar (string.Format ("UPDATE RevisionWork SET state = 9 WHERE id = {0} AND state = 0;", revisionwork_id)); } else { db.ExecuteScalar (string.Format ("UPDATE RevisionWork SET state = 0 WHERE id = {0} AND state = 9;", revisionwork_id)); } } } } catch (Exception ex) { Logger.Log ("There was an exception while updating build db: {0}", ex.ToString ()); } Logger.Log ("Updating build db log... [Done]"); }