From 92f6ec029fef3c4b78aca2585c06c8da65804e3e Mon Sep 17 00:00:00 2001 From: denise Date: Tue, 7 May 2013 14:49:24 -0400 Subject: [PATCH 1/6] CC-5079: Timeline -> Moving items in linked shows doesn't work --- airtime_mvc/application/models/Scheduler.php | 21 +++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) 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); From 3ae3c7e802cec08ae3a204a85775e063a9971647 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 7 May 2013 15:05:14 -0400 Subject: [PATCH 2/6] sanity check to warn if cue_out - cue_in != end - start --- python_apps/pypo/pypofetch.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/python_apps/pypo/pypofetch.py b/python_apps/pypo/pypofetch.py index 20212be51..38a72f363 100644 --- a/python_apps/pypo/pypofetch.py +++ b/python_apps/pypo/pypofetch.py @@ -432,6 +432,7 @@ class PypoFetch(Thread): for key in media: media_item = media[key] if (media_item['type'] == 'file'): + self.sanity_check_media_item(media_item) fileExt = os.path.splitext(media_item['uri'])[1] dst = os.path.join(download_dir, unicode(media_item['id']) + fileExt) media_item['dst'] = dst @@ -455,6 +456,20 @@ class PypoFetch(Thread): try: self.cache_cleanup(media) except Exception, e: self.logger.error("%s", e) + #do basic validation of file parameters. Useful for debugging + #purposes + def sanity_check_media_item(self, media_item): + start = datetime.strptime(media_item['start'], "%Y-%m-%d-%H-%M-%S") + end = datetime.strptime(media_item['end'], "%Y-%m-%d-%H-%M-%S") + + length1 = (end - start).total_seconds() + length2 = media_item['cue_out'] - media_item['cue_in'] + + if abs(length2 - length1) > 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) From ad82b4ff98b096f8a66e3f4f91d1a628dd3ebb65 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 7 May 2013 15:36:21 -0400 Subject: [PATCH 3/6] throw exception if we get unexpected numbers of results in cc_pref --- airtime_mvc/application/models/Preference.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index f2eeee8a4..e96d4e888 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -38,7 +38,11 @@ class Application_Model_Preference $result = Application_Common_Database::prepareAndExecute($sql, $paramMap, 'column'); $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 @@ -80,7 +84,7 @@ class Application_Model_Preference } catch (Exception $e) { header('HTTP/1.0 503 Service Unavailable'); - Logging::info("Could not connect to database: ".$e->getMessage()); + Logging::info("Database error: ".$e->getMessage()); exit; } From 22b74126f936624ad2170693034ca4c415bf9e63 Mon Sep 17 00:00:00 2001 From: denise Date: Tue, 7 May 2013 16:16:32 -0400 Subject: [PATCH 4/6] CC-5087: Repeating show -> Same day by Month: Time slot of repeating instances aren't correct --- airtime_mvc/application/services/ShowService.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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; } From 9f6a1033ea54ea03faf90b930fa07107f6ef7a89 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 7 May 2013 16:21:34 -0400 Subject: [PATCH 5/6] CC-5109: Fix race-condition when updating cc_pref table --- airtime_mvc/application/common/Database.php | 6 ++++-- airtime_mvc/application/models/Preference.php | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) 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 e96d4e888..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,7 +38,11 @@ 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) { @@ -80,9 +87,15 @@ 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("Database error: ".$e->getMessage()); exit; From 84a05d83f79ce7898d5a9c8762c2d46c20a0e4d1 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 7 May 2013 17:17:48 -0400 Subject: [PATCH 6/6] CC-5071: Better RabbitMQ passwords new improved airtime ini file updater. Way less hacky --- install_minimal/include/AirtimeIni.php | 64 ++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 3 deletions(-) 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