diff --git a/airtime_mvc/application/common/Database.php b/airtime_mvc/application/common/Database.php index 2c61bc589..bb9557474 100644 --- a/airtime_mvc/application/common/Database.php +++ b/airtime_mvc/application/common/Database.php @@ -2,9 +2,11 @@ class Application_Common_Database { public static function prepareAndExecute($sql, array $paramValueMap, - $type='all', $fetchType=PDO::FETCH_ASSOC) + $type='all', $fetchType=PDO::FETCH_ASSOC, $con=null) { - $con = Propel::getConnection(); + if (is_null($con)) { + $con = Propel::getConnection(); + } $stmt = $con->prepare($sql); foreach ($paramValueMap as $param => $v) { $stmt->bindValue($param, $v); diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index f2eeee8a4..6cba9814c 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -11,6 +11,9 @@ class Application_Model_Preference private static function setValue($key, $value, $isUserValue = false, $userId = null) { try { + $con = Propel::getConnection(CcPrefPeer::DATABASE_NAME); + $con->beginTransaction(); + //called from a daemon process if (!class_exists("Zend_Auth", false) || !Zend_Auth::getInstance()->hasIdentity()) { $id = NULL; @@ -35,10 +38,18 @@ class Application_Model_Preference $paramMap[':id'] = $userId; } - $result = Application_Common_Database::prepareAndExecute($sql, $paramMap, 'column'); + $result = Application_Common_Database::prepareAndExecute($sql, + $paramMap, + 'column', + PDO::FETCH_ASSOC, + $con); $paramMap = array(); - if ($result == 1) { + if ($result > 1) { + //this case should not happen. + throw new Exception("Invalid number of results returned. Should be ". + "0 or 1, but is '$result' instead"); + } elseif ($result == 1) { // result found if (is_null($id) || !$isUserValue) { // system pref @@ -76,11 +87,17 @@ class Application_Model_Preference $paramMap[':key'] = $key; $paramMap[':value'] = $value; - Application_Common_Database::prepareAndExecute($sql, $paramMap, 'execute'); + Application_Common_Database::prepareAndExecute($sql, + $paramMap, + 'execute', + PDO::FETCH_ASSOC, + $con); + $con->commit(); } catch (Exception $e) { + $con->rollback(); header('HTTP/1.0 503 Service Unavailable'); - Logging::info("Could not connect to database: ".$e->getMessage()); + Logging::info("Database error: ".$e->getMessage()); exit; } diff --git a/airtime_mvc/application/models/Scheduler.php b/airtime_mvc/application/models/Scheduler.php index 7f6272cee..e3f263360 100644 --- a/airtime_mvc/application/models/Scheduler.php +++ b/airtime_mvc/application/models/Scheduler.php @@ -557,6 +557,7 @@ class Application_Model_Scheduler */ $instances = $this->getInstances($schedule["instance"]); foreach($instances as $instance) { + $linked = $instance->getCcShow()->isLinked(); if ($id !== 0) { $schedItem = CcScheduleQuery::create()->findPK($id, $this->con); /* We use the selected cursor's position to find the same @@ -609,12 +610,31 @@ class Application_Model_Scheduler $filesToInsert = array_merge($filesToInsert, $this->retrieveMediaFiles($media["id"], $media["type"])); } } + foreach ($filesToInsert as $file) { //item existed previously and is being moved. //need to keep same id for resources if we want REST. if (isset($file['sched_id'])) { $sched = CcScheduleQuery::create()->findPk($file["sched_id"]); + /* We need to keep a record of the original positon a track + * is being moved from so we can use it to retrieve the correct + * items in linked instances + */ + if (!isset($originalPosition)) { + $originalPosition = $sched->getDbPosition(); + } + + /* If we are moving an item in a linked show we need to get + * the relative item to move in each instance. We know what the + * relative item is by its position + */ + if ($linked && $moveAction) { + $sched = CcScheduleQuery::create() + ->filterByDbInstanceId($instance->getDbId()) + ->filterByDbPosition($originalPosition) + ->findOne(); + } $excludeIds[] = intval($sched->getDbId()); $file["cliplength"] = $sched->getDbClipLength(); @@ -694,7 +714,6 @@ class Application_Model_Scheduler //recalculate the start/end times after the inserted items. foreach ($followingSchedItems as $item) { $endTimeDT = $this->findEndTime($nextStartDT, $item->getDbClipLength()); - $item->setDbStarts($nextStartDT); $item->setDbEnds($endTimeDT); $item->setDbPosition($pos); diff --git a/airtime_mvc/application/services/ShowService.php b/airtime_mvc/application/services/ShowService.php index 32aeb5da9..dab59e4d9 100644 --- a/airtime_mvc/application/services/ShowService.php +++ b/airtime_mvc/application/services/ShowService.php @@ -976,7 +976,7 @@ SQL; $this->createRebroadcastInstances($showDay, $date, $ccShowInstance->getDbId()); } } - $start = $this->getNextMonthlyMonthlyRepeatDate($start, $timezone); + $start = $this->getNextMonthlyMonthlyRepeatDate($start, $timezone, $showDay->getDbStartTime()); } $this->setNextRepeatingShowDate($start->format("Y-m-d"), $day, $show_id); } @@ -1034,7 +1034,7 @@ SQL; * Enter description here ... * @param $start */ - private function getNextMonthlyMonthlyRepeatDate($start, $timezone) + private function getNextMonthlyMonthlyRepeatDate($start, $timezone, $startTime) { $dt = new DateTime($start->format("Y-m"), new DateTimeZone($timezone)); do { @@ -1042,6 +1042,12 @@ SQL; } while (!checkdate($dt->format("m"), $start->format("d"), $dt->format("Y"))); $dt->setDate($dt->format("Y"), $dt->format("m"), $start->format("d")); + + $startTime = explode(":", $startTime); + $hours = isset($startTime[0]) ? $startTime[0] : "00"; + $minutes = isset($startTime[1]) ? $startTime[1] : "00"; + $seconds = isset($startTime[2]) ? $startTime[2] : "00"; + $dt->setTime($hours, $minutes, $seconds); return $dt; } diff --git a/install_minimal/include/AirtimeIni.php b/install_minimal/include/AirtimeIni.php index 8d631f8e4..c774c20a2 100644 --- a/install_minimal/include/AirtimeIni.php +++ b/install_minimal/include/AirtimeIni.php @@ -214,6 +214,57 @@ class AirtimeIni fclose($fp); } + //stupid hack found on http://stackoverflow.com/a/1268642/276949 + //with some modifications: 1) Spaces are inserted in between sections and + //2) numeric values are not quoted. + public static function write_ini_file($assoc_arr, $path, $has_sections = false) { + $content = ""; + + if ($has_sections) { + $first_line = true; + foreach ($assoc_arr as $key=>$elem) { + if ($first_line) { + $content .= "[".$key."]\n"; + $first_line = false; + } else { + $content .= "\n[".$key."]\n"; + } + foreach ($elem as $key2=>$elem2) { + if(is_array($elem2)) + { + for($i=0;$i$elem) { + if(is_array($elem)) + { + for($i=0;$i 1: + self.logger.error("end - start length: %s", length1) + self.logger.error("cue_out - cue_in length: %s", length2) + self.logger.error("Two lengths are not equal!!!") + def is_file_opened(self, path): #Capture stderr to avoid polluting py-interpreter.log proc = Popen(["lsof", path], stdout=PIPE, stderr=PIPE)