prepare($sql); $stmt->bindParam(':key', $key); if ($stmt->execute()) { $result = $stmt->fetchColumn(0); } else { $msg = implode(',', $stmt->errorInfo()); throw new Exception("Error: $msg"); } if ($result == 1) { $sql = "UPDATE cc_stream_setting" ." SET value = :value, type = :type" ." WHERE keyname = :key"; } else { $sql = "INSERT INTO cc_stream_setting (keyname, value, type)" ." VALUES (:key, :value, :type)"; } $stmt = $con->prepare($sql); $stmt->bindParam(':key', $key); $stmt->bindParam(':value', $value); $stmt->bindParam(':type', $type); if ($stmt->execute()) { //do nothing } else { $msg = implode(',', $stmt->errorInfo()); throw new Exception("Error: $msg"); } } public static function getValue($key) { $con = Propel::getConnection(); //Check if key already exists $sql = "SELECT value FROM cc_stream_setting" ." WHERE keyname = :key"; $stmt = $con->prepare($sql); $stmt->bindParam(':key', $key); if ($stmt->execute()) { $result = $stmt->fetchColumn(0); } else { $msg = implode(',', $stmt->errorInfo()); throw new Exception("Error: $msg"); } return $result ? $result : ""; } /* Returns the id's of all streams that are enabled in an array. An * example of the array returned in JSON notation is ["s1", "s2", "s3"] */ public static function getEnabledStreamIds() { $con = Propel::getConnection(); $sql = "SELECT * " ."FROM cc_stream_setting " ."WHERE keyname LIKE '%_enable' " ."AND value='true'"; $ids = array(); $rows = Application_Common_Database::prepareAndExecute($sql, array(), 'all'); foreach ($rows as $row) { $ids[] = substr($row["keyname"], 0, strpos($row["keyname"], "_")); } return $ids; } /* Returns only global data as array*/ public static function getGlobalData() { $con = Propel::getConnection(); $sql = "SELECT * " ."FROM cc_stream_setting " ."WHERE keyname IN ('output_sound_device', 'icecast_vorbis_metadata')"; $rows = Application_Common_Database::prepareAndExecute($sql, array(), 'all'); $data = array(); foreach ($rows as $row) { $data[$row["keyname"]] = $row["value"]; } return $data; } /* Returns all information related to a specific stream. An example * of a stream id is 's1' or 's2'. */ public static function getStreamData($p_streamId) { $con = Propel::getConnection(); $streamId = pg_escape_string($p_streamId); $sql = "SELECT * " ."FROM cc_stream_setting " ."WHERE keyname LIKE '{$streamId}_%'"; $stmt = $con->prepare($sql); if ($stmt->execute()) { $rows = $stmt->fetchAll(); } else { $msg = implode(',', $stmt->errorInfo()); throw new Exception("Error: $msg"); } $data = array(); foreach ($rows as $row) { $data[$row["keyname"]] = $row["value"]; } return $data; } /* Similar to getStreamData, but removes all sX prefixes to * make data easier to iterate over */ public static function getStreamDataNormalized($p_streamId) { $con = Propel::getConnection(); $streamId = pg_escape_string($p_streamId); $sql = "SELECT * " ."FROM cc_stream_setting " ."WHERE keyname LIKE '{$streamId}_%'"; $stmt = $con->prepare($sql); if ($stmt->execute()) { $rows = $stmt->fetchAll(); } else { $msg = implode(',', $stmt->errorInfo()); throw new Exception("Error: $msg"); } $data = array(); foreach ($rows as $row) { list($id, $key) = explode("_", $row["keyname"], 2); $data[$key] = $row["value"]; } return $data; } public static function getStreamSetting() { $con = Propel::getConnection(); $sql = "SELECT *" ." FROM cc_stream_setting" ." WHERE keyname not like '%_error' AND keyname not like '%_admin_%'"; $rows = Application_Common_Database::prepareAndExecute($sql, array(), 'all'); $exists = array(); foreach ($rows as $r) { if ($r['keyname'] == 'master_live_stream_port') { $exists['master_live_stream_port'] = true; } elseif ($r['keyname'] == 'master_live_stream_mp') { $exists['master_live_stream_mp'] = true; } elseif ($r['keyname'] == 'dj_live_stream_port') { $exists['dj_live_stream_port'] = true; } elseif ($r['keyname'] == 'dj_live_stream_mp') { $exists['dj_live_stream_mp'] = true; } } if (!isset($exists["master_live_stream_port"])) { $rows[] = array("keyname" =>"master_live_stream_port", "value"=>self::getMasterLiveStreamPort(), "type"=>"integer"); } if (!isset($exists["master_live_stream_mp"])) { $rows[] = array("keyname" =>"master_live_stream_mp", "value"=>self::getMasterLiveStreamMountPoint(), "type"=>"string"); } if (!isset($exists["dj_live_stream_port"])) { $rows[] = array("keyname" =>"dj_live_stream_port", "value"=>self::getDjLiveStreamPort(), "type"=>"integer"); } if (!isset($exists["dj_live_stream_mp"])) { $rows[] = array("keyname" =>"dj_live_stream_mp", "value"=>self::getDjLiveStreamMountPoint(), "type"=>"string"); } return $rows; } private static function saveStreamSetting($key, $value) { $stream_setting = CcStreamSettingQuery::create()->filterByDbKeyName($key)->findOne(); if (is_null($stream_setting)) { throw new Exception("Keyname $key does not exist!"); } $stream_setting->setDbValue($value); $stream_setting->save(); } /* * function that take all the information of stream and sets them. * This is used by stream setting via UI. * * @param $data - array that contains all the data. $data is [][] which * contains multiple stream information */ public static function setStreamSetting($data) { foreach ($data as $key => $d) { if ($key == "output_sound_device" || $key == "icecast_vorbis_metadata") { $v = ($d == 1) ? "true" : "false"; self::saveStreamSetting($key, $v); } elseif ($key == "output_sound_device_type") { self::saveStreamSetting($key, $d); } elseif (is_array($d)) { $temp = explode('_', $key); $prefix = $temp[0]; foreach ($d as $k => $v) { $keyname = $prefix . "_" . $k; if ($k == 'enable') { $v = $d['enable'] == 1 ? 'true' : 'false'; } $v = trim($v); if ($k != 'admin_pass') { self::saveStreamSetting($keyname, $v); /* We use 'xxxxxx' as the admin password placeholder so we * only want to save it when it is a different string */ } elseif ($v != 'xxxxxx') { self::saveStreamSetting($keyname, $v); } } } } } /* * Sets indivisual stream setting. * * $data - data array. $data is []. * TODO: Make this SQL a prepared statement! * * Do not remove this function. It is called by airtime-system.php */ public static function setIndividualStreamSetting($data) { foreach ($data as $keyname => $v) { $sql = "UPDATE cc_stream_setting SET value=:v WHERE keyname=:keyname"; $map = array(":v" => $v, ":keyname"=>$keyname); $res = Application_Common_Database::prepareAndExecute($sql, $map, Application_Common_Database::EXECUTE); } } /* * Stores liquidsoap status if $boot_time > save time. * save time is the time that user clicked save on stream setting page */ public static function setLiquidsoapError($stream_id, $msg, $boot_time=null) { $con = Propel::getConnection(); $update_time = Application_Model_Preference::GetStreamUpdateTimestemp(); if ($boot_time == null || $boot_time > $update_time) { $keyname = "s".$stream_id."_liquidsoap_error"; $sql = "SELECT COUNT(*) FROM cc_stream_setting" ." WHERE keyname = :keyname"; $stmt = $con->prepare($sql); $stmt->bindParam(':keyname', $keyname); if ($stmt->execute()) { $result= $stmt->fetchColumn(0); } else { $msg = implode(',', $stmt->errorInfo()); throw new Exception("Error: $msg"); } if ($result == 1) { $sql = "UPDATE cc_stream_setting" ." SET value = :msg" ." WHERE keyname = :keyname"; } else { $sql = "INSERT INTO cc_stream_setting (keyname, value, type)" ." VALUES (:keyname, :msg, 'string')"; } $stmt = $con->prepare($sql); $stmt->bindParam(':keyname', $keyname); $stmt->bindParam(':msg', $msg); if ($stmt->execute()) { //do nothing } else { $msg = implode(',', $stmt->errorInfo()); throw new Exception("Error: $msg"); } } } public static function getLiquidsoapError($stream_id) { $con = Propel::getConnection(); $keyname = "s".$stream_id."_liquidsoap_error"; $sql = "SELECT value FROM cc_stream_setting" ." WHERE keyname = :keyname"; $stmt = $con->prepare($sql); $stmt->bindParam(':keyname', $keyname); if ($stmt->execute()) { $result= $stmt->fetchColumn(0); } else { $msg = implode(',', $stmt->errorInfo()); throw new Exception("Error: $msg"); } return ($result !== false) ? $result : null; } public static function getStreamEnabled($stream_id) { $con = Propel::getConnection(); $keyname = "s" . $stream_id . "_enable"; $sql = "SELECT value FROM cc_stream_setting" ." WHERE keyname = :keyname"; $stmt = $con->prepare($sql); $stmt->bindParam(':keyname', $keyname); if ($stmt->execute()) { $result= $stmt->fetchColumn(0); } else { $msg = implode(',', $stmt->errorInfo()); throw new Exception("Error: $msg"); } return ($result != 'false'); } /* * Only returns info that is needed for data collection * returns array('s1'=>array(keyname=>value)) */ public static function getStreamInfoForDataCollection() { $con = Propel::getConnection(); $out = array(); $enabled_stream = self::getEnabledStreamIds(); foreach ($enabled_stream as $stream) { $keys = array("{$stream}_output", "{$stream}_type", "{$stream}_bitrate", "{$stream}_host"); $key_csv = implode(',', $keys); $sql = "SELECT keyname, value FROM cc_stream_setting" ." WHERE keyname IN (:key_csv)"; $stmt = $con->prepare($sql); $stmt->bindParam(':key_csv', $key_csv); if ($stmt->execute()) { $rows = $stmt->fetchAll(); } else { $msg = implode(',', $stmt->errorInfo()); throw new Exception("Error: $msg"); } $info = array(); foreach ($rows as $r) { $temp = explode("_", $r['keyname']); $info[$temp[1]] = $r['value']; $out[$stream] = $info; } } return $out; } public static function setMasterLiveStreamPort($value) { self::setValue("master_live_stream_port", $value, "integer"); } public static function getMasterLiveStreamPort() { return self::getValue("master_live_stream_port"); } public static function setMasterLiveStreamMountPoint($value) { self::setValue("master_live_stream_mp", $value, "string"); } public static function getMasterLiveStreamMountPoint() { return self::getValue("master_live_stream_mp"); } public static function setDjLiveStreamPort($value) { self::setValue("dj_live_stream_port", $value, "integer"); } public static function getDjLiveStreamPort() { return self::getValue("dj_live_stream_port"); } public static function setDjLiveStreamMountPoint($value) { self::setValue("dj_live_stream_mp", $value, "string"); } public static function getDjLiveStreamMountPoint() { return self::getValue("dj_live_stream_mp"); } public static function getAdminUser($stream){ return self::getValue($stream."_admin_user"); } public static function setAdminUser($stream, $v){ self::setValue($stream."_admin_user", $v, "string"); } public static function getAdminPass($stream){ return self::getValue($stream."_admin_pass"); } public static function setAdminPass($stream, $v){ self::setValue($stream."_admin_pass", $v, "string"); } public static function getOffAirMeta(){ return self::getValue("off_air_meta"); } public static function setOffAirMeta($offAirMeta){ self::setValue("off_air_meta", $offAirMeta, "string"); } public static function GetAllListenerStatErrors(){ $sql = "SELECT * FROM cc_stream_setting WHERE keyname like :p1"; $mounts = Application_Common_Database::prepareAndExecute($sql, array(':p1'=>'%_mount')); $mps = array(); foreach($mounts as $mount) { $mps[] = "'" .$mount["value"] . "_listener_stat_error'"; } $in = implode(",", $mps); $sql = "SELECT * FROM cc_stream_setting WHERE keyname IN ( $in )"; return Application_Common_Database::prepareAndExecute($sql, array()); } public static function SetListenerStatError($key, $v) { self::setValue($key, $v, 'string'); } }